88行代码
Efficient topology optimization in MATLAB using 88 lines of code
概述
在99行代码的优化效率、增加密度过滤
-
对有限元组装、计算柔度、过滤操作等部分进行向量化,去除 for 循环
-
增加灵敏度过滤和密度过滤两种方式
优化下面问题
\[
\min_{x} \quad c(x) = \mathbf{U}^\mathrm{T} \mathbf{K}(x) \mathbf{U}
= \sum_{e=1}^{N} E_e(x_e) \cdot \mathbf{u}_e^\mathrm{T} \mathbf{k}_0 \mathbf{u}_e
\]
\[
\text{s.t.} \quad
\begin{cases}
\sum x_e \leq \text{volfrac} \cdot N \\
0 \leq x_e \leq 1 \\
\mathbf{K}(x)\mathbf{U} = \mathbf{F}
\end{cases}
\]
SIMP方法:
\[
E(x_e) = E_{\min} + x_e^p (E_0 - E_{\min})
\]
-
其中 \( p \) 是惩罚因子(通常为 3)
-
引入 \( E_{\min} \) 避免刚度矩阵奇异性
装配全局刚度矩阵K
通过向量操作加速全局刚度矩阵K的装配
1 2 3 4 5 6 7 8 9 10 |
|
灵敏度过滤预处理
预处理一个邻接矩阵H,表示灵敏度过滤中每个单元受领域内其他单元影响,权重是距离的反比例函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
密度过滤以及灵敏度过滤
密度型过滤
\[
\tilde{dc}_i = \frac{ \displaystyle\sum_{j \in N(i)} H_{ij} \cdot x_j \cdot dc_j }{ x_i \cdot \displaystyle\sum_{j \in N(i)} H_{ij} }
\]
-
\(\tilde{dc}_i\):单元 \(i\) 的滤波后灵敏度
-
$dc_j $:邻居单元 \(j\) 的原始灵敏度
-
\(x_j\):邻居单元的密度
-
\(H_{ij}\):距离加权系数
-
\(N(i)\):单元 \(i\) 的邻居集合
灵敏度型过滤
\[
\tilde{dc}_i = \frac{ \displaystyle\sum_{j \in N(i)} H_{ij} \cdot dc_j }{ \displaystyle\sum_{j \in N(i)} H_{ij} }
\]
-
\(dc_i\):单元 \(i\) 的滤波后灵敏度
-
\(dc_j\):邻居单元 \(j\) 的原始灵敏度
-
\(H_{ij}\):距离加权系数
-
\(N(i)\):单元 \(i\) 的邻居集合