我解决了一根金属棒的热方程,因为一端保持在100°C,另一端保持在0°C

python - 用python解热方程(NumPy)-LMLPHP

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,:])

如果更改诺伊曼边界条件为一端绝缘(不是磁通),

python - 用python解热方程(NumPy)-LMLPHP

然后,如何计算项
T[n+1,j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j+1])

应该修改吗?

最佳答案

解决Neumann边界条件的一种典型方法是想象一个“重影点”超出域1步,并使用边界条件计算出它的值。然后正常(使用PDE)处理网格内的点,包括诺伊曼边界。

重影点允许我们对边界处的导数使用对称有限差分近似,如果y是空间变量,则为(T[n, j+1] - T[n, j-1]) / (2*dy)。不涉及重影点的非对称近似(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

关于python - 用python解热方程(NumPy),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49463985/

10-12 21:12