4. 拓扑优化算法与求解策略

拓扑优化在数学上通常被写成带约束的非线性规划问题:在有限材料体积(或质量)约束下,使结构柔度最小、刚度最大。设计变量是每个单元的相对密度 x_e ∈ [0,1],目标函数 c(x)=U^T K U,约束为 V(x)=Σ x_e v_e ≤ V*。真正决定求解能否收敛、结果是否可用的,是优化算法与求解策略。本节围绕三类主流算法——OC准则法、MMA移动渐近线法、SQP序列二次规划——讲清它们的适用条件、迭代机制、收敛判据以及数值稳定性处理。

一、OC准则法:从最优性条件直接构造更新格式

OC(Optimality Criteria,最优准则法)的核心思想是:对凸性较好的柔度最小化问题,写出拉格朗日函数并对设计变量求导,令其满足KKT条件,从而得到显式的密度更新公式。对单约束(体积约束)问题,最优性条件可写为

B_e = -∂c/∂x_e / (λ · ∂V/∂x_e) = 1
x_e^new = x_e · B_e^η   (η 为阻尼系数,常取 0.5)

其中 ∂c/∂x_e ≈ -p·x_e^(p-1)·u_e^T k_e^0 u_e,p 为SIMP惩罚因子(常取3)。由于 B_e 依赖拉格朗日乘子 λ,实际实现采用二分法在体积约束上求解 λ:给定 λ 计算所有 x_e^new,检查体积是否满足,不满足则调整 λ 上下界继续二分。OC法每步只需求解一次有限元,迭代极快,适合单约束、目标凸性好的柔度问题。但它难以直接处理多约束、非凸目标或应力约束,因此工程中常作为“快速起步”或与其它算法组合使用。

二、MMA移动渐近线法:用凸近似替代原问题

MMA(Method of Moving Asymptotes)是拓扑优化中最稳健的通用算法之一。它不直接求解原问题,而是在每次迭代中构造一个可分离的凸近似子问题:

min  f̃_0(x) = f_0(x^k) + Σ [ p_ij/(U_j - x_j) + q_ij/(x_j - L_j) ]
s.t. f̃_i(x) ≤ 0,  i=1..m
     α_j ≤ x_j ≤ β_j

其中 L_j、U_j 是移动渐近线,控制近似的保守程度。当迭代点接近收敛时,渐近线收紧,近似更贴近原函数;当迭代震荡时,渐近线放宽,增强全局性。MMA的显著优势是:天然支持多约束(体积、应力、位移、频率等可同时施加),且子问题是凸的,可用对偶法高效求解。在拓扑优化中,MMA常与SIMP或RAMP插值配合,处理应力约束、多工况等复杂场景。其代价是每次迭代需计算目标与约束的灵敏度,并维护渐近线参数,实现复杂度高于OC。

三、SQP序列二次规划:通用但计算代价高

SQP(Sequential Quadratic Programming)在每个迭代点将原问题近似为二次规划子问题:目标函数用拉格朗日函数的二次近似,约束用线性近似,然后求解QP得到搜索方向,再通过线搜索或信赖域确定步长。SQP的优点是理论收敛性好、能处理一般非线性约束,适合约束数量不多但非线性强的场景。但在拓扑优化中,设计变量动辄数万甚至百万,SQP每次迭代需构造并求解大规模QP,计算与存储代价高,且对灵敏度精度敏感。因此SQP更多用于变量规模较小的尺寸/形状优化,或作为拓扑优化后处理阶段的精细调整,而非大规模拓扑迭代的主力。

拓扑优化三类算法:迭代机制与适用边界 OC 准则法 KKT条件 → 显式更新 x_new = x · B^η 二分法求拉格朗日乘子 λ 满足体积约束 V(x)=V* 阻尼 η=0.5 抑制震荡 每步仅一次FEM求解 适用 单约束柔度最小化 凸性好、迭代快 多约束/应力约束受限 MMA 移动渐近线法 构造可分离凸近似 p/(U-x) + q/(x-L) 渐近线 L/U 自适应调整 收敛收紧 / 震荡放宽 对偶法求解凸子问题 支持多约束并行 适用 多约束:体积+应力+位移 大规模拓扑优化主力 需灵敏度与渐近线维护 SQP 序列二次规划 拉格朗日二次近似 约束线性化 求解QP得搜索方向 线搜索/信赖域定步长 一般非线性约束 理论收敛性好 适用 变量规模较小的尺寸/形状优化 拓扑后精细调整 大规模QP代价高 收敛判据:|Δc|/c < 1e-3 且 max|Δx| < 0.01 且体积误差 < 0.1% | 数值稳定:密度过滤 + 灵敏度过滤 + 阻尼 η

四、收敛判据:什么时候可以停

算法迭代不能无限进行,必须设定明确的停止条件。工程中常用三重判据同时判断:

  • 目标函数相对变化:|c^k - c^(k-1)| / c^k < ε_c,常取 ε_c = 1e-3。它反映结构柔度是否已趋于稳定。
  • 设计变量最大变化:max|x_e^k - x_e^(k-1)| < ε_x,常取 ε_x = 0.01。它防止目标函数因局部波动而误判收敛。
  • 约束违反量:体积约束误差 |V(x)-V*|/V* < 0.1%。若约束未满足,即使目标稳定也不能停止。

此外还需设置最大迭代次数(如200~500)和灵敏度检查间隔。若连续多次迭代目标函数不降反升,应检查是否出现棋盘格、网格依赖或灵敏度符号错误,而不是简单增加迭代次数。

五、数值稳定性:让迭代不震荡、不病态

拓扑优化最常见的数值问题包括棋盘格、网格依赖、局部极值和灰度单元。对应的稳定化策略有:

  • 密度过滤:对单元密度做加权平均,x̃_e = Σ w(r) x_e / Σ w(r),权重常取 w = max(0, r_min - dist),r_min 取2~3倍单元尺寸。它消除棋盘格并缓解网格依赖。
  • 灵敏度过滤:对 ∂c/∂x_e 做同样过滤,保持目标函数与设计变量的一致性,避免过滤后灵敏度失配。
  • 阻尼与步长限制:OC中 η=0.5,MMA中限制 x 的移动上限(如 move=0.2),防止单步密度跳变过大导致震荡。
  • 灰度抑制:通过SIMP惩罚因子 p 从1逐步增加到3,或采用连续化策略,使中间密度在迭代后期被推向0/1。
实践建议:对于以柔度最小化为目标的单约束问题,优先用OC法快速得到初始拓扑;若需施加应力、位移或频率约束,切换到MMA;当变量规模较小且约束非线性强时,再用SQP做局部精修。无论哪种算法,密度过滤和灵敏度过滤都应默认开启,收敛判据至少同时检查目标变化与约束违反量。

理解这三类算法的差异,本质上是理解“问题结构决定算法选择”:OC利用凸性和单约束构造显式更新,MMA用凸近似把多约束问题拆成可解子问题,SQP用二次模型逼近一般非线性问题。收敛判据和数值稳定性则是保证迭代从“能算”走向“算得对、算得稳”的最后一道关口。