一维常系数对流方程的学习——来自流沙公众号
认识:
1、时间步长越小越靠后移动;网格越小则波的形状越一致,波形失真在减小,引出Courant数:u*dt/dx<sigma;
2、对numpy中的ones()、linspace()、zeros()有基础认识;
3、再次练习了matplotlib中的pyplot。
4、明白了一维方程编程的简单运算,基础
import numpy as np
# numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。
import matplotlib.pyplot as plt
def linearconv(nx):
dx = 2/(nx - 1) # 空间网格步长,x方向总长度为2
nt = 25 # 总的时间步长
sigma = 0.8 # Courant数
c = 1 # 常数
dt = sigma * dx / c # 时间步长
# 指定初始条件
u = np.ones(nx)
u[int(0.5/dx):int(1/dx + 1)] = 2 # 这一行实际上是制造了一个方波(0.5--1)
# 下面将初始条件画出来
plt.plot(np.linspace(0,2,nx),u,'r',linewidth=3,label = 'init') # linspace用于产生x1,x2之间的N点行矢量,其中x1、x2、N分别为起始值、终止值、元素个数
# 计算25个时间步后的波长
un = np.ones(nx)
for n in range(nt):
un = u.copy() # 后面的计算会改变u,故将u拷贝到un
for i in range(1,nx):
u[i] = un[i] - c * dt / dx * (un[i] - un[i-1])
plt.plot(np.linspace(0,2,nx),u,'b',linewidth = 3, label = 'current')
plt.xlabel("distance")
plt.ylabel("speed")
plt.legend()
plt.show()
linearconv(10001)
# 时间步长越小越靠后移动;网格越小则波的形状越一致,波形失真在减小,故引出了Courant数:u*dt/dx<sigma