import numpy as np
import matplotlib.pyplot as plt
Crank_Nicolson
def Crank_Nicolson(All_T, m, n, u):
# 初始化系数矩阵和参数数组
C = np.eye(m - 1, k=0) (1 - u) + np.eye(m - 1, k=1) (0.5 u) + np.eye(m - 1, k=-1) (0.5 u)
a = np.ones(m - 1) (-0.5 u)
a[0] = 0
b = np.ones(m - 1) (1 + u)
c = np.ones(m - 1) (-0.5 u)
c[-1] = 0
def thomas_algorithm(a, b, c, F):
"""
使用 Thomas 算法求解三对角线性系统 Ax = F。
for k in range(0, n):
# 初始化已知值数组
F = np.zeros(m - 1) #已知n层中的数值,有m-1
F[0] = u * 0.5 * (All_T[k, 0] + All_T[k + 1, 0])
F[-1] = u * 0.5 * (All_T[k, m] + All_T[k + 1, m])
F = C @ All_T[k, 1:m] + F # @ 是矩阵乘法
All_T[k + 1, 1:-1] = thomas_algorithm(a, b, c, F)
return All_T
Parameters: - a, b, c: 三对角矩阵的三个对角线的系数
- F: 右侧向量
Returns: - x: 解向量
""" n = len(b)
# Forward elimination
beta = np.zeros(n)
y = np.zeros(n)
beta[0] = c[0] / b[0]
y[0] = F[0] / b[0]
for i in range(1, n):
beta[i] = c[i] / (b[i] - a[i] * beta[i - 1])