基于五点差分公式的泊松方程数值解法
字数 3031 2025-12-13 01:57:41

基于五点差分公式的泊松方程数值解法

我将为你讲解如何利用五点差分公式求解二维泊松方程的数值解。这个问题在电磁场计算、流体力学和热传导等领域都有重要应用。

问题描述

考虑二维泊松方程:

\[\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. 算法实现流程

  1. 输入参数:\(L_x, L_y, N_x, N_y\),函数 \(f(x,y)\) 和边界函数 \(g(x,y)\)
  2. 计算步长:\(h_x = L_x / N_x\)\(h_y = L_y / N_y\)
  3. 在网格点上计算 \(f_{i,j}\) 和边界值 \(g_{i,j}\)
  4. 组装矩阵 \(A\) 和右端向量 \(\mathbf{b}\)
  5. 选择适当方法求解线性方程组,得到内部节点近似解 \(\mathbf{u}\)
  6. 输出网格点上的数值解 \(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\) 和边界条件,或将其扩展至三维(使用七点差分公式)和非均匀网格。

基于五点差分公式的泊松方程数值解法 我将为你讲解如何利用五点差分公式求解二维泊松方程的数值解。这个问题在电磁场计算、流体力学和热传导等领域都有重要应用。 问题描述 考虑二维泊松方程: \[ \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\) 和边界条件,或将其扩展至三维(使用七点差分公式)和非均匀网格。