python怎么写方程条件_热传导方程之显示差分算法(python源码)

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博客