下面的代码解决了1D热方程,该方程表示杆的末端保持零温度,初始条件为10 * np.sin(np.pi * x)。
Dirichlet边界条件(两端零温度)如何适用于此计算?我被告知矩阵A的上部,下部行包含两个非零元素,缺少的第三个元素是 Dirichlet条件。但我不明白这种情况会影响计算的机制。如果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)
答案 0 :(得分:5)
让我们看一个简单的例子。我们假设N = 3
,即三个内点,但我们首先还要在矩阵D2
中包含描述近似二阶导数的边界点:
1 / 1 -2 1 0 0 \
D2 = --- | 0 1 -2 1 0 |
h^2 \ 0 0 1 -2 1 /
第一行表示x_1
处的近似二阶导数为1/h^2 * (u_0 - 2*u_1 + u_2)
。我们知道u_0 = 0
,由于Dirichlet边界条件的同质性,所以我们可以简单地从等式中省略它,并得到矩阵的相同结果
1 / 0 -2 1 0 0 \
D2 = --- | 0 1 -2 1 0 |
h^2 \ 0 0 1 -2 0 /
由于u_0
和u_{n+1}
不是真正的未知数 - 它们已知为零 - 我们可以完全从矩阵中删除它们,我们得到
1 / 2 1 0 \
D2 = --- | 1 -2 1 |
h^2 \ 0 1 -2 /
矩阵中缺少的条目实际上对应于边界条件为零的事实。
答案 1 :(得分:0)
我被告知上排,下排 矩阵A包含两个非零 元素和缺少的第三个 element(即零)是 Dirichlet条件。
我不确定你被告知了什么,但这就是我对这个问题的了解。
Dirichlet边界条件确定了电位的值(在这种情况下为温度)。 Neumann边界条件将指定一个点处的通量或一阶导数。如果在地表有对流边界条件,则需要这样做。
对于Dirichlet边界条件的处理,您可以在不考虑边界条件的情况下制定系统矩阵。如果您在给定节点处具有固定温度,则可以通过以下方式处理: