用 python 求解热方程 (NumPy)
Solving heat equation with python (NumPy)
我求解一根金属棒的热方程,因为一端保持在 100 °C,另一端保持在 0 °C
import numpy as np
import matplotlib.pyplot as plt
dt = 0.0005
dy = 0.0005
k = 10**(-4)
y_max = 0.04
t_max = 1
T0 = 100
def FTCS(dt,dy,t_max,y_max,k,T0):
s = k*dt/dy**2
y = np.arange(0,y_max+dy,dy)
t = np.arange(0,t_max+dt,dt)
r = len(t)
c = len(y)
T = np.zeros([r,c])
T[:,0] = T0
for n in range(0,r-1):
for j in range(1,c-1):
T[n+1,j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j+1])
return y,T,r,s
y,T,r,s = FTCS(dt,dy,t_max,y_max,k,T0)
plot_times = np.arange(0.01,1.0,0.01)
for t in plot_times:
plt.plot(y,T[t/dt,:])
如果改变 Neumann 边界条件,因为一端是绝缘的(不是通量),
那么,计算项
T[n+1,j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j+1])
应该修改?
诺伊曼边界条件的一种典型方法是想象 "ghost point" 超越域一步,并使用边界条件计算它的值;然后正常处理(使用 PDE)网格内的点,包括 Neumann 边界。
鬼点允许我们对边界处的导数使用对称有限差分近似,即(T[n, j+1] - T[n, j-1]) / (2*dy)
如果y是space多变的。 Non-symmetric 近似 (T[n, j] - T[n, j-1]) / dy
不涉及鬼点,精度要低得多:它引入的误差比 PDE 本身的离散化所涉及的误差差一个数量级。
因此,当 j 是 T 的最大可能索引时,边界条件表示“T[n, j+1]
”应理解为 T[n, j-1]
,这就是下面所做的。
for j in range(1, c-1):
T[n+1,j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j+1]) # as before
j = c-1
T[n+1, j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j-1]) # note the last term here
我求解一根金属棒的热方程,因为一端保持在 100 °C,另一端保持在 0 °C
import numpy as np
import matplotlib.pyplot as plt
dt = 0.0005
dy = 0.0005
k = 10**(-4)
y_max = 0.04
t_max = 1
T0 = 100
def FTCS(dt,dy,t_max,y_max,k,T0):
s = k*dt/dy**2
y = np.arange(0,y_max+dy,dy)
t = np.arange(0,t_max+dt,dt)
r = len(t)
c = len(y)
T = np.zeros([r,c])
T[:,0] = T0
for n in range(0,r-1):
for j in range(1,c-1):
T[n+1,j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j+1])
return y,T,r,s
y,T,r,s = FTCS(dt,dy,t_max,y_max,k,T0)
plot_times = np.arange(0.01,1.0,0.01)
for t in plot_times:
plt.plot(y,T[t/dt,:])
如果改变 Neumann 边界条件,因为一端是绝缘的(不是通量),
那么,计算项
T[n+1,j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j+1])
应该修改?
诺伊曼边界条件的一种典型方法是想象 "ghost point" 超越域一步,并使用边界条件计算它的值;然后正常处理(使用 PDE)网格内的点,包括 Neumann 边界。
鬼点允许我们对边界处的导数使用对称有限差分近似,即(T[n, j+1] - T[n, j-1]) / (2*dy)
如果y是space多变的。 Non-symmetric 近似 (T[n, j] - T[n, j-1]) / dy
不涉及鬼点,精度要低得多:它引入的误差比 PDE 本身的离散化所涉及的误差差一个数量级。
因此,当 j 是 T 的最大可能索引时,边界条件表示“T[n, j+1]
”应理解为 T[n, j-1]
,这就是下面所做的。
for j in range(1, c-1):
T[n+1,j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j+1]) # as before
j = c-1
T[n+1, j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j-1]) # note the last term here