热力方程的FTCS算法

时间:2017-11-06 02:56:59

标签: python physics pde

我正在尝试在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或者其他什么,但如果有人能看到任何其他错误让我知道!!

1 个答案:

答案 0 :(得分:1)

原始问题

FTCS方案的稳定性取决于常数r的大小。如果r<1/2,则每个步骤引入的舍入误差将呈指数衰减。如果r>1/2,则这些舍入错误将呈指数级增长。 (正如您在编辑中提到的那样)。

小错误

  1. dx = L/nxdt = tmax/nt。 (如果这让您感到困惑,请想象nx = 2L = 1的情况...... 然后dx = 0.5)。
  2. Ltmax应为浮点数。 (即 - L = 1.0)。
  3. 您没有更新杆上倒数第二个位置的温度u。确保for循环位置延伸到nx-1而不是nx-2
  4. 需要考虑的事项

    1. 您可以考虑使用实际值/单位来表示时间,长度,导热系数和初始温度。

    2. 当您应用边界条件时(在注释#BC下),只有时间t=0的值u非零,因此您无需迭代所有时间步骤。

    3. 虽然您需要迭代时间(因此时间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])