二维泊松方程有限差分法数值求解与误差分析系统
项目简介
本项目是一个基于MATLAB平台开发的数值计算系统,专注于利用有限差分法(Finite Difference Method, FDM)求解二维泊松方程(Poisson Equation)。该系统在一个矩形物理域上进行离散化,构建稀疏线性方程组,并求解其数值解。为了验证算法的有效性,系统内置了一个特定解析解的算例,能够自动计算数值解与精确解之间的误差,并通过三维可视化图形直观展示计算结果。
功能特性
- 物理域离散化:自动将定义的矩形区域划分为均匀的网格系统,由用户预设网格在一个方向上的离散数量。
- 五点差分格式:采用经典的二阶精度中心差分格式(Five-point Stencil)逼近拉普拉斯算子,具有二阶截断误差。
- 稀疏矩阵优化:程序专门针对大规模线性方程组设计,利用稀疏矩阵存储格式(Sparse Matrix)构建系数矩阵,极大地减少了内存消耗并提升了计算效率。
- Dirichlet边界处理:能够自动识别并处理Dirichlet边界条件,通过将被知边界值移项至方程右端项(RHS)来修正线性方程组。
- 高性能求解:利用MATLAB内置的针对稀疏矩阵优化的直接求解器(左除运算法)快速求解大型线性方程组。
- 多维误差分析:定量计算最大绝对误差、L2范数误差以及平均误差,全方位评估数值算法的精度。
- 可视化后处理:提供交互式的三维曲面图,同屏展示数值解、解析解及误差分布,方便用户进行定性对比。
算法实现与逻辑细节
本项目核心代码实现了以下完整的数值模拟流程:
1. 物理模型初始化
系统首先定义求解区域为 $1.0 times 1.0$ 的矩形,并在X和Y方向上分别划分了50个网格(共 $51 times 51$ 个节点)。程序自动计算网格步长,并生成全域的网格坐标矩阵。为了构建线性方程组,系统区分了“边界节点”与“内部节点”,仅对内部未知节点进行编号和求解。
2. 定义验证算例
为了评估求解器的准确性,代码内置了如下数学模型:
- 精确解:采用双正弦函数 $u(x,y) = sin(pi x)sin(pi y)$。
- 源项函数:根据泊松方程 $-Delta u = f$ 反推得到源项 $f(x,y) = 2pi^2 sin(pi x)sin(pi y)$。
- 边界条件:边界值直接由精确解函数给出(在边界上值为0),属于Dirichlet边界条件。
3. 稀疏矩阵组装 (核心算法)
这是程序最关键的部分。为了高效求解 $Ax=b$:
- 映射机制:建立了二维网格索引 $(i, j)$ 到一维未知数向量索引 $k$ 的映射关系。
- 系数计算:对于每个内部节点,计算中心点及其上下左右四个邻居节点的差分系数。
- 边界修正:在遍历邻居节点时,如果邻居位于边界上,程序不会将其加入系数矩阵 $A$,而是通过已知边界函数计算其值,并将该项移至方程右端向量 $b$ 中,从而保证方程系统的封闭性。
- 三元组构建:使用
rows、cols、vals 数组预存储非零元素,最后一次性生成稀疏矩阵,避免了动态调整矩阵大小带来的性能损耗。
4. 数值求解
使用MATLAB的 `
(mldivide) 运算符对构建好的稀疏线性方程组进行求解。该求解器会自动选择适合稀疏矩阵的算法(如UMFPACK),并记录求解耗时。5. 结果重构与误差计算
- 解的重构:将求解得到的一维内部节点向量映射回二维网格矩阵,并填充四条边的边界条件值,形成完整的数值解矩阵。
- 误差统计:通过计算数值解矩阵与精确解矩阵的差值,得出误差矩阵。随后计算全域的最大绝对误差、L2离散范数误差和平均误差。
结果可视化
代码执行完毕后会自动弹出一个包含三个子图的窗口:
- 数值解曲面图:展示有限差分法计算得到的 $u(x,y)$ 三维分布。
- 精确解曲面图:展示理论上的标准解,用于目视对比。
- 误差分布图:展示全域的绝对误差 $|u_{num} - u_{exact}|$ 分布,色条(Colorbar)直观反映了误差的量级范围。
所有图形均采用三维视角,使用
jet
和 parula
色图进行渲染,并开启了网格显示以便观察细节。系统要求
- MATLAB R2016a 或更高版本。
- 无需额外工具箱,但需要核心的数学运算和绘图功能支持。
使用方法
- 将项目代码保存为
.m` 文件。
在MATLAB环境中打开该文件。点击运行(Run)或在命令行输入文件名执行。程序将在命令行窗口输出组装状态、求解时间及详细的误差统计数据,并弹出结果对比图窗。