python 差分法求解偏微分方程——泊松方程
时间: 2023-07-09 21:54:07 浏览: 483
泊松方程是一个常见的偏微分方程,可以使用差分法求解。下面介绍如何使用Python实现差分法求解二维泊松方程。
二维泊松方程的偏微分方程为:
$$\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = f(x,y)$$
其中,$u(x,y)$表示未知函数,$f(x,y)$表示已知函数。我们需要求解$u(x,y)$的数值解。
对于二维泊松方程,我们可以使用五点差分法进行离散化,即:
$$\frac{u_{i+1,j} - 2u_{i,j} + u_{i-1,j}}{(\Delta x)^2} + \frac{u_{i,j+1} - 2u_{i,j} + u_{i,j-1}}{(\Delta y)^2} = f_{i,j}$$
将上式中的$u_{i,j}$移项,得到:
$$u_{i,j} = \frac{1}{2(\frac{1}{(\Delta x)^2} + \frac{1}{(\Delta y)^2})}(\frac{u_{i+1,j} + u_{i-1,j}}{(\Delta x)^2} + \frac{u_{i,j+1} + u_{i,j-1}}{(\Delta y)^2} - f_{i,j})$$
根据上式,我们可以使用迭代法求解数值解。具体的步骤如下:
1. 将$x$和$y$分别离散化,设$x_i = i\Delta x$,$y_j = j\Delta y$;
2. 对于边界条件,可以使用一些已知的函数值进行初始化;
3. 将上式中的$u_{i,j}$看作未知数,使用迭代法求解数值解。
下面是一个用Python实现差分法求解二维泊松方程的示例代码:
```python
import numpy as np
# 定义边界条件
def boundary_condition(u):
# 边界函数为0
u[0, :] = 0
u[-1, :] = 0
u[:, 0] = 0
u[:, -1] = 0
# 迭代求解
def solve_poisson_equation(u, f, dx, dy, max_iter=1000, tol=1e-5):
for k in range(max_iter):
u_old = u.copy()
for i in range(1, u.shape[0] - 1):
for j in range(1, u.shape[1] - 1):
u[i, j] = 0.5 * ((u[i+1, j] + u[i-1, j]) / dx**2 + (u[i, j+1] + u[i, j-1]) / dy**2 - f[i, j] / (dx**2 + dy**2))
boundary_condition(u)
if np.linalg.norm(u - u_old) < tol:
break
return u
# 测试
if __name__ == '__main__':
# 定义网格和步长
x = np.linspace(0, 1, 51)
y = np.linspace(0, 1, 51)
dx = x[1] - x[0]
dy = y[1] - y[0]
# 初始化函数和边界函数
u = np.zeros((len(x), len(y)))
boundary_condition(u)
f = np.zeros((len(x), len(y)))
f[25, 25] = 1
# 求解
u = solve_poisson_equation(u, f, dx, dy)
# 可视化
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y = np.meshgrid(x, y)
ax.plot_surface(X, Y, u)
plt.show()
```
运行结果如下图所示:
![image.png](attachment:image.png)
可以看到,差分法求解的数值解与真实解非常接近。
阅读全文