第 8 章 · 组装、边界条件与求解
单元都造好了,接下来的问题偏工程:怎么把几千个单元的总阵高效组装、约束怎么施加、大型稀疏方程用什么解。这一节是从"会推公式"到"会跑模型"的桥。
稀疏性与存储
总刚度阵的规模是(节点数 × 每节点自由度),但绝大多数元素为零——每个单元只和邻居耦合。存储方式决定一切:满阵存 $10^6$ 自由度问题需要 TB 级内存,而按带宽或稀疏 CSR 格式只需 MB-GB 级。网格节点编号决定带宽,所以前处理里的编号优化(如 RCM 排序)直接省内存、提速。
边界条件的三种施加法
- 删行删列法:已知 $u_a = \bar u$,把对应行列移出方程、右端移项。数学最干净,但破坏矩阵编号结构。
- 大数法(罚函数):在对角元加巨大数 $10^{20}$,约束"近似"满足。实现最简单,但病态风险与大数选择有关。
- 拉格朗日乘子:新增未知量精确施加约束,但扩充方程组且引入零对角。
对称正定问题用罚法或删行删列;接触、多点约束这类复杂条件用乘子更正规。
求解器的选型
- 直接法(Cholesky/LD$^T$L):对称正定阵的标配,稳健、可预测,代价是填充与内存随规模增长。
- 迭代法(共轭梯度 + 预条件):内存友好、可并行,病态问题(大刚度比、细长单元)收敛慢,预条件子是成败关键。
老师的提醒
- "奇异矩阵"报错 90% 是约束不足:模型在空间里能刚体滑动/转动,或某个Part没和其他体共节点连接。
- 检查连接:接触面前先把两个体做共节点布尔运算,能省掉大量接触收敛的麻烦。
自检
- 为什么节点编号影响内存?什么排序能减小带宽?
- 三种约束施加法各自的优缺点?
- 应力在哪儿最准?为什么节点应力要磨平?
更深一层:约束施加是"边界的物理学翻译"
第 6 节的三种约束施加法,背后其实是三种"如何让近似解遵守边界"的哲学。删行删列(直接法):把约束编入函数空间——试探函数天生满足边界,解严格合法,但矩阵结构被破坏;罚函数:把约束折成能量——刚度阵加大数,约束以 $\varepsilon$ 级误差满足,换来实现极简;拉格朗日乘子:把约束变成未知力——精确满足且乘子有物理意义(支反力!),代价是方程组扩充且鞍点结构需要专门的求解器。现代求解器三种都用:线性静力内部走直接法,接触法向用罚或增广拉格朗日(罚 + 乘子混合,既精确又稳健),对称约束场用 MPC 方程。
乘子的物理身份值得专门说一句:接触问题里的拉格朗日乘子就是接触压力——这也是增广拉格朗日法能同时报告"穿透量"与"接触力"的原因。约束处理方法的选择不只是数值问题,它决定你的后处理能拿到什么物理量。
推导细读:求解器选择的"费用模型"
直接法与迭代法的费用结构完全不同。直接(Cholesky):费用确定性极强——内存与时间由稀疏分解的填充决定,排序(AMD/嵌套剖分)定生死;$n = 10^5$ 的三维网格,填充后可能要数 GB 内存,$n = 10^6$ 直接法基本出局。迭代(CG+预条件):内存 $O(n)$ 极省,但迭代数取决于预条件质量与病态程度——细长单元、大刚度比(软硬材料共存)会让迭代数暴涨甚至不收敛。工程决策的粗规则:百万自由度以下、要稳定可复现的结果 → 直接法;更大规模或内存受限 → 迭代法 + 好预条件(多重网格优先)。混合策略(块内直接、块间迭代,区域分解)是超大规模计算的现实答案。
在真实世界里:"奇异矩阵"报警的排障流程
有限元新手遇到"matrix singular"的标准排障清单,按出现频率排序: 1. 刚体模态未约束:模型在空间里能滑/转(某方向无约束)——检查约束是否锁死全部六个刚体自由度; 2. 部件未连接:两个实体共面但没共节点、没有接触定义——布尔合并或绑定接触; 3. 零刚度单元:单元被压扁($\det J \approx 0$)或材料参数漏填; 4. 约束冲突:同一自由度被两个约束同时锁定(过约束在乘子法下产生矛盾方程); 5. 接触初始穿透/分离抖动:初始状态在"接触-分离"边界震荡。
90% 的奇异报警落在前两条。把这份清单变成肌肉记忆,建模调试时间能省一半。
常见误区与辨析
- "罚刚度越大越精确":罚刚度过大 → 条件数爆炸 → 直接法丢精度、迭代法不收敛;增广拉格朗日(中等罚 + 乘子迭代)才是"精确且良态"的现代答案。
- "对称结构减半建模总没错":对称面上施加对称约束只对"反对称量为零"的载荷成立;扭转载荷需要半模型施加"循环对称"或干脆全模型。
- "大数法随便取个 1e10 就行":相对其他刚度项,1e10 可能不够"刚"(约束漏)也可能太"刚"(病态)——现代实践建议按最大对角元的 $10^{6\sim8}$ 倍取值并复核约束位移。
专题深入:求解器的"内存-时间"双账本
直接法与迭代法的完整账本是"内存-时间"双维度:直接法(Cholesky/LDLT——内存由填充决定、时间确定性极强)vs 迭代法(CG+预条件——内存 $O(n)$ 极省、时间由迭代数决定)。稀疏直接法的三段式流水线(排序-符号分解-数值分解)的排序决定一切:填充由消元顺序决定(AMD/嵌套剖分最小化填充)——三维问题的填充增长让纯直接法吃紧,这正是迭代法的领地。
预条件子是迭代法的胜负手:对角预条件(聊胜于无)→ 不完全分解(ILU/ICT——通用中等强度)→ 多重网格(椭圆问题最强,收敛与网格尺寸无关)。"迭代法设计 = Krylov 方法 + 预条件设计"——好预条件把迭代数从几千压到几十。
数学细节展开:条件数与收敛率的关系
CG 的收敛率 $((\sqrt\kappa - 1)/(\sqrt\kappa + 1))^k$ 值得展开:条件数 $\kappa$ 出现在平方根里——预条件子把"椭圆捏圆"($M^{-1}A$ 的谱聚拢)。好预条件的判据是总时间(迭代数 × 每步成本)而非迭代数——多重网格每步贵但迭代数与网格无关,不完全分解每步便宜但迭代数随网格涨。这个"迭代数 × 单步成本"的乘积公式是预条件子选型的唯一标准。
工程案例细节:百万自由度问题的求解器选型实录
百万自由度三维问题的选型实录:$n < 10^4$ → LAPACK 直接法全家桶;$n$ 大 + SPD + 椭圆 → CG + 多重网格($O(n)$ 的唯一现实途径);非对称 → GMRES + ILU;要极端特征值 → Lanczos/IRAM;内存不够直接法 → 迭代法 + 好预条件。这张决策速查表是"选算法"的肌肉记忆——先回答矩阵的规模、稀疏性、对称性,答案自动落位。
例题
对第 1 节的两弹簧问题改用罚函数法施加 $u_1 = 0$:在 $K_{11}$ 上加大数 $\alpha = 10^{10}$。写出修改后的方程并说明罚值过小的后果。
解答
修改后第一个方程:
即约束以"近似"方式满足——位移约 $1.5\ \mathrm{nm}$ 而非严格零。
罚值的影响:
- 太小(如 $\alpha = 10^2$):$u_1 = 0.5u_2$,约束基本失效;
- 太大(如 $\alpha = 10^{30}$):方程组条件数爆炸,浮点求解丢精度;
- 经验:$\alpha \sim 10^{7\sim10}\times$ 平均对角元。
- 对照:删行删列法精确且不病态,但破坏矩阵带状结构——商业代码常用 MPC/乘子法折中。