写一个伪谱法求解二阶微分方程组的python代码
伪谱法是一种求解微分方程组的数值方法,可以用来求解各种类型的二阶微分方程组。以下是一个简单的python代码实现伪谱法求解二阶微分方程组:
import numpy as np
from scipy.fftpack import fft, ifft
def pseudo_spectral_method(t, y0, f, A, B, N):
# t: 时间向量
# y0: 初值向量
# f: 右侧函数
# A, B: 二阶微分方程组的系数矩阵
# N: 离散化后的点数
h = t[1] - t[0] # 步长
w = np.linspace(0, np.pi/h, N) # 频率向量
z = np.exp(-1j*w*h) # 转移矩阵
I = np.eye(2) # 单位矩阵
# 构造伪谱法的系数矩阵
L = np.array([[0, 1], [-A/B, -f/B]])
# 初始值
y = np.zeros((2, N), dtype=np.complex128)
y[:, 0] = y0
# 递推求解
for i in range(1, len(t)):
# 将y转换到频域
y_hat = fft(y[:, i-1])
# 用转移矩阵更新y_hat
y_hat = z*y_hat - z**2*L.dot(y_hat)
# 将y_hat转换到时域
y[:, i] = np.real(ifft(y_hat))
return y
使用示例:
# 求解 y'' + A*y' + B*y = f(t)
A = 0.1
B = 1
f = lambda t: 2*np.sin(t)
y0 = np.array([0, 1])
t = np.linspace(0, 10, 1000)
N = 100
y = pseudo_spectral_method(t, y0, f(t), A, B, N)
import matplotlib.pyplot as plt
plt.plot(t, y[0])
plt.plot(t, y[1])
plt.show()
原文地址: https://www.cveoy.top/t/topic/bxu4 著作权归作者所有。请勿转载和采集!