N 空间方向的网格数
M 时间方向的网格数
T 最大时间期限
X 最大空间范围
U 用来存储差分网格点上值得矩阵
这里我们做正向迭代:迭代时k=0,1…M−1, 代表我们从0时刻运行至T
pylab.figure(figsize = (12,6))
pylab.plot(xArray, U[:,0])
pylab.plot(xArray, U[:, int(0.10/ dt)])
pylab.plot(xArray, U[:, int(0.20/ dt)])
pylab.plot(xArray, U[:, int(0.50/ dt)])
pylab.xlabel('$x$', fontsize = 15)
pylab.ylabel(r'$U(dot, tau)$', fontsize = 15)
pylab.title(u'一维热传导方程', fontproperties = font)
pylab.legend([r'$tau = 0.$', r'$tau = 0.10$', r'$tau = 0.20$', r'$tau = 0.50$'], fontsize = 15)
也可以通过三维立体图看一下整体的热传导过程:
3.组装起来
就像在前一天二叉树建模中介绍的一样,我们这里会以面向对象的方式重新封装分散的代码,方便复用。首先是方程的描述:
下面的是显式差分格式的描述:
有了以上的部分,现在整个过程可以简单的通过初始化和一行关于roll_back的调用完成:
我们可以获取与之前相同的图像:
4.什么时候显式格式会失败?
显式格式不能任意取时间和空间的网格点数,即M与N不能随意取值。我们称显式格式为条件稳定。特别地,需要满足所谓CFL条件(Courant–Friedrichs–Lewy):
例如:
M = 2500
N = 25
则:
M = 1200
N = 25
则:
下面的代码计算在第二种情形下的网格点计算过程:
我们可以通过下图看到,在CFL条件无法满足的情况下,数值误差累计的结果(特别注意后面的锯齿):
这个问题请在下一篇中进行讨论,引出无条件稳定格式:隐式差分格式(Implicit)。
本文转载自csdn博客