边界条件在热力方程和Crank-Nicholson有限差分解中的应用

BBD*_*Sys 6 python math scientific-computing scipy differential-equations

下面的代码解决了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)
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 5

我们来看一个简单的例子.我们假设N = 3,即三个内点,但我们首先还会在矩阵中包含D2描述近似二阶导数的边界点:

      1  /  1 -2  1  0  0 \
D2 = --- |  0  1 -2  1  0 |
     h^2 \  0  0  1 -2  1 /
Run Code Online (Sandbox Code Playgroud)

第一行表示的近似二阶导数在x_11/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 /
Run Code Online (Sandbox Code Playgroud)

由于u_0并且u_{n+1}不是真正的未知数 - 它们已知为零 - 我们可以完全从矩阵中删除它们,我们得到

      1  /  2  1  0 \
D2 = --- |  1 -2  1 |
     h^2 \  0  1 -2 /
Run Code Online (Sandbox Code Playgroud)

矩阵中缺失的条目实际上对应于边界条件为零的事实.

  • @ user423805 - 是的.如果强加的边界条件是你不能轻易构造减少的A的形式,那么你必须考虑完整的A和x.在这种(非常常见的)情况下,x的值不是对应于实际数据而是对应于应用边界条件的方式通常被称为鬼影单元或保护单元或者单元格(或节点,或区域,或者你有什么). (2认同)