【问题标题】:Solving heat equation with python (NumPy)用 python (NumPy) 求解热方程
【发布时间】:2018-03-24 11:11:59
【问题描述】:

我求解一根金属棒的热方程,因为一端保持在 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])

应该修改吗?

【问题讨论】:

  • 这是一个编程站点,而不是物理站点,因此您需要为您显示的代码和您想要的代码提供相关方程。我们中的许多人不明白“一端是绝缘的(不是助焊剂)”是什么意思。
  • 你的热量方程不正确。 LHS 是∂u/∂t,而不是∂u/∂x。否则你的热量根本不会随时间变化,也没有通量。
  • 关键字为“诺依曼边界条件”。
  • 由于您使用的是有限差分近似,请参阅this。您所要做的就是弄清楚有限差分逼近中的边界条件是什么,然后当有限差分逼近达到这些条件时将表达式替换为0。这不是真正的python 或实现问题,因为在尝试编码之前您还没有弄清楚 FD 离散化(或者至少没有在问题中显示更改后的 BC 的离散化) .
  • 看看the example in the scipy.integrate tutorial。它显示了具有 Neumann(“无通量”)边界条件的 PDE 系统的空间离散化。 (时间演化使用scipy.integrate.odeint解决;教程是“线的方法”的一个例子。)

标签: python numpy numerical-methods


【解决方案1】:

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

鬼点允许我们使用对称有限差分逼近边界处的导数,即(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

【讨论】:

  • 非常微妙的解决方案。它解决了我的问题,但出于好奇有一个问题。此代码适用于u_x=0 的边界(无通量)。它对u_x= constant(恒定通量)等非零纽曼边界有何作用?原则上,这两种情况应该是相似的,因为一般来说前者属于后者的范畴。
  • 如果 u_x 是 A,那么 (T[n, j+1] - T[n, j-1]) / (2*dx) = A 意味着 T[n, j+1]T[n, j-1] + 2*A*dx,所以这是替换最后一行公式中 T[n, j+1] 的值。
  • 很抱歉有太多问题,但我对这个解决方案的简单性和理解整个画面的愚蠢感到着迷。因此,我尝试检查不同的边界条件。一侧的通量恒定而另一侧没有通量的情况如何? u_x(0,t)=Au_x(l,t)=0?当T0 不是联系人值时,我很难理解代码是如何工作的。
  • 这种情况下没有T0。数组最初可以填充任何东西,比如零。然后填充初始值。之后,使用扩散方程填充下一行。在左边界,当j为0时,指的是j=-1的鬼点。由于边界条件,当 j 为 0 时,T[n, j-1] 被 T[n, j+1] - 2*A*dx 替换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
相关资源
最近更新 更多