1D有限体积法模拟器——稳态扩散 返回
数值分析

1D有限体积法模拟器——稳态扩散

用有限体积法(FVM)求解一维稳态扩散方程的工具。将区域分割成控制体积单元,在每个单元中建立通量收支,组建三对角矩阵,用Thomas法求解。改变控制体积数或发生项,可实时查看单元中心的φ分布、解析解误差和收敛过程。

参数设置
控制体积数 N
将区域分割成的等宽单元个数
扩散系数 Γ
对应热导率或扩散率的系数
区域长度 L
m
左端边界值 φL
x=0 处固定的 φ 值(Dirichlet)
右端边界值 φR
x=L 处固定的 φ 值(Dirichlet)
体积发生项 S
均匀加到每个单元的生成或消耗项。0时为线性解,≠0时为抛物线解
计算结果
控制体积数 N
单元宽度 Δx (m)
中央单元的 φ
左端扩散通量
解析解最大误差
发生项影响
控制体积单元和 φ 分布

区域被分成N个控制体积单元,各单元中心节点(白圆)处求得φ值,用柱形表示。两端蓝框是固定边界值 φL·φR。颜色脉动是反复计算的示意。

φ 分布——数值解与解析解
最大误差 vs 控制体积数 N
理论·主要公式

$$\frac{d}{dx}\!\left(\Gamma\frac{d\phi}{dx}\right)+S=0$$

一维稳态扩散方程。Γ:扩散系数,φ:要求解的标量量,S:体积发生项。两端采用Dirichlet边界条件 φ(0)=φL、φ(L)=φR。

$$a_P\phi_P=a_W\phi_W+a_E\phi_E+S\,\Delta x,\quad a_P=a_W+a_E$$

各控制体积(单元P)的离散化收支方程。a_W·a_E 是西·东面的导纳(内部面 Γ/Δx,边界面 2Γ/Δx),Δx:单元宽度。FVM通过该方程在所有控制体积中严格满足守恒律。

$$\phi_{\text{exact}}(x)=\phi_L+(\phi_R-\phi_L)\frac{x}{L}+\frac{S}{2\Gamma}\,x(L-x)$$

均匀发生项的严格解。S=0 时为直线,S≠0 时为抛物线。本工具通过单元中心处严格解与数值解的差来评估最大误差。

有限体积法简介

🙋
听说过"有限体积法"这个名字,但和有限差分法有什么区别呢?两种都是求解微分方程的方法吧。
🎓
问得好。有限差分法是用泰勒展开将微分方程的导数项替换成差分。而有限体积法(FVM)的思路有点不同。它把区域分成小"控制体积"的方块,在每个方块内建立"进出流量的收支"。也就是说,与其说是求解微分方程,不如说是用单纯加法来建立守恒律。
🙋
每个方块都建立收支……这有什么好处吗?
🎓
最大的优点是"守恒性"。相邻的两个方块共享一个界面吧。FVM中,左方块流出的通量和右方块流入的通量必须用同一个式子计算。所以相加时会完全抵消,整个区域的守恒律也保持得很好。热量或质量不会"突然消失"。因此在CFD(流体分析)中,FVM成了标准。上面的"控制体积单元"图就是这些方块排成一排的样子。
🙋
我看到当N设为8时,与解析解的误差几乎为0。这是计算正确吗?
🎓
反而这正是"计算正确"的证明呢。当发生项 S=0 时,稳态扩散的严格解就是从左值到右值的"直线"。FVM用的中心差分通量评估可以完美再现直线,所以粗网格下误差也不会出现。试试把发生项 S 改成 30 看看。这次严格解变成抛物线,有限单元宽度就会产生误差了。看下面的"最大误差 vs N"图,就能看到N越大误差越小。
🙋
所以加上S的话会变成抛物线,误差会随着N变大而越来越小?
🎓
对。这个格式是二阶精度,单元宽度 Δx 减半,误差就约为原来的四分之一。从图的曲线不断接近0就能看出来。不过现实的分析中,网格越细,计算成本也越高。所以要判断"细到什么程度就够了",这叫做"网格依赖性确认(格点研究)"。这个工具就是为了让你亲身体验这个关系。
🙋
最后问一个。"三对角矩阵"和"Thomas法"是什么?
🎓
一维FVM中,每个单元只与"自己·左邻·右邻"三个相关。所以联立方程的系数矩阵只有对角线和紧邻对角线上下的值,这叫"三对角矩阵"。这种矩阵比一般矩阵容易解得多。Thomas法(追赶法)就是专为三对角矩阵设计的解法,计算量只和单元数成比例。所以即使 N=30 也能瞬间求解。FVM实现起来轻便,就是因为这种矩阵结构。

常见问题

有限差分法通过泰勒展开将微分方程的导数项差分近似。而有限体积法是将区域分割成"控制体积(控制体)"的单元,在每个单元中直接建立守恒律(流进流出通量的收支)。FVM的最大优点是每个单元中的通量都被严格保存。在相邻单元的共享面上,流出通量和流入通量必须用相同的公式计算,因此整个区域的守恒律也不会破坏。因此,在热、质量、动量守恒很重要的流体分析(CFD)中,FVM是标准方法。
在区间[0,L]上求解一维稳态扩散方程 d/dx(Γ dφ/dx) + S = 0,边界条件为Dirichlet型 φ(0)=φL、φ(L)=φR。将区域分成N个等宽控制体积,在每个单元中心评估φ的值。内部面的导纳为 Γ/Δx,边界面因为单元中心到边界是半个单元宽,所以是 2Γ/Δx。由此建立三对角矩阵 A·φ = b,用Thomas法求解。
当发生项 S=0 时,稳态扩散方程的严格解是 φ(x)=φL+(φR−φL)x/L 的直线。FVM中使用的中心差分通量评估可以精确再现一次函数(直线),因此离散解与单元中心的严格解完全一致,最大误差几乎为0(舍入误差级别)。而当 S≠0 时,严格解变成抛物线,有限的单元宽度会产生离散化误差。该误差随着控制体积数N的增加而以二阶精度衰减。
此工具仅处理两端值固定的Dirichlet边界条件。在实际应用中,固定梯度(通量)的Neumann边界条件和对流换热等Robin边界条件也经常使用。FVM也可以自然地处理这些情况。在Neumann边界中,直接将通量给入b,并将边界单元边界侧的导纳设为0。在Robin边界中,设置包含传热系数的有效导纳到边界面。这些都可以在"如何将通量应用到单元收支方程"的同一框架中统一处理,这正是FVM的优点。

实际应用

热传导分析:稳态扩散方程也可以直接看作稳态热传导方程。将Γ理解为热导率,φ理解为温度,S理解为内部发热,就可以用来计算墙体或管道保温材料的温度分布、电子器件的散热、保温性能评估等。FVM在每个单元中建立严格的热收支,保证了进出热流的一致性,能容易检查能量平衡。

CFD(数值流体力学)基础:OpenFOAM、ANSYS Fluent、STAR-CCM+ 等主流CFD求解器几乎都基于有限体积法。实际流动分析会在这里的扩散项外加入对流项和压力项,但"在控制体积中建立通量收支"的骨架完全相同。这个一维扩散问题是理解复杂CFD的最基本出发点。

物质扩散·浓度分布:将Γ理解为扩散系数,φ理解为浓度,就可以用于半导体工艺中的杂质扩散、过滤膜物质移动、地下水污染物扩散等模型。发生项S代表化学反应的生成和消耗。当要快速估算稳态浓度分布时,这种离散化很有用。

数值分析教学与代码验证:初学FVM时,一维稳态扩散几乎总是首个主题。因为严格解(直线·抛物线)可以手工计算,所以能通过与解析解的误差直接验证自写代码的正确性。S=0时误差为零,S≠0时误差按二阶精度随N增长,这些是验证实现正确性的标准基准。

常见误解和注意事项

最常见的错误是"混淆单元中心的值与单元边界(节点)的值"。本工具采用单元中心法,求得的φ是单元中央 x_i=(i+0.5)Δx 处的值。不是边界 x=0 或 x=L 处的值。计算边界通量时,单元中心到边界的距离是 Δx/2,所以边界面的导纳是内部面的两倍(2Γ/Δx)。忽视这个"半单元"处理会导致边界附近的流量或温度偏离。FVM实现中最常见的错误就是这个边界半单元处理。

其次是"误差为零就认为万无一失"。本工具在 S=0 时误差接近零,是因为严格解是直线,中心差分能完全再现直线。加入发生项、扩散系数随位置变化、有对流项等情况,都会产生离散化误差。"某问题下误差为零,所以别的问题也没问题"这样的想法不对。实践中必须通过改变N来检查解是否收敛(网格依赖性),这是必要的。

最后是"把守恒性和精度混为一谈"。FVM在控制体积间严格保存通量,但这不等于"答案准确"。粗网格下虽然守恒律本身不破坏,但解的形状会与严格解偏离。也就是说,守恒性是"质量热量不会凭空消失"的性质,和精度(与严格解有多接近)是两回事。区别理解这两点是正确使用FVM的第一步。

使用指南

  1. 在10~100范围内设置控制体积数(nNum),分割计算区域。单元宽度Δx自动计算。
  2. 输入物性值,包括热导率λ(W/m·K)和发生项系数S(W/m³),指定Dirichlet边界条件(左端φL、右端φR)。
  3. 点击"执行计算",用Thomas法(三对角矩阵法)求解联立方程,输出各单元中心的温度分布φ和单元界面的扩散通量。

具体计算示例

计算区域0~1m的铝板(λ=237 W/m·K),左端φL=100℃、右端φR=0℃、发生项S=1000 W/m³的情况,用控制体积数N=20计算,则单元宽度Δx=0.05m,中央单元(x=0.5m)的温度为φ≈47.6℃。左端扩散通量约为24700 W/m²,与解析解的最大误差在0.8%以下收敛。

实务注意事项