第二章 有限元方法基础:控制方程离散化、形函数与单元类型、刚度矩阵组装
各位好,欢迎来到第二章。上一章我们聊了多物理场耦合的基本概念,今天咱们要啃一块硬骨头——有限元方法的基础。说实话,我刚入行那会儿,觉得有限元就是个黑盒子,把模型扔进去,点个计算,结果就出来了。直到有一次,我算出来的温度场跟实验数据差了十万八千里,排查了三天,最后发现是单元类型选错了。从那以后,我再也不敢轻视这些基础理论了。
这一章,我会带着大家把有限元方法的三个核心环节捋清楚:控制方程怎么离散化、形函数和单元类型怎么选、刚度矩阵怎么组装。你想想看,搞懂了这些,你就不再是那个只会点鼠标的“仿真操作工”了。
2.1 控制方程的离散化:从连续到离散
有限元方法的核心思想,说白了就是“化整为零,积零为整”。一个连续的物理场,比如温度分布、应力分布,我们没法用计算机直接求解它的解析解。怎么办?把它切成很多小块,每一块用一个简单的函数去近似,然后把这些小块拼起来。
这个过程,就是离散化。
我习惯把离散化分成三步走:
- 几何离散化:把连续的求解域划分成有限个互不重叠的单元(比如三角形、四边形、四面体)。
- 场变量离散化:在每个单元内部,用节点上的值(比如节点温度、节点位移)通过插值函数来近似表示整个单元内的场分布。
- 方程离散化:将控制方程(比如热传导方程、弹性力学方程)转化为关于节点未知量的代数方程组。
举个例子,一维稳态热传导方程:
-k * d²T/dx² = Q
其中k是导热系数,T是温度,Q是热源。这个方程描述的是连续的温度场。我们把它离散化之后,会变成这样一个形式:
[K]{T} = {F}
这里的[K]就是刚度矩阵(在热问题里也叫导热矩阵),{T}是节点温度向量,{F}是节点热载荷向量。你看,一个微分方程,变成了一个线性代数方程组。计算机最擅长解这个了。
核心要点:离散化的本质,就是用有限个自由度(节点未知量)去近似无限个自由度的连续系统。精度取决于单元尺寸和插值函数的阶次。
2.2 形函数与单元类型:选对了,事半功倍
形函数,也叫插值函数,是有限元方法里最精巧的设计之一。它的作用,就是建立单元内部任意一点的物理量与单元节点值之间的关系。
比如一个一维两节点杆单元,节点1和节点2的温度分别是T₁和T₂。那么单元内部任意一点x处的温度T(x)可以表示为:
T(x) = N₁(x) * T₁ + N₂(x) * T₂
这里的N₁(x)和N₂(x)就是形函数。对于线性单元,它们长这样:
N₁(ξ) = (1 - ξ) / 2
N₂(ξ) = (1 + ξ) / 2
其中ξ是自然坐标,范围从-1到1。为什么要用自然坐标?嗯,这里有个小技巧:用自然坐标可以把不同形状的单元统一映射到标准单元上,方便数值积分。
个人经验:我在做压电换能器仿真时,遇到过单元畸变导致计算不收敛的问题。后来发现,形函数在畸变单元上的映射质量会严重下降。所以网格划分时,尽量保持单元形状规整,长宽比不要太大。
常见的单元类型,我整理了一个表格,方便大家对照:
| 维度 | 单元类型 | 节点数 | 形函数阶次 | 典型应用 |
|---|---|---|---|---|
| 1D | 杆单元 | 2 | 线性 | 桁架、弹簧 |
| 1D | 梁单元 | 2 | 三次 | 框架结构 |
| 2D | 三角形单元 | 3 | 线性 | 平面应力/应变 |
| 2D | 四边形单元 | 4 | 双线性 | 结构、热分析 |
| 3D | 四面体单元 | 4 | 线性 | 复杂几何体 |
| 3D | 六面体单元 | 8 | 三线性 | 规则几何体 |
选单元类型时,我有个原则:能用高阶单元就别用低阶,能用六面体就别用四面体。但这不是绝对的。比如对于非常复杂的几何模型,四面体网格更容易生成,虽然精度差一些,但胜在省时间。你想想看,一个模型算三天和算三小时,工程上怎么选?
2.3 刚度矩阵的组装:搭积木的艺术
刚度矩阵的组装,我特别喜欢用“搭积木”来比喻。每个单元都有自己的单元刚度矩阵[k]ᵉ,就像一块积木。我们要把这些积木按照节点编号的对应关系,拼装成全局刚度矩阵[K]。
组装过程遵循一个基本原则:直接刚度法。说白了,就是把单元刚度矩阵中的元素,按照其对应的节点自由度编号,叠加到全局刚度矩阵的相应位置。
举个例子,一个简单的两单元一维问题,单元1连接节点1和2,单元2连接节点2和3。每个单元的刚度矩阵是2×2的:
[k]¹ = [k₁₁¹, k₁₂¹; k₂₁¹, k₂₂¹]
[k]² = [k₁₁², k₁₂²; k₂₁², k₂₂²]
组装后的全局刚度矩阵是3×3的:
[K] = [k₁₁¹, k₁₂¹, 0 ;
k₂₁¹, k₂₂¹+k₁₁², k₁₂² ;
0 , k₂₁², k₂₂² ]
你看,节点2对应的位置,是两个单元贡献的叠加。这就是“搭积木”的过程。
避坑指南:我曾经在组装多物理场耦合问题的刚度矩阵时,搞混了自由度编号顺序,结果算出来的结果完全不对。记住,每个节点的自由度编号必须全局唯一,且与单元局部编号的映射关系要清晰。建议用稀疏矩阵存储,别用满矩阵,否则内存会爆炸。
为了让大家更直观地理解整个流程,我画了一张流程图:
这张图把整个流程串起来了。你会发现,形函数和单元类型的选择,直接决定了单元分析的精度;而刚度矩阵的组装,则是把局部信息整合成全局系统的关键一步。
2.4 实战中的几点体会
最后,分享几点我在项目中的体会:
- 关于网格密度:不是越密越好。网格太密,计算量剧增,但精度提升有限。我一般会在应力集中区域或梯度大的地方加密,其他地方用粗网格。
- 关于单元类型:对于弯曲主导的问题,尽量用二次单元或减缩积分单元,避免剪切闭锁。我记得有一次做薄板弯曲,用了线性单元,结果刚度偏大,挠度算出来只有实验值的一半。
- 关于矩阵组装:实际编程时,别用三重循环去组装,效率太低。用稀疏矩阵的坐标格式(COO)或压缩行格式(CSR),先记录非零元素的位置和值,再一次性组装。
总结一下:有限元方法的基础,就是离散化、形函数、单元类型和刚度矩阵组装这四个概念。搞懂了它们,你就掌握了有限元仿真的“内功心法”。后面遇到再复杂的多物理场耦合问题,无非是在这个框架上叠加更多的物理场和耦合项。
好了,这一章就到这里。下一章我们会深入具体的多物理场耦合案例,看看这些理论是怎么落地的。