基于五点差分公式的泊松方程数值解法
我将为你讲解如何利用五点差分公式求解二维泊松方程的数值解。这个问题在电磁场计算、流体力学和热传导等领域都有重要应用。
问题描述
考虑二维泊松方程:
\[\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = f(x, y), \quad (x, y) \in \Omega = [0, L_x] \times [0, L_y] \]
边界条件为Dirichlet条件:在区域边界 \(\partial \Omega\) 上给定 \(u(x, y) = g(x, y)\)。已知函数 \(f\) 和 \(g\),要求数值求解 \(u(x, y)\) 在区域内部的近似值。
解题步骤
1. 区域离散化
首先将连续区域 \(\Omega\) 离散化为网格点:
- \(x\) 方向:将区间 \([0, L_x]\) 均匀分为 \(N_x\) 段,步长 \(h_x = L_x / N_x\),节点坐标 \(x_i = i h_x\),\(i = 0, 1, \dots, N_x\)
- \(y\) 方向:将区间 \([0, L_y]\) 均匀分为 \(N_y\) 段,步长 \(h_y = L_y / N_y\),节点坐标 \(y_j = j h_y\),\(j = 0, 1, \dots, N_y\)
网格点总数:\((N_x + 1) \times (N_y + 1)\)。我们记 \(u_{i,j} \approx u(x_i, y_j)\),\(f_{i,j} = f(x_i, y_j)\)。
2. 微分算子离散化(五点差分公式)
对于内部节点 \((x_i, y_j)\)(即 \(1 \le i \le N_x-1\),\(1 \le j \le N_y-1\)),我们用中心差分公式近似二阶偏导数:
- \(x\) 方向二阶导数:
\[\frac{\partial^2 u}{\partial x^2}(x_i, y_j) \approx \frac{u_{i-1,j} - 2u_{i,j} + u_{i+1,j}}{h_x^2} \]
- \(y\) 方向二阶导数:
\[\frac{\partial^2 u}{\partial y^2}(x_i, y_j) \approx \frac{u_{i,j-1} - 2u_{i,j} + u_{i,j+1}}{h_y^2} \]
将二者相加,得到泊松方程在点 \((x_i, y_j)\) 的离散近似:
\[\frac{u_{i-1,j} - 2u_{i,j} + u_{i+1,j}}{h_x^2} + \frac{u_{i,j-1} - 2u_{i,j} + u_{i,j+1}}{h_y^2} = f_{i,j} \]
这个公式涉及中心点和上下左右四个相邻点,因此称为五点差分公式(对应二维拉普拉斯算子的经典离散格式)。
3. 建立线性方程组
将上述离散方程重新排列,写成关于未知量 \(u_{i,j}\) 的线性方程:
\[\frac{1}{h_x^2} u_{i-1,j} + \frac{1}{h_x^2} u_{i+1,j} + \frac{1}{h_y^2} u_{i,j-1} + \frac{1}{h_y^2} u_{i,j+1} - 2\left( \frac{1}{h_x^2} + \frac{1}{h_y^2} \right) u_{i,j} = f_{i,j} \]
对于每个内部节点,都可以写出这样一个方程。边界节点上的值由Dirichlet条件直接给出:若 \((x_i, y_j)\) 在边界上,则 \(u_{i,j} = g(x_i, y_j)\),作为已知量代入方程组。
为了求解方便,通常将二维网格节点按行优先或列优先的顺序排列成一维向量。例如,按行优先排列:将节点 \((i, j)\) 对应到一维索引 \(k = i + j(N_x + 1)\)。这样,上述方程组可以写成矩阵形式:
\[A \mathbf{u} = \mathbf{b} \]
其中:
- \(\mathbf{u}\) 是所有内部节点的未知值按顺序排列的向量;
- \(A\) 是一个稀疏矩阵,每行最多有5个非零元素(对应中心点及其四个相邻点);
- \(\mathbf{b}\) 由 \(f_{i,j}\) 和边界条件贡献项组成。
4. 方程求解方法
线性方程组 \(A \mathbf{u} = \mathbf{b}\) 的求解可以采用直接法或迭代法:
- 直接法:对于中等规模问题(例如网格点数在几千以内),可使用高斯消元法或LU分解。由于 \(A\) 是稀疏矩阵,应采用稀疏矩阵存储(如CSR格式)和专门求解器(如UMFPACK)。
- 迭代法:对于大规模问题,常用迭代法如:
- 雅可比迭代:简单但收敛慢。
- 高斯-赛德尔迭代:收敛速度优于雅可比。
- 逐次超松弛迭代:在Gauss-Seidel基础上引入松弛因子加速。
- 共轭梯度法:适用于对称正定矩阵(泊松方程的离散矩阵通常对称正定)。
5. 算法实现流程
- 输入参数:\(L_x, L_y, N_x, N_y\),函数 \(f(x,y)\) 和边界函数 \(g(x,y)\)。
- 计算步长:\(h_x = L_x / N_x\),\(h_y = L_y / N_y\)。
- 在网格点上计算 \(f_{i,j}\) 和边界值 \(g_{i,j}\)。
- 组装矩阵 \(A\) 和右端向量 \(\mathbf{b}\)。
- 选择适当方法求解线性方程组,得到内部节点近似解 \(\mathbf{u}\)。
- 输出网格点上的数值解 \(u_{i,j}\)。
6. 误差分析
离散化的误差主要来自截断误差:
- 中心差分公式的截断误差为 \(O(h_x^2) + O(h_y^2)\),所以整体方法是二阶精度的。
- 若 \(h_x = h_y = h\),则误差为 \(O(h^2)\)。
实际误差还受舍入误差和方程求解误差影响。可通过加密网格(减小 \(h\))来降低离散误差。
举例说明
设泊松方程为:
\[\frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} = -2\pi^2 \sin(\pi x) \sin(\pi y), \quad (x,y) \in [0,1] \times [0,1] \]
边界条件:\(u = 0\) 在边界上。
精确解为 \(u(x,y) = \sin(\pi x) \sin(\pi y)\)。
取 \(N_x = N_y = 10\),则 \(h = 0.1\)。用五点差分公式离散后求解,得到的数值解与精确解比较,最大误差约为 \(0.001\) 量级,验证了二阶精度。
这个方法是许多复杂问题数值求解的基础框架。你可以尝试更换 \(f\) 和边界条件,或将其扩展至三维(使用七点差分公式)和非均匀网格。