用有限差分法求解⼀维波动⽅程∂u/∂t+c∂u/∂x=a∂²u/∂x²,初始条件为u(x, 0) = sin x的思路
时间: 2024-03-04 14:48:20 浏览: 146
首先,我们可以使用有限差分法将偏微分方程离散化,将其转化为一个差分方程组。具体地,我们可以使用中心差分法来近似偏导数,即
∂u/∂t ≈ (u(i, j+1) - u(i, j)) / Δt
∂u/∂x ≈ (u(i+1, j) - u(i-1, j)) / (2Δx)
∂²u/∂x² ≈ (u(i+1, j) - 2u(i, j) + u(i-1, j)) / Δx²
将上述近似带入原方程,得到
(u(i, j+1) - u(i, j)) / Δt + c(u(i+1, j) - u(i-1, j)) / (2Δx) = a(u(i+1, j) - 2u(i, j) + u(i-1, j)) / Δx²
移项,整理得到
u(i, j+1) = u(i, j) + Δt(c/Δx)(u(i+1, j) - u(i-1, j)) + Δt(a/Δx²)(u(i+1, j) - 2u(i, j) + u(i-1, j))
这个差分方程可以用来递推求解波动方程在给定初始条件下的解。对于初始条件 u(x, 0) = sin x,我们可以使用下列代码进行初始化:
```python
import numpy as np
# 离散化参数
c = 1.0
a = 1.0
L = 2 * np.pi # 区间长度
T = 2 * np.pi # 时间长度
dx = 0.1 # 空间步长
dt = 0.05 # 时间步长
N = int(L / dx) + 1 # 离散化后的空间格点数
M = int(T / dt) + 1 # 离散化后的时间格点数
# 初始化数组
x = np.linspace(0, L, N)
u = np.zeros((M, N))
u[0, :] = np.sin(x)
```
接下来,我们可以通过递推求解差分方程,得到波动方程在给定初始条件下的数值解。具体地,我们可以使用下列代码进行求解:
```python
# 递推求解差分方程
for j in range(M-1):
for i in range(1, N-1):
u[j+1, i] = u[j, i] + dt*(c/dx)*(u[j, i+1] - u[j, i-1]) + dt*(a/dx**2)*(u[j, i+1] - 2*u[j, i] + u[j, i-1])
```
求解完成后,我们可以将数值解可视化,例如使用下列代码进行绘图:
```python
import matplotlib.pyplot as plt
# 绘制数值解的可视化
fig, ax = plt.subplots(figsize=(8, 5))
for j in range(0, M, 100):
ax.plot(x, u[j, :], label='t={:.2f}'.format(j*dt))
ax.set_xlabel('x')
ax.set_ylabel('u')
ax.legend()
plt.show()
```
这样,我们就可以得到波动方程在给定初始条件下的数值解了。
阅读全文