伯格斯方程(Burgers’ Equation)或称为贝特曼-伯格斯方程(Bateman–Burgers )是一个对流-扩散方程,出现在应用数学的各个领域,如流体力学、非线性声学、空气动力学等。
理论基础
一维伯格斯方程:
可以看到伯格斯方程由之前介绍过的一维非线性对流和扩散项所组成。
因此一维非线性对流方程也可称为无粘伯格斯方程。
因此可以使用前文同样的离散方法,对时间导数使用前向差分,对空间导数使用后向差分,对二阶导数使用中心差分。
调整格式:
令初始条件为:
在周期性边界条件:
伯格斯方程存在解析解:
代码实现
首先使用sympy库符号运算求解方程的解析解
得到解析解的图像:
接着我们求解数值解:
plt.ion()
for n in range(nt):
plt.cla()
un = u.copy()
for i in range(1, nx - 1):
u[i] = un[i] - un[i] * dt / dx * (un[i] - un[i - 1]) + nu * dt / dx ** 2 * (un[i + 1] - 2 * un[i] + un[i - 1])
u[0] = un[0] - un[0] * dt / dx * (un[0] - un[-2]) + nu * dt / dx ** 2 * (un[1] - 2 * un[0] + un[-2]) # 计算第一个点
u[-1] = u[0]
plt.plot(x, u_analytical,label='Analytical')
plt.plot(x, u,label='Computational')
plt.legend()
plt.title("time: %.4f s" % (n * dt))
plt.pause(0.01)
plt.ioff()
plt.show()
结果为:
迭代求解过程:
误差来源
伯格斯方程数值解与解析解的差异来源主要有以下几点: