在 python 中将 Neumann 边界应用于 Crank-Nicolson 解决方案

计算科学 数值分析 有限差分 Python 边界条件 曲柄尼科尔森
2021-12-13 02:59:28

考虑热方程

ut=κuxx
边界条件为
u(x,0)=0u(0,t)=100u(l,t)=0
pyton的数值分析可以用

import numpy as np
import matplotlib.pyplot as plt
from scipy.sparse import diags

def Crank_Nicolson(dy,ny,dt,nt,k,T,ntout):
    Tout = []
    T0 = T[0]
    T1 = T[-1]
    s = k*dt/dy**2
    A = diags([-0.5*s, 1+s, -0.5*s], [-1, 0, 1], shape=(ny-2, ny-2)).toarray() 
    B1 = diags([0.5*s, 1-s, 0.5*s],[-1, 0, 1], shape=(ny-2, ny-2)).toarray()
    for n in range(1,nt):
        Tn = T
        B = np.dot(Tn[1:-1],B1) 
        B[0] = B[0]+0.5*s*(T0+T0)
        B[-1] = B[-1]+0.5*s*(T1+T1)
        T[1:-1] = np.linalg.solve(A,B)
        if n % int(nt/float(ntout)) == 0 or n==nt-1:
            Tout.append(T.copy())
    return Tout,s

dt = 0.01
dy = 0.001
k = 10**(-4)
y_max = .1
y = np.arange(0,y_max+dy,dy) 
ny = len(y)
nt = 1000

T = np.zeros((ny,))
T[0] = 100
Tout,s = Crank_Nicolson(dy,ny,dt,nt,k,T,10)

for T in Tout:
    plt.plot(y,T)    
plt.show()

纽曼边界如何

ux(l,t)=0
可以在这段代码中实现吗?

这是将棒材的一端保持在 100 °C 温度而另一端绝缘的情况。

1个回答

边界条件通常令人烦恼,并且经常会占据数字代码的惊人比例。如何实现它们取决于您选择的数值方法。有限差分方案通常发现 Dirichlet 条件比 Neumann 条件更自然,而适用于扩散问题的有限元和有限方法通常相反。

一种适用于您的情况的标准技术是引入一个额外的概念上虚拟自由度或“鬼”点位于x=l+Δx,然后将模型方程应用于x=l在表格中

du(l)dt=κ(l)u(l+Δx)2u(l)+u(lΔx)Δx2
以及边界条件x=l,形式为
u(l+Δx,t)u(lΔx,t)2Δx=0.

请注意,在x=l+Δx,所以仍然有与未知数一样多的方程,所以系统仍然是良定的。事实上,大多数实际的实现都将边界条件重新排列为

u(l+Δx)=u(lΔx),
只需代入前面的等式即可得到
du(l)dt=κ(l)2u(lΔx)2u(l)Δx2.
.