前面我们讲网格划分时,说过一句话:
仿真计算的第一步,是把一个连续的几何区域,切成有限个小单元。
这句话听起来很自然。
但仔细想一下,它其实马上带来一个新问题:
真实世界里的位移、温度、速度、压力,理论上在每一个位置都有值。
可是计算机不可能把每一个位置都单独算一遍,它只能处理有限个数。
那问题就来了:
节点之间的值从哪里来?
单元内部的值从哪里来?
后处理里那些看起来连续变化的云图,又是怎么画出来的?
这篇文章就接着前面的网格划分,讲一个有限元里非常核心,但新手经常没真正想清楚的问题:
有限元是怎么用有限个点,去近似一个连续世界的?
答案就在一个关键词里:形函数。
不过我们先不要急着给定义。
我们先从一个最简单的问题开始。
网格划分以后,计算机通常并不是把单元内部每一个位置都直接算出来。
在有限元里,最常见的做法是:先求一些有限位置上的未知量。
比如:
但真实的结构、温度场、电势场,不会只存在于节点上。节点之间、单元内部的任意位置,也应该有值。
那这些没有直接求解的位置怎么办?
最自然的想法是:既然节点上的值已经知道了,那中间的值是不是可以按照某种规则,由周围节点的值推出来?
比如一个点靠近左边节点,它就多受左边节点影响;靠近右边节点,就多受右边节点影响;如果正好在中间,就左右各占一半。
这其实就是一种补值。
而在有限元里,这套补值规则,就叫形函数。
它要回答的问题很简单:
单元内部任意一点的值,应该由周围节点的值,按照什么比例组合出来?
先看最简单的一维情况。
假设有一根线段,左端节点温度是 20℃,右端节点温度是 40℃。
现在我们想知道线段中间某一点的温度。
如果采用最简单的线性插值:越靠近哪个端点,就越受那个端点影响。
比如正中间的位置,温度可以估计为:
中点温度 = 50% × 20℃ + 50% × 40℃
= 30℃
如果某个点更靠近左端,比如左端影响占 80%,右端影响占 20%:
某点温度 = 80% × 20℃ + 20% × 40℃
= 24℃
这里的 50%、50%,或者 80%、20%,不是随便拍脑袋来的,它们就是由形函数给出的权重。
刚才这个例子里,我们默认温度从 20℃ 到 40℃ 是一条直线变化。
这就是一阶,也就是线性形函数。
如果真实物理量的变化本来就接近线性,那这种补法可能已经够用。
但真实仿真里,很多变化并没有这么简单。
比如:
如果仍然只用最简单的线性规则去补,就可能不够准确。
所以有限元里会有不同阶次的形函数,可以是一阶、二阶、三阶。
一维单元中线性(左)、二次(中)和三次(右)形函数的示意图。
这也是为什么在单元数量不变的情况下,提高单元阶次有时能得到更准确、更平滑的结果——不是增加了更多单元,而是让每个单元内部的补值规则更有表达能力。
当然,代价也很明显:阶次越高,自由度越多,计算成本也会增加。所以具体选几阶,还是要结合精度需求和计算资源一起判断。
比如一个半圆形区域,如果只用低阶线性三角形去近似,弯曲边界会被拉成直线,几何形状就会变得很粗糙。而使用二阶或更高阶几何形函数时,即使用较少单元,也可以更好地贴近原来的曲线几何。
一个半圆形区域(左图),分别使用线性(中左)、二次(中右)和三次(右图)几何形函数进行离散化。蓝色圆点表示节点。
这也提醒我们:
网格不是只决定"算多少块",形函数也不是只决定"节点之间怎么补"。
它们共同影响两个东西:
这就是为什么有限元里的"单元阶次"并不是一个无关紧要的小设置。
一维线段比较容易理解:两个端点知道了,中间怎么补。
二维呢?逻辑没有变,只是从线上补变成了在面里补。
比如一个四边形单元有 4 个角点。
有限元会先求出这 4 个节点上的未知量,然后用二维形函数,把单元内部任意一点的值补出来。
你可以把一个二维四边形单元想象成一张小纸片。
纸片四个角上的温度已经知道了,那纸片中间某一点的温度,就由四个角点共同决定——靠近哪个角点,就更多受哪个角点影响。每个角点的影响权重,就是对应的形函数值。
如果是三角形单元,道理也一样。只不过参与补值的是三个角点,或者在高阶单元里,还会有边中点等更多节点参与。
三维实体单元也是同一个逻辑,只不过从面变成了体。
比如一个 8 节点六面体单元,可以想象成一个小砖块。软件求解 8 个角点上的未知量,小砖块内部任意一点的值,则由这 8 个角点按形函数给出的权重组合而来。
简单总结:
讲到这里,很容易产生一个误解:有限元是不是把有限个点,变成了无限连续的空间?
不完全是。更准确地说,有限元是用有限个未知量,构造一个近似连续的物理场。形函数在这两者之间搭了一座桥——它让有限个节点值不再只是孤立的数字,而是可以在单元内部组合成连续的近似分布。
这个近似分布不等于真实世界本身。但如果网格足够合理、形函数阶次合适、模型假设正确,它就可以足够接近真实解。
顺便对比一下有限体积法(FVM)。FEM 和 FVM 都要解决"中间位置怎么办"的问题,但重点不一样。
FEM 的补值重点是:
用节点值和形函数,补出单元内部的近似连续场。
FVM 的补值重点是:
用单元中心值或单元平均值,重构边界或面上的值,从而计算控制体之间的通量交换。
如果用一句话区分:
FEM 补的是"单元内部怎么连续变化";FVM 补的是"单元边界上怎么交换通量"。
比如二维 FVM 中,每个小单元像一块地砖,更关心的是这块地砖和周围地砖之间,通过共同边界交换了多少质量、动量或热量:
单元中心值 → 重构到单元边/面上 → 计算通量 → 更新控制体平均值
到了三维,道理一样,只是共同边变成了共同面。
有限元真正厉害的地方,不是把"有限"真的变成"无限",而是用有限个未知量,有规则地近似一个连续的物理场。
理解形函数很重要,因为它回答的是一个非常实际的问题:
计算机只算有限个点,仿真软件凭什么画出连续的云图?
答案就是:靠形函数这套补值规则,把有限个节点值组织成一个近似连续的世界。
参考资料: