4. OptiStruct优化三要素

OptiStruct 的优化问题在数学上可以统一写成:在满足一组约束函数的前提下,寻找一组设计变量,使目标函数取得极小值。理解这句话的关键,是把“设计变量、约束函数、目标函数”三要素分别落到具体的卡片、具体的响应和具体的数值上。本节重点讨论如何同时设置强度约束与刚度目标,也就是把“不许坏”和“尽量刚”这两类要求放进同一个优化模型。

一、三要素在 OptiStruct 中的对应关系

设计变量(DESVAR)是优化器可以自由调整的量。在尺寸优化中,它通常是壳单元的厚度或梁单元的截面属性;在形貌优化中,它是加强筋的起筋高度;在拓扑优化中,它是每个单元的密度。设计变量必须给出初值、上下限,并绑定到实际属性上,否则优化器无法把变量变化传递到有限元模型。

约束函数(DRESP1/DRESP2 + DCONSTR)是对设计变量变化结果的限制。它由响应(Response)定义,再由约束卡片引用。强度约束通常来自应力响应,刚度约束通常来自位移响应或柔度响应。约束必须给出上下限,例如应力上限 250 MPa、某点位移上限 0.8 mm。

目标函数(DRESP1 + DESOBJ)是优化器要最小化的量。刚度目标最常用的写法是最小化柔度(Compliance),因为柔度越小,结构整体刚度越大;也可以直接最小化某个关键节点的位移。强度目标一般不作为目标函数,而是作为约束,因为强度是“不许超过”的门槛,而不是“越小越好”的追求。

二、强度约束与刚度目标同时设置的逻辑

同时设置强度约束与刚度目标时,最容易出现的误区是把两者都写成约束,或者都写成目标。正确的做法是:刚度作为目标函数,强度作为约束函数。这样优化器会在“尽量提高刚度”的方向上搜索,同时每一步都检查应力是否越界。如果应力越界,优化器会调整设计变量,把应力拉回允许范围内,再继续追求刚度。

从数学上看,这是一个带约束的最小化问题:

min  C(x) = F^T U(x)          // 柔度最小化,即刚度最大化
s.t. σ_max(x) ≤ σ_allow        // 强度约束
     x_lower ≤ x ≤ x_upper     // 设计变量上下限
     (可选)U_target(x) ≤ U_allow  // 位移约束

其中 x 是设计变量向量,C 是柔度,σ_max 是最大应力,σ_allow 是许用应力。注意柔度与刚度互为倒数关系:柔度越小,刚度越大。因此“最小化柔度”等价于“最大化刚度”。

三、实操:从响应到约束再到目标的完整定义

下面以一个支架尺寸优化为例,说明如何在 HyperMesh/OptiStruct 中完成三要素定义。支架由 8 个壳单元组组成,设计变量为各组厚度,初始厚度 2.0 mm,上下限 1.0~4.0 mm。材料为钢,弹性模量 210 GPa,泊松比 0.3,许用应力 250 MPa。载荷为端部 500 N 向下集中力,约束为底部四个螺栓孔全约束。

第一步:定义设计变量。在 Optimization 面板中创建 DESVAR,每个单元组对应一个变量,初值 2.0,下限 1.0,上限 4.0。然后用 DVPREL1 把变量与 PSHELL 的 T 字段关联。这一步决定了优化器“能改什么”。

第二步:定义响应。创建两个响应:一个应力响应,类型为 static stress,选择所有单元,输出 von Mises 应力;一个柔度响应,类型为 compliance,选择整个模型。应力响应用于强度约束,柔度响应用于刚度目标。

第三步:定义约束。用 DCONSTR 引用应力响应,设置上限 250 MPa。注意应力约束通常需要设置下限为负无穷或一个很小的值,因为优化器只关心“不超过”。如果还要控制位移,可以再创建一个位移响应,引用关键节点,设置上限 0.8 mm。

第四步:定义目标。用 DESOBJ 引用柔度响应,设置目标为 minimize。此时优化模型的三要素就完整了:设计变量是 8 个厚度,约束是应力不超过 250 MPa,目标是最小化柔度。

第五步:提交计算与结果判读。提交 OptiStruct 后,在 .out 文件中查看优化迭代历史。重点关注三列:目标函数值(柔度)、最大应力、设计变量变化。如果柔度持续下降且应力始终低于 250 MPa,说明优化正常收敛。如果应力在某一代突然超过 250 MPa,优化器会在下一代调整厚度,把应力压回约束边界附近。最终结果中,如果柔度比初始下降 30% 以上,且最大应力在 240~250 MPa 之间,说明刚度目标与强度约束都得到了有效利用。

强度约束与刚度目标同时设置的优化模型结构 设计变量 DESVAR 8 个壳单元组厚度 初值 2.0 mm 下限 1.0 mm 上限 4.0 mm DVPREL1 → PSHELL.T 决定“能改什么” 响应 Response 应力响应:von Mises 柔度响应:Compliance (可选)位移响应 DRESP1 定义 连接变量与结果 决定“看什么” 约束与目标 DCONSTR:σ ≤ 250 MPa DESOBJ:min 柔度 (可选)U ≤ 0.8 mm 强度=约束,刚度=目标 决定“追求什么、不许什么” 优化器搜索方向 OptiStruct 优化器 迭代搜索:调整 x → 计算响应 → 检查约束 → 更新目标 结果判读要点 柔度下降 ≥ 30% 且 σ_max 在 240~250 MPa 之间 → 刚度目标与强度约束均有效利用 若 σ_max 远低于 250 MPa → 强度约束未激活,可放宽或检查载荷 变量更新反馈 约束检查反馈

四、常见问题与调整策略

实际设置中,最常见的问题是强度约束始终不激活。如果优化结束后最大应力只有 180 MPa,远低于 250 MPa,说明强度约束没有起到作用,此时刚度目标会独自驱动优化,结果可能偏保守。可以检查载荷是否偏小、许用应力是否偏大,或者把应力约束改为更严格的 200 MPa 再试一次。

另一个问题是应力约束导致优化震荡。当应力约束很紧、设计变量上下限又很窄时,优化器可能在“满足应力”和“降低柔度”之间反复跳动。此时可以适当放宽变量上限,或者把应力约束从 250 MPa 放宽到 260 MPa,给优化器更多可行空间。也可以先做一次无强度约束的刚度优化,观察应力分布,再决定约束值。

实用建议:同时设置强度约束与刚度目标时,建议先单独跑一次“仅刚度目标”的优化,记录最大应力和柔度下降幅度;再单独跑一次“仅强度约束”的优化,记录柔度变化。两次结果对比后,再确定同时设置时的约束值和变量范围,这样更容易判断两个要求是否冲突。

最后需要强调,设计变量、约束函数与目标函数三者不是孤立的卡片,而是一条完整的传递链:设计变量改变属性,属性改变结构响应,响应被约束引用或被目标引用,优化器根据约束是否满足和目标是否下降来决定下一步变量调整方向。只有把这条链打通,强度约束与刚度目标才能真正协同工作。