我正在尝试在Python中实现一维热方程的FTCS算法。
import numpy as np
L = 1 #Length of rod in x direction
k = 0.3 #Thermal conductivity of rod
tmax = 5 #how many seconds
nx = 100 #number of spacial steps
nt = 100; #number of time steps
xi = np.linspace(0,L,nx)
ti = np.linspace(0,tmax,nt)
dx = L/(nx-1)
dt = tmax/(nt-1)
r = k*dt/(dx)**2
r2 = 1-2*r
u=np.zeros((nt,nx))
#IC
phi = 100;
for x in range(0,nx):
u[0][x] = phi
#BC
for t in range(0,nt):
u[t][0] = 0;
u[t][nx-1] = 0
#FTCS Algorithm
for t in range(0,nt-1): #timestep
for x in range(1,nx-2):
u[t+1][x] = r*(u[t][x-1]+ u[t][x+1]) + r2*(u[t][x])
然而,考虑到我的初始条件为100,我没有得到u [t] [x] = u(x,t)的合理值。即它们爆炸并给我像'4.11052068e + 221'这样的愚蠢值我参与的一些糟糕的编程实践正在摧毁算法?或者我刚刚错误地实现了算法?
编辑:我想我已经知道这是因为算法是稳定的,当且仅当r < 1/2。数字刚刚爆炸,因为我的r约为2.5或者其他什么,但如果有人能看到任何其他错误让我知道!!答案 0 :(得分:1)
原始问题
FTCS方案的稳定性取决于常数r
的大小。如果r<1/2
,则每个步骤引入的舍入误差将呈指数衰减。如果r>1/2
,则这些舍入错误将呈指数级增长。 (正如您在编辑中提到的那样)。
小错误
dx = L/nx
和dt = tmax/nt
。 (如果这让您感到困惑,请想象nx = 2
和L = 1
的情况......
然后dx = 0.5
)。L
和tmax
应为浮点数。 (即 - L = 1.0
)。u
。确保for循环位置延伸到nx-1
而不是nx-2
。需要考虑的事项
您可以考虑使用实际值/单位来表示时间,长度,导热系数和初始温度。
当您应用边界条件时(在注释#BC下),只有时间t=0
的值u
非零,因此您无需迭代所有时间步骤。
虽然您需要迭代时间(因此时间for
循环),但您实际上可以对空间导数进行矢量化。您可以使用以下内容替换for循环:
for t in range(0, nt-1):
u[t+1, 1:nx-1] = r*(u[t,0:nx-2] + u[t,2:]) + r2*(u[t,1:nx-1])