以下のコードは、初期条件10 * np.sin(np.pi * x)で両端がゼロ温度に保たれているロッドを表す1D熱方程式を解きます。
この計算では、ディリクレ境界条件(両端の温度がゼロ)はどのように機能しますか?行列Aの上下の行には、ゼロ以外の2つの要素が含まれており、欠落している3番目の要素はディリクレ条件であると言われました。しかし、この条件がどのメカニズムで計算に影響するのかわかりません。Aに要素がない場合、u_{0}またはu_{n}をゼロにするにはどうすればよいですか?
以下の有限差分法では、Crank-Nicholsonを使用しています。
import numpy as np
import scipy.linalg
# Number of internal points
N = 200
# Calculate Spatial Step-Size
h = 1/(N+1.0)
k = h/2
x = np.linspace(0,1,N+2)
x = x[1:-1] # get rid of the '0' and '1' at each end
# Initial Conditions
u = np.transpose(np.mat(10*np.sin(np.pi*x)))
# second derivative matrix
I2 = -2*np.eye(N)
E = np.diag(np.ones((N-1)), k=1)
D2 = (I2 + E + E.T)/(h**2)
I = np.eye(N)
TFinal = 1
NumOfTimeSteps = int(TFinal/k)
for i in range(NumOfTimeSteps):
# Solve the System: (I - k/2*D2) u_new = (I + k/2*D2)*u_old
A = (I - k/2*D2)
b = np.dot((I + k/2*D2), u)
u = scipy.linalg.solve(A, b)