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

标签 python numpy numerical-methods

我求解一根金属棒的热方程,因为一端保持在 100 °C,另一端保持在 0 °C,如下所示

enter image description here

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 边界条件,因为一端是绝缘的(不是通量),

enter image description here

那么,如何计算项

T[n+1,j] = T[n,j] + s*(T[n,j-1] - 2*T[n,j] + T[n,j+1])

应该修改吗?

最佳答案

Neumann 边界条件的典型方法是想象域外一步的“鬼点”,并使用边界条件计算它的值;然后正常处理(使用 PDE)网格内的点,包括 Neumann 边界。

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

相关文章:

python - 在 Pandas 中广播列表

matlab - 雅可比迭代没有结束

matrix - 使用 CUDA 计算数百个小矩阵的特征值/特征向量

python - 在收件人或发件人的姓名中使用变音符号从 Python 发送电子邮件

python - 为什么 time.sleep() 准确性受 Chrome 影响?

python - 如何根据给定的标准填写一些字段?

python - 使用Python中不同大小网格点的数据生成3D曲面图

python - 索引访问方法叫什么?

python - 获取另一个 numpy 数组中一个 numpy 数组的索引

c - 集成在C代码中,数值方法