3. 有限元分析与灵敏度分析

在拓扑尺寸形状联合优化中,有限元分析负责回答“当前设计有多好”,灵敏度分析负责回答“设计变量往哪个方向改会更好”。两者构成优化迭代的内循环:每一轮先求解结构响应,再计算目标与约束对全部设计变量的梯度,最后交给优化器更新变量。本节围绕这条主线,说明结构响应求解、伴随法灵敏度推导,以及如何把拓扑、尺寸、形状三类变量纳入统一的梯度计算框架。

一、结构响应求解:优化循环中的正分析

以线弹性静力问题为例,离散后的平衡方程为 K(d)u = f,其中 K 为整体刚度矩阵,u 为节点位移向量,f 为外载荷向量,d 为设计变量向量。拓扑优化中 d 通常是单元密度,尺寸优化中是板厚、截面尺寸等,形状优化中是控制边界形状的节点坐标或参数。三类变量进入 K 的方式不同,但求解位移的方程形式一致。

实际实现时,刚度矩阵由单元刚度矩阵组装:K = Σ (E_e(d) · k_e),其中 k_e 为单位弹性模量下的单元刚度矩阵,E_e 为经插值模型修正后的单元模量。拓扑优化常用 SIMP 插值 E_e = E_min + ρ_e^p (E_0 − E_min),p 一般取 3;尺寸变量可直接缩放单元厚度或截面惯性矩;形状变量则通过网格节点坐标扰动改变 k_e 的几何相关项。求解得到 u 后,即可计算目标函数(如柔顺度 c = fᵀu)和约束(如体积 V = Σ ρ_e v_e、应力、位移限值)。

正分析只需一次分解即可支持后续所有灵敏度计算。对中等规模问题,建议对 K 做 Cholesky 或 LDLᵀ 分解并复用;伴随法灵敏度计算中的转置求解可直接复用同一分解,这是伴随法在工程上高效的关键原因。

二、伴随法灵敏度推导

设目标函数为 g(d) = G(u(d), d),约束为 h(d) = H(u(d), d) ≤ 0。对设计变量求全导数:

dg/dd_i = ∂G/∂d_i + (∂G/∂u)ᵀ · du/dd_i

其中 du/dd_i 由平衡方程对 d_i 求导得到:

K · du/dd_i = ∂f/∂d_i − (∂K/∂d_i) · u

若对每个设计变量都解一次上述方程,代价为“变量数 × 一次正分析”,对拓扑优化动辄上万变量不可接受。伴随法引入拉格朗日乘子 λ,构造 L = G + λᵀ(f − Ku),利用 K 的对称性可得伴随方程:

K · λ = ∂G/∂u

于是灵敏度简化为:

dg/dd_i = ∂G/∂d_i + λᵀ(∂f/∂d_i − (∂K/∂d_i) · u)

伴随法的核心优势在于:λ 只需求解一次,与设计变量个数无关。对每个设计变量,只需计算 ∂K/∂d_i 与 u 的乘积,即单元级的局部量。以 SIMP 柔顺度为例,∂G/∂u = f,故 λ = u,灵敏度退化为经典的 dc/dρ_e = −p ρ_e^(p−1)(E_0 − E_min) u_eᵀ k_e u_e,这也是 99 行拓扑优化代码中灵敏度公式的来源。

三、三类变量梯度的统一计算框架

拓扑、尺寸、形状变量的差异只体现在 ∂K/∂d_i 的具体形式上,伴随法的整体流程完全一致。可以建立如下统一框架:

  • 统一输入:设计变量向量 d、当前位移 u、伴随向量 λ、单元级刚度矩阵 k_e 及其对变量的导数。
  • 统一伴随方程:Kλ = ∂G/∂u,与变量类型无关。
  • 统一梯度组装:dg/dd_i = ∂G/∂d_i + λᵀ(∂f/∂d_i − (∂K/∂d_i)u)。
  • 变量专属导数:拓扑变量用 ∂E_e/∂ρ_e;尺寸变量用 ∂k_e/∂t_e;形状变量用 ∂k_e/∂x_n(节点坐标导数)。

形状变量的导数最复杂,因为节点坐标扰动会同时改变单元形状与映射雅可比。工程上常用两种处理:一是解析法,直接对等参元刚度积分求导;二是半解析法,用有限差分近似 ∂k_e/∂x_n,再代入统一框架。半解析法实现简单,但步长选择需谨慎,过大会引入截断误差,过小会放大舍入误差,一般取单元特征尺寸的 1e-4 至 1e-6 量级做试算。

拓扑 / 尺寸 / 形状联合优化的统一灵敏度计算框架 设计变量 d 拓扑变量 ρ_e(单元密度) 尺寸变量 t_e(板厚/截面) 形状变量 x_n(节点坐标) 正分析:结构响应求解 K(d) · u = f → 位移 u → 目标 c = fᵀu,约束 V、σ、δ K = Σ E_e(d) · k_e,SIMP 插值 E_e = E_min + ρ_e^p (E_0 − E_min) 伴随方程求解(与变量个数无关) K · λ = ∂G/∂u → 伴随向量 λ(复用 K 的分解) 柔顺度目标:∂G/∂u = f,故 λ = u 统一梯度组装 dg/dd_i = ∂G/∂d_i + λᵀ( ∂f/∂d_i − (∂K/∂d_i) · u ) 拓扑:∂E_e/∂ρ_e | 尺寸:∂k_e/∂t_e | 形状:∂k_e/∂x_n(解析或半解析) 优化器更新 d,进入下一轮迭代

四、统一框架的实现要点与数值验证

把三类变量放进同一套代码时,建议按“变量—单元—导数”三层组织数据结构。变量层维护 d 及其上下限;单元层缓存每个单元的 k_e、u_e 和 λ_e;导数层提供统一接口 compute_dKdd(var_type, elem_id),由具体变量类型分派到对应公式。这样新增一类变量时,只需实现该接口,正分析与伴随求解代码无需改动。

灵敏度正确性必须验证。最直接的方法是与全局有限差分对比:取一个设计变量 d_i,施加小扰动 Δ,重新做一次正分析得到 g(d_i+Δ),用 (g(d_i+Δ) − g(d_i−Δ)) / (2Δ) 作为参考值,与伴随法结果比较。若相对误差在 1e-4 至 1e-6 量级,通常认为推导与实现一致。对形状变量,由于网格扰动可能引起单元畸变,建议同时检查雅可比行列式是否始终为正,避免出现负体积单元导致分析失败。

伴随法假设 K 对称且与 u 无关。若引入接触、几何非线性或非对称约束,伴随方程需相应修改,不能直接套用 Kλ = ∂G/∂u。此外,多约束问题需为每个约束单独求解一次伴随向量,计算量随约束数线性增长,但与设计变量数无关。

综合来看,统一框架的价值在于把“变量类型差异”隔离在单元导数层,而把“响应求解—伴随求解—梯度组装”这条公共链路固定下来。掌握这条链路后,无论面对密度法拓扑优化、尺寸参数优化还是形状参数化优化,都能用同一套代码骨架完成灵敏度计算,并借助有限差分做交叉验证,保证优化迭代稳定收敛。