2. 简支梁体积约束下的刚度最大化

简支梁体积约束下的刚度最大化 学习卡片

简支梁刚度最大化:从工况到最优构型

本例对象为跨度 L=120 mm、高 H=40 mm 的二维简支梁,左端下缘铰支(约束 x、y 位移),右端下缘滚动支承(约束 y 位移),跨中上缘作用集中力 F=100 N,方向竖直向下。设计域离散为 120×40 的四边形单元网格,材料弹性模量 E=1(归一化),泊松比 ν=0.3,体积分数上限 f 分别取 0.3、0.4、0.5 进行对比。

刚度最大化等价于柔度最小化。采用 SIMP 插值模型,单元刚度按惩罚因子 p=3 在实体与空洞之间过渡,优化列式为:

min  c(ρ) = U^T K U = Σ_e (ρ_e)^p · u_e^T k0 u_e
s.t. K U = F
     Σ_e ρ_e · v_e / V0 ≤ f
     0 < ρ_min ≤ ρ_e ≤ 1

其中 ρ_e 为单元相对密度,ρ_min=0.001 防止刚度矩阵奇异,v_e 为单元体积,V0 为设计域总体积。灵敏度由伴随法得到:∂c/∂ρ_e = −p·(ρ_e)^(p−1)·u_e^T k0 u_e。采用最优准则(OC)更新密度,并配合灵敏度过滤(过滤半径 r_min=2 个单元)抑制棋盘格。

关键参数:E0=1,ν=0.3,p=3,ρ_min=0.001,r_min=2,OC 阻尼系数 η=0.5,移动限 0.2,收敛判据为密度最大变化量 < 0.01 或迭代 200 步。
简支梁刚度最大化:工况、迭代与体积分数对比 工况与边界条件 设计域 120 mm × 40 mm 铰支 (x,y=0) 滚动 (y=0) F = 100 N SIMP + OC 迭代链 初始化 ρ= f FEA 求 U 灵敏度 ∂c/∂ρ 过滤 + OC 更新 收敛判断 输出最优构型 未收敛 不同体积分数下的最优构型与柔度对比 f = 0.3 细杆拱形传力,柔度较大 f = 0.4 拱形加厚,刚度提升 f = 0.5 接近实心,柔度最小 体积分数增大 → 材料用量增加 → 柔度下降、刚度提升

实现要点与结果判读

在 MATLAB 或 Python 中实现时,核心循环为:组装全局刚度矩阵 → 施加边界条件 → 求解位移 → 计算柔度与灵敏度 → 灵敏度过滤 → OC 更新密度 → 检查收敛。以下为关键代码骨架(Python 风格,使用 NumPy 与 SciPy 稀疏求解):

import numpy as np
from scipy.sparse import coo_matrix
from scipy.sparse.linalg import spsolve

# 网格与材料参数
nelx, nely = 120, 40
E0, nu, p, rmin = 1.0, 0.3, 3.0, 2.0
volfrac = 0.4
penal = 3.0

# 单元刚度矩阵(平面应力,单位厚度)
def lk():
    k = np.array([1/2-nu/6, 1/8+nu/8, -1/4-nu/12, -1/8+3*nu/8,
                  -1/4+nu/12, -1/8-nu/8, nu/6, 1/8-3*nu/8])
    KE = 1/(1-nu**2)*np.array([
        [k[0],k[1],k[2],k[3],k[4],k[5],k[6],k[7]],
        [k[1],k[0],k[7],k[6],k[5],k[4],k[3],k[2]],
        [k[2],k[7],k[0],k[1],k[6],k[3],k[4],k[5]],
        [k[3],k[6],k[1],k[0],k[7],k[2],k[5],k[4]],
        [k[4],k[5],k[6],k[7],k[0],k[1],k[2],k[3]],
        [k[5],k[4],k[3],k[2],k[1],k[0],k[7],k[6]],
        [k[6],k[3],k[4],k[5],k[2],k[7],k[0],k[1]],
        [k[7],k[2],k[5],k[4],k[3],k[6],k[1],k[0]]])
    return KE

# 初始化密度与过滤
x = np.ones(nely*nelx)*volfrac
xmin, xmax = 0.001, 1.0
loop, change = 0, 1.0
while change > 0.01 and loop < 200:
    loop += 1
    # 组装刚度矩阵(SIMP插值)
    # ... 此处省略组装细节,实际需按单元循环组装 K
    # 求解位移 U
    # 计算柔度 c 与灵敏度 dc
    # 灵敏度过滤
    # OC 更新 xnew
    change = np.max(np.abs(xnew - x))
    x = xnew
    print(f"Iter {loop}: c = {c:.4f}, vol = {np.mean(x):.4f}")
实际运行时,建议先以较粗网格(如 60×20)验证流程正确性,再切换到 120×40 精细网格。过滤半径 rmin 过小会导致棋盘格,过大则使边界模糊、细节丢失。

不同体积分数的对比结论

体积分数 f 材料用量 最优构型特征 柔度趋势
0.3 30% 细杆拱形,传力路径集中,局部杆件较细 最大
0.4 40% 拱形加厚,杆件宽度增加,冗余度提高 中等
0.5 50% 接近实心梁,材料分布均匀,局部细节减少 最小

从迭代曲线看,柔度在前期快速下降,约 40~60 步后趋于平稳;体积分数越大,收敛后的柔度越低,但材料利用率(单位体积刚度增益)并非线性提升。工程中需在刚度需求与减重目标之间折中选取 f。

若迭代过程中出现柔度震荡或密度场出现大面积灰色(中间密度),通常说明惩罚因子 p 偏小或过滤半径设置不当。可适当增大 p 至 3~5,并检查 OC 更新中的移动限是否过大。