Skip to content
Gains Summary
Main Navigation 首页 / Home
C++ 编程 / C++ Programming
系统与高性能 / Systems & Performance
Web 开发 / Web Development
人工智能 / Artificial Intelligence
工业软件 / Industrial Software
其他内容 / Other Topics
C++ 编程 / C++系统与性能 / SystemsWeb 开发 / Web人工智能 / AI工业软件 / Industrial

外观

Sidebar Navigation

← 工业软件 / Industrial Software

基础与架构 / Foundations & Architecture

1. 工业软件基础与架构 / Industrial Software Fundamentals and Architecture

2. 工业软件概述 - 认识现代制造业的"大脑" / Industrial Software as the Brain of Modern Manufacturing

3. CAD 计算机辅助设计 - 工业设计的起点 / Computer-Aided Design as the Starting Point of Industrial Design

4. CAE 计算机辅助工程 - 工业仿真的核心 / Computer-Aided Engineering as the Core of Industrial Simulation

5. 前处理与后处理 - CAE 仿真的两端 / Pre-Processing and Post-Processing in CAE Simulation

6. 求解器基础 - CAE 软件的"引擎" / Solvers as the Computational Engine of CAE Software

7. 主流工业软件介绍 - 江湖门派一览 / An Overview of Major Industrial Software Platforms

8. 工业软件文件格式 - 数据流转的"通行证" / Industrial Software File Formats for Data Interoperability

9. 技术栈与开发语言 - 工业软件开发的技术基础 / Technology Stacks and Programming Languages for Industrial Software

10. 软件架构详解 - 工业软件的"骨骼" / Software Architecture as the Skeleton of Industrial Applications

11. CAE 前处理-求解流水线 — 架构设想 / An Architectural Design for a CAE Preprocessing-to-Solver Pipeline

12. 基于 OCC、VTK、Gmsh 与 CalculiX 的前处理到求解闭环程序初步架构设想 / A Preliminary FEA Architecture with OCC, VTK, Gmsh, and CalculiX

本页目录

求解器基础 - CAE 软件的"引擎" / Solvers as the Computational Engine of CAE Software ​

日期:2026-04-29 标签:#求解器 #线性求解 #非线性 #牛顿法 #并行计算 前置知识:CAE 计算机辅助工程


本章目标 ​

  • 理解求解器的工作原理
  • 掌握线性方程组求解方法
  • 理解非线性问题的求解
  • 了解特征值分析方法
  • 认识并行计算在求解中的应用

第1部分:求解器概述 ​

1.1 什么是求解器? ​

求解器 = Solver

CAE 软件中负责核心数值计算的模块,是软件的"引擎"。

┌─────────────────────────────────────────────────────────────────────────────┐
│                           CAE 软件架构                                         │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   前处理 → ┌─────────────────┐ → 后处理                                    │
│            │     求解器       │                                            │
│            │                 │                                            │
│            │  方程组求解     │                                            │
│            │  迭代收敛控制   │                                            │
│            │  并行计算管理   │                                            │
│            └─────────────────┘                                            │
│                                                                             │
│   求解器 = 数值计算核心,决定分析能力和性能                                    │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

1.2 求解器分类 ​

┌─────────────────────────────────────────────────────────────────────────────┐
│                           求解器分类体系                                     │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  按问题类型分:                                                              │
│  ├── 结构求解器                                                             │
│  │   ├── 静力学求解器                                                     │
│  │   ├── 动力学求解器                                                     │
│  │   └── 非线性求解器                                                     │
│  ├── CFD 求解器                                                           │
│  │   ├── 压力修正法 (SIMPLE)                                              │
│  │   ├── 密度基求解器                                                     │
│  │   └── 涡流求解器                                                       │
│  ├── 热求解器                                                              │
│  └── 电磁求解器                                                            │
│                                                                             │
│  按数学方法分:                                                              │
│  ├── 直接求解器                                                            │
│  │   └── 高斯消元、LU分解                                                 │
│  └── 迭代求解器                                                            │
│      ├── 共轭梯度法 (CG)                                                  │
│      ├── GMRES                                                             │
│      └── 多重网格法                                                        │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

第2部分:线性方程组求解 ​

2.1 有限元基本方程 ​

回顾:有限元分析最终归结为求解线性方程组。

[K]{u} = {F}

展开形式:
┌ K₁₁  K₁₂  K₁₃ ┐   ┌ u₁ ┐   ┌ F₁ ┐
│ K₂₁  K₂₂  K₂₃ │ · │ u₂ │ = │ F₂ │
└ K₃₁  K₃₂  K₃₃ ┘   └ u₃ ┘   └ F₃ ┘

刚度矩阵  节点位移   外载荷
1
2
3
4
5
6
7
8

物理含义:

  • K = 刚度矩阵(描述材料对变形的抵抗能力)
  • u = 未知位移
  • F = 外力

2.2 直接求解法 ​

原理:通过消元直接得到精确解。

高斯消元法:

步骤:把系数矩阵化为上三角,然后回代

示例:
┌ 2   1  │  u₁ ┐   ┌ 8 ┐      ← 方程组
│ 1   3  │  u₂ │ = │ 18 │
└         │     │   └   ┘

步骤1:消元(第二行 - 0.5×第一行)
┌ 2   1  │  u₁ ┐   ┌ 8 ┐
│ 0  2.5 │  u₂ │ = │ 14 │
└         │     │   └   ┘

步骤2:回代
u₂ = 14 / 2.5 = 5.6
u₁ = (8 - 1×5.6) / 2 = 1.2

答案:u₁ = 1.2, u₂ = 5.6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

LU 分解法:

原理:把 [K] = [L][U],其中 L 是下三角,U 是上三角

[K] = ┌ 2   1 ┐
      └ 1   3 ┘

分解为:
[L] = ┌ 1      ┐    [U] = ┌ 2    1   ┐
      └ 0.5  1 ┘          └ 0   2.5 ┘

然后:
1. 求 y: [L]{y} = {F}
2. 求 u: [U]{u} = {y}
1
2
3
4
5
6
7
8
9
10
11
12

直接法的特点:

优点缺点
求解精确(数值误差仅来自舍入)内存占用大 O(n²)
对病态矩阵稳定计算量 O(n³)
不需要迭代大规模问题效率低

2.3 迭代求解法 ​

原理:从一个初始估计开始,逐步逼近真解。

共轭梯度法 (CG):

核心思想:在每次迭代中,选择一个与之前所有方向共轭的方向

算法流程:

1. 初始化
   x₀ = 初始估计(通常为0)
   r₀ = b - Ax₀   (残差)
   p₀ = r₀        (搜索方向)

2. 迭代(直到收敛)
   for k = 0, 1, 2, ...
   
   αₖ = (rₖ · rₖ) / (pₖ · Apₖ)    ← 计算步长
   
   xₖ₊₁ = xₖ + αₖ · pₖ              ← 更新解
   
   rₖ₊₁ = rₖ - αₖ · Apₖ              ← 更新残差
   
   if ||rₖ₊₁|| < ε: 收敛,退出
   
   βₖ = (rₖ₊₁ · rₖ₊₁) / (rₖ · rₖ)  ← 计算方向更新因子
   
   pₖ₊₁ = rₖ₊₁ + βₖ · pₖ            ← 更新搜索方向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

收敛判定:

残差范数 ||r|| / ||b|| < 容差(通常 10⁻⁶)

或者:
位移增量 ||Δu|| / ||u|| < 容差
1
2
3
4

迭代法的特点:

优点缺点
内存效率高需要迭代,可能不收敛
计算量约 O(n·iter)收敛速度依赖问题特性
适合稀疏矩阵需要预条件子加速

2.4 预条件子 ​

为什么需要预条件子?

病态矩阵的例子:
┌ 1.00   0.99 ┐
└ 0.99   0.98 ┘

行列式接近0,条件数很大
直接求解也可能不准,迭代法收敛很慢

预条件子 = 变换矩阵,让问题"好解"一些
1
2
3
4
5
6
7
8

常见预条件子:

1. 对角预条件子(最简单)
   M = diag(K)
   
2. 不完全LU分解 (ILU)
   近似 LU 分解,丢弃小元素
   
3. 代数多重网格 (AMG)
   层级粗化,加速收敛
1
2
3
4
5
6
7
8

第3部分:非线性求解 ​

3.1 什么是非线性? ​

线性 vs 非线性:

线性问题:
  F = K · u
  K 是常数,与 u 无关
  
非线性问题:
  F = K(u) · u
  K 是 u 的函数,随位移变化
1
2
3
4
5
6
7

非线性来源:

┌─────────────────────────────────────────────────────────────────────────────┐
│                           非线性类型                                         │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  1. 材料非线性                                                              │
│     材料应力-应变关系不是直线                                                │
│                                                                             │
│         σ                                                               │
│          ↑                                                               │
│          │           ╱                                                   │
│          │         ╱                                                     │
│          │       ╱                                                       │
│          │     ╱                                                         │
│          │   ╱   ← 塑性变形                                               │
│          │ ╱                                                             │
│          └──────────────────→ ε                                           │
│                                                                             │
│  2. 几何非线性                                                             │
│     大变形,位移影响几何形状                                                │
│                                                                             │
│     小变形:                                                               │
│       ═════════                                                           │
│                                                                             │
│     大变形:                                                               │
│       ═════════════╗                                                      │
│                    ╚════  变形后几何形状完全不同                           │
│                                                                             │
│  3. 边界非线性                                                             │
│     接触、摩擦、螺栓预紧                                                   │
│                                                                             │
│       ┌─────┐                                                            │
│       │     │ ← 接触对                                                  │
│       └─────┘                                                            │
│         ↓                                                                │
│       接触/分离状态变化                                                    │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

3.2 牛顿-拉夫森法 ​

原理:通过切线刚度迭代逼近非线性解。

迭代公式:

{K_T(uₖ)} · Δuₖ = F - K(uₖ) · uₖ
     ↑                 ↑
  切线刚度          残差力

uₖ₊₁ = uₖ + Δuₖ
1
2
3
4
5

算法流程:

┌─────────────────────────────────────────────────────────────────────────────┐
│                        牛顿-拉夫森迭代流程                                   │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  1. 初始化                                                                 │
│     u₀ = 0                                                                 │
│     施加总载荷 F                                                           │
│                                                                             │
│  2. 增量加载                                                               │
│     for 载荷步 i = 1 to N:                                                │
│                                                                             │
│     ΔF = F · i/N - F · (i-1)/N                                           │
│                                                                             │
│     for 迭代 j = 1 to max_iter:                                           │
│         │                                                                  │
│         ├── 计算 K_T(uⱼ)    ← 切线刚度                                   │
│         ├── 计算 R = F - K(uⱼ)·uⱼ  ← 残差力                             │
│         ├── if ||R|| < ε: 收敛,退出内循环                                │
│         ├── 求解 Δu = K_T⁻¹ · R                                          │
│         └── uⱼ₊₁ = uⱼ + Δu                                               │
│                                                                             │
│     3. 收敛后保存 u                                                        │
│                                                                             │
│  4. 输出结果                                                               │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

收敛判定:

准则条件说明
力残差||R|| / ||F|| < 0.001残余力很小
位移增量||Δu|| / ||u|| < 0.001位移变化很小
应变能ΔE / E < 0.001能量变化很小

图示:

    F
    ↑
    │        ╱│
    │      ╱  │
    │    ╱    │
    │  ╱      │
    │╱        │ ← 实际曲线
    │         ╲
    │          ╲
    │           ╲
    │            ╲  切线
    │             ╲╱
    │              ╲
    │               ╲___
    │                   ‾‾‾‾‾‾‾‾  近似曲线
    └────────────────────────→ u
    
    每次迭代:计算切线 → 求解增量 → 更新位移
    迭代直到近似曲线与实际曲线足够接近
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

3.3 收敛困难的原因 ​

常见不收敛情况:

1. 载荷步太大
   跳过了关键点(如载荷峰值)
   
2. 材料问题
   塑性流动、软化导致不收敛
   
3. 几何不稳定
   屈曲、 snap-through
   
4. 接触问题
   剧烈接触/分离
   
5. 模型错误
   约束不足、载荷施加错误
1
2
3
4
5
6
7
8
9
10
11
12
13
14

调试策略:

┌─────────────────────────────────────────────────────────────────────────────┐
│                           收敛调试策略                                       │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  策略1:减小载荷步长                                                        │
│     把 10 步改为 50 步,缓慢加载                                            │
│                                                                             │
│  策略2:开启线搜索                                                          │
│     自动调整迭代步长                                                        │
│                                                                             │
│  策略3:使用弧长法                                                          │
│     追踪复杂路径(如屈曲)                                                  │
│                                                                             │
│  策略4:检查模型                                                            │
│     约束是否充分、载荷是否合理                                               │
│                                                                             │
│  策略5:简化问题                                                            │
│     先求解线性问题,确认基本正确                                             │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

第4部分:特征值分析 ​

4.1 特征值问题 ​

方程:

[K]{φ} = λ[M]{φ}
1

物理含义:

  • K = 刚度矩阵
  • M = 质量矩阵
  • λ = 特征值(ω² = 固有频率的平方)
  • {φ} = 振型向量(固有振型)

应用:

  • 模态分析(固有频率、振型)
  • 屈曲分析(临界载荷)
  • 动力响应分析

4.2 求解方法 ​

Lanczos 方法(最常用):

特点:
- 专门用于稀疏矩阵
- 可以只求前几阶模态
- 效率高

算法:
1. 生成 Lanczos 向量
2. 在降维空间中求解
3. 反变换得到原空间振型
1
2
3
4
5
6
7
8
9

子空间迭代法:

特点:
- 同时迭代多个向量
- 适合求多阶模态

算法:
1. 初始化向量组
2. 交替迭代:
   - 用 K⁻¹ 乘(逆迭代)
   - 用 M 正交化(质量归一)
3. 收敛后得到特征对
1
2
3
4
5
6
7
8
9
10

4.3 模态分析示例 ​

问题:求解悬臂梁的前三阶固有频率

已知:
  长度 L = 1m
  截面 0.1m × 0.2m
  材料 钢 (E = 200 GPa, ρ = 7850 kg/m³)

理论解:
  f₁ = 1.875² · EI / (2π · L² · ρA) ≈ 12 Hz
  f₂ = 4.694² · EI / (2π · L² · ρA) ≈ 75 Hz
  f₃ = 7.855² · EI / (2π · L² · ρA) ≈ 210 Hz

数值解(FEA):
  f₁ = 11.8 Hz
  f₂ = 74.2 Hz
  f₃ = 207.5 Hz
  
  误差 < 2%,验证正确
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

第5部分:并行计算 ​

5.1 为什么需要并行? ​

问题复杂度增长:

100万自由度   →   10秒
1000万自由度 →   1000秒 ≈ 17分钟(单机困难)
1亿自由度   →   100000秒 ≈ 27小时(必须并行)
1
2
3
4
5

并行加速比:

┌─────────────────────────────────────────────────────────────────────────────┐
│                           并行加速比                                        │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  理想情况:                                                                │
│      S(p) = p                                                              │
│                                                                             │
│  实际情况:                                                                │
│      S(p) = p / (1 + σ(p-1))   ← Amdahl定律                              │
│                                                                             │
│      其中 σ 是不可并行部分的比例                                             │
│                                                                             │
│      σ = 5%:   8核加速 ≈ 5.7倍                                            │
│      σ = 10%:  8核加速 ≈ 4.7倍                                            │
│      σ = 20%:  8核加速 ≈ 3.5倍                                            │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

5.2 并行计算框架 ​

MPI(Message Passing Interface):

多进程,每个进程独立内存

进程0 ──── 通信 ──── 进程1
   │                    │
   │   ──── 通信 ────   │
   │                    │
进程2 ──── 通信 ──── 进程3

优点:扩展性好,适合集群
缺点:编程复杂
1
2
3
4
5
6
7
8
9
10

OpenMP:

多线程,共享内存

      线程0 ──┐
      线程1 ──┼── 共享内存
      线程2 ──┤
      线程3 ──┘

优点:编程简单,共享数据方便
缺点:内存共享限制扩展性
1
2
3
4
5
6
7
8
9

CUDA / GPU加速:

CPU:少量强大核心
GPU:大量简单核心(数千个)

适合:大规模矩阵运算、蒙特卡洛、神经网络

求解器中的 GPU 加速:
- 矩阵-向量乘
- 稀疏矩阵运算
- 预条件子应用
1
2
3
4
5
6
7
8
9

5.3 分布式求解 ​

域分解方法:

┌─────────────────────────────────────────────────────────────────────────────┐
│                          域分解并行                                         │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  把网格分成多个区域,每个区域分配给一个处理器                                 │
│                                                                             │
│     ┌────────┬────────┐                                                   │
│     │ 区域1  │ 区域2  │   ← 处理器1                                       │
│     │ CPU 1  │ CPU 2  │                                                   │
│     ├────────┼────────┤                                                   │
│     │ 区域3  │ 区域4  │   ← 处理器3                                       │
│     │ CPU 3  │ CPU 4  │                                                   │
│     └────────┴────────┘                                                   │
│           ↑                                                               │
│           │                                                               │
│      边界信息交换                                                           │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

第6部分:主流求解器介绍 ​

6.1 结构求解器 ​

求解器公司特点
Ansys MechanicalAnsys通用、结构完整
Abaqus StandardSIMULIA隐式、非线性强
Abaqus ExplicitSIMULIA显式、接触、高速
NX NastranSiemens航空航天、背书

6.2 CFD 求解器 ​

求解器公司特点
ANSYS FluentAnsys工业主流
ANSYS CFXAnsys耦合强
STAR-CCM+Siemens自动网格
OpenFOAM开源免费、定制

6.3 求解器技术对比 ​

┌─────────────────────────────────────────────────────────────────────────────┐
│                          隐式 vs 显式求解                                   │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  隐式求解 (Implicit):                                                      │
│  ├─ 特点:K(u)·Δu = R                                                     │
│  ├─ 优点:时间步长大、静态问题高效                                         │
│  ├─ 缺点:每次迭代要解方程组                                               │
│  └─ 代表:Abaqus Standard、Ansys Mechanical                               │
│                                                                             │
│  显式求解 (Explicit):                                                      │
│  ├─ 特点:M·ü = F - K·u                                                   │
│  ├─ 优点:无须求解方程组、接触容易处理                                     │
│  ├─ 缺点:时间步长受限制、动态问题专用                                     │
│  └─ 代表:Abaqus Explicit、LS-DYNA                                        │
│                                                                             │
│  选择建议:                                                                │
│  - 静态/准静态 → 隐式                                                      │
│  - 高速碰撞/成形 → 显式                                                    │
│  - 复杂接触 → 看软件擅长                           │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

核心总结 ​

总结1:求解器类型 ​

线性求解:
  直接法:高斯消元、LU分解(精确、内存大)
  迭代法:CG、GMRES(省内存、需收敛)

非线性求解:
  牛顿-拉夫森:切线刚度迭代
  弧长法:处理屈曲等复杂路径

特征值求解:
  Lanczos:稀疏矩阵、求低阶模态
  子空间迭代:求多阶模态
1
2
3
4
5
6
7
8
9
10
11

总结2:收敛控制 ​

收敛准则:
- 力残差 < 容差
- 位移增量 < 容差
- 能量变化 < 容差

加速收敛:
- 预条件子
- 自动时间步长
- 弧长法
1
2
3
4
5
6
7
8
9

总结3:并行策略 ​

单机多核:OpenMP
多机集群:MPI
GPU加速:CUDA
域分解:每个区域独立求解
1
2
3
4

章节测试 ​

测试1:基本方程 ​

有限元分析的三大基本方程之一是什么?各符号含义?

测试2:直接法 vs 迭代法 ​

直接求解法和迭代求解法各有什么优缺点?

测试3:牛顿法 ​

牛顿-拉夫森法中,"切线刚度"是什么?为什么要用切线刚度?

测试4:收敛判定 ​

非线性分析中,如何判断迭代是否收敛?

测试5:显式 vs 隐式 ​

什么情况下应该选择显式求解器而不是隐式求解器?


参考答案 ​

测试1答案 ​

基本方程 [K]{u} = {F},其中 [K] 是刚度矩阵,{u} 是节点位移向量,{F} 是外载荷向量。

测试2答案 ​

  • 直接法:精确、稳定,但内存占用大、计算量 O(n³);适合中小规模问题
  • 迭代法:内存效率高、计算量约 O(n·iter),但需要迭代、可能不收敛;适合大规模问题

测试3答案 ​

切线刚度是当前位移状态下的瞬时刚度矩阵。非线性问题中,刚度随位移变化,用切线刚度能更准确地描述当前状态的力学响应。

测试4答案 ​

通过力残差、位移增量或能量变化与容差比较。当这些值小于设定的容差(如 0.001)时,认为迭代收敛。

测试5答案 ​

应该选择显式求解器的情况:

  • 高速碰撞、爆炸、冲击问题
  • 大规模接触问题
  • 成形加工(如冲压)
  • 瞬态动力学问题

原因:显式求解器不需要在每个时间步求解线性方程组,对接触问题处理更稳定,虽然时间步长受限但这类问题天然需要小步长。


相关笔记 ​

  • [[03 - CAE 计算机辅助工程]] - 仿真基础
  • [[04 - 前处理与后处理]] - 前后处理
  • [[08 - 技术栈与开发语言]] - 求解器开发技术

下一步学习 ​

  • [ ] 阅读 06 - 主流工业软件介绍

学习状态:完成

最后更新于:

Pager
上一篇5. 前处理与后处理 - CAE 仿真的两端 / Pre-Processing and Post-Processing in CAE Simulation
下一篇7. 主流工业软件介绍 - 江湖门派一览 / An Overview of Major Industrial Software Platforms

持续记录,持续成长

Copyright © Tidenflow