边界条件在热方程和CrankNicholson有限差分解中的应用

2024-04-30 02:32:51 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码解决了一维热方程,该方程表示一根杆,其末端保持在零温度,初始条件为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)

Tags: oftheimport元素nppiscipysin