拓扑优化经典99行程序解读
北航拓扑优化程序学习报告

拓扑优化的99行程序学习报告4月19日2011《结构优化设计》课程学习报告任课教师:李书一、前言:在最近的结构优化设计课程上学习了O.Sigmund的《A 99 line topology optimization code written in Matlab》一文,对拓扑优化的理论原理与实际的计算机程序实现都有了一定的理解,文章主要是通过拓扑优化的原理来实现对简单结构的静力学问题的优化求解,而编写的代码仅有99行,包括36行的主程序,12行的OC优化准则代码,16行的网格过滤代码和35行的有限元分析代码。
自1988 年丹麦学者Bendsoe与美国学者Kikuchi提出基于均匀化方法的结构拓扑优化设计基本理论以来,均匀化方法应用到具有周期性结构的材料分析中,近几年该方法已经成为分析夹杂、纤维增强复合材料、混凝土材料等效模量,以及材料的细观结构拓扑优化常用的手段之一。
其基本思想是在组成拓扑结构的材料中引入微结构,优化过程中以微结构的几何尺寸作为设计变量,以微结构的消长实现其增删,并产生介于由中间尺寸微结构组成的复合材料,从而实现了结构拓扑优化模型与尺寸优化模型的统一。
文章就是通过均匀化的基础,结合拓扑结构优化的工程实际,以计算机模拟的方法将拓扑优化的一般过程呈现出来,有助于初涉拓扑优化的读者对拓扑优化有个基础的认识。
二、拓扑优化问题描述为了简化问题的描述,文中假设设计域是简单的矩形形式,且在进行有限元离散的时候采用正方形单元对其进行离散。
这样不仅便于进行单元离散和单元编号,也利于对结构进行几何外形的描述。
一般说来,基于指数逼近法的拓扑优化最小化的问题可作如下描述:文中采用的对结构材料属性的描述是所谓的“指数逼近法”或者称为SIMP 逼近法,即(Solid Isotropic Material with Penalization带惩罚因子的各项同性材料模型法),该方法是拓扑优化中常用的变密度材料插值模型中最具代表性的一种。
拓扑优化_精品文档

-1整数变量问题变为0~1间的连续变量优化模型,获得方程(在设计变
量上松弛整数约束)的最直接方式是考虑以下问题:
min u,
uout
N
s.t.: min 1 min e Ke u f e1
N
vee V
e1
0 e 1, e 1,2,, N
其中 e 可取0-1之间的值
(6)
然而这种方程会导致较大区域内 e 是在0-1之间的值,所以必须添加额外 的约束来避免这种“灰色”区域。要求是优化结果基本上都在 e 1 或
而对于结构拓扑优化来说,其所关心的是离散结构中杆件之间的最优 连接关系或连续体中开孔的数量及位置等。拓扑优化力图通过寻求结构的 最优拓扑布局(结构内有无孔洞,孔洞的数量、位置、结构内杆件的相互 联接方式),使得结构能够在满足一切有关平衡、应力、位移等约束条件 的情形下,将外荷载传递到支座,同时使得结构的某种性能指标达到最优。 拓扑优化的主要困难在于满足一定功能要求的结构拓扑具有无穷多种形式, 并且这些拓扑形式难以定量的描述即参数化。
结构渐进优化法(简称ESO法)
通过将无效的或低效的材料 一步步去掉,获得优化拓扑,方法通 用性好,可解决尺寸优化,还可同时 实现形状与拓扑优化(主要包括应力, 位移/刚度和临界应力等约束问题的 优化)。
2.问题的设定
柔顺机构的拓扑优化
首先假设线性弹性材料有微小的变形
柔顺结构的一个重要运用在于机电系统(MicroElectroMechanical Systems(MEMS),在该系统中小规模的计算使得很难利用刚体结构来实现铰链、 轴承以及滑块处的机动性。
如果我们只考虑线性弹性材料(只发生微小变形)的分析问题,则决定 输出位移的的有限元方法公式为:
拓扑优化学习报告_北理工_王路

s.t
KU F
V fV0 xi , j i , j
i 1 j 1 m n
0 xmin xi , j xmax 1
其中:
X ——单元相对密度矢量
C ——结构的柔度
F ——载荷矢量
U ——位移矢量
北京理工大学 车辆工程 王路
FILTER %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% function [dcn]=check(nelx,nely,rmin,x,dc) dcn=zeros(nely,nelx); for i = 1:nelx for j = 1:nely sum=0.0; for k = max(i-floor(rmin),1):min(i+floor(rmin),nelx) for l = max(j-floor(rmin),1):min(j+floor(rmin),nely) fac = rmin-sqrt((i-k)^2+(j-l)^2); sum = sum+max(0,fac); dcn(j,i) = dcn(j,i) + max(0,fac)*x(l,k)*dc(l,k); end end
E( xi ) Emin ( xi ) p ( E0 Emin ), xi 0,1
其中:
E(xi ) ——插值以后的弹性模量 E0 ——实体部分材料的弹性模量 Emin ——孔洞部分材料的弹性模量
(1)
xi ——单元相对密度,取值为
1 时表示有材料,为 0 时表示无材料即孔洞
p ——惩罚因子
(二)拓扑优化问题的描述
(1)材料插值模型
北航拓扑优化程序学习报告

拓扑优化的99行程序学习报告4月19日2011《结构优化设计》课程学习报告任课教师:李书一、 前言:在最近的结构优化设计课程上学习了O.Sigmund 的《A 99 line topology optimization code written in Matlab 》一文,对拓扑优化的理论原理与实际的计算机程序实现都有了一定的理解,文章主要是通过拓扑优化的原理来实现对简单结构的静力学问题的优化求解,而编写的代码仅有99行,包括36行的主程序,12行的OC 优化准则代码,16行的网格过滤代码和35行的有限元分析代码。
自1988 年丹麦学者Bendsoe 与美国学者Kikuchi 提出基于均匀化方法的结构拓扑优化设计基本理论以来,均匀化方法应用到具有周期性结构的材料分析中,近几年该方法已经成为分析夹杂、纤维增强复合材料、混凝土材料等效模量,以及材料的细观结构拓扑优化常用的手段之一。
其基本思想是在组成拓扑结构的材料中引入微结构,优化过程中以微结构的几何尺寸作为设计变量,以微结构的消长实现其增删,并产生介于由中间尺寸微结构组成的复合材料,从而实现了结构拓扑优化模型与尺寸优化模型的统一。
文章就是通过均匀化的基础,结合拓扑结构优化的工程实际,以计算机模拟的方法将拓扑优化的一般过程呈现出来,有助于初涉拓扑优化的读者对拓扑优化有个基础的认识。
二、 拓扑优化问题描述为了简化问题的描述,文中假设设计域是简单的矩形形式,且在进行有限元离散的时候采用正方形单元对其进行离散。
这样不仅便于进行单元离散和单元编号,也利于对结构进行几何外形的描述。
一般说来,基于指数逼近法的拓扑优化最小化的问题可作如下描述:01min :()()():0min 1NT p Te e e Xe c X U KU x u k u V X subjecttof V KU FX x =⎫==⎪⎪⎪=⎬⎪⎪=⎪<≤≤⎭∑文中采用的对结构材料属性的描述是所谓的“指数逼近法”或者称为SIMP逼近法,即(Solid Isotropic Material with Penalization 带惩罚因子的各项同性材料模型法),该方法是拓扑优化中常用的变密度材料插值模型中最具代表性的一种。
拓扑优化经典99行

% Please sent your comments to the author: [email]sigmund@fam.dtu.dk[/email]%
% %
%%%% A 99 LINE TOPOLOGY OPTIMIZATION CODE BY OLE SIGMUND, JANUARY 2000 %%%
%%%% CODE MODIFIED FOR INCREASED SPEED, September 2002, BY OLE SIGMUND %%%
% DESIGN UPDATE BY THE OPTIMALITY CRITERIA METHOD
[x] = OC(nelx,nely,x,volfrac,dc);
% PRINT RESULTS
change = max(max(abs(x-xold)));
disp([' It.: ' sprintf('%4i',loop) ' Obj.: ' sprintf('%10.4f',c) ...
K(edof,edof) = K(edof,edof) + x(ely,elx)^penal*KE;
end
end
% DEFINE LOADS AND SUPPORTS (HALF MBB-BEAM)
F(2,1) = -1;
fixeddofs = union([1:2:2*(nely+1)],[2*(nelx+1)*(nely+1)]);
% The author reserves all rights but does not guaranty that the code is %
9-拓扑优化方法PPT课件

➢ 按某种优化策略和准则从这若干个子设计区域中删除 某些单元,用保留下来的单元描述结构的最优拓扑。
16
四、拓扑优化方法分类
从其物理模型的描述方法上一般分为 ➢ 基结构法(The Ground Structural Method) ➢ 均匀化方法(The Homogenization Method) ➢ 渐 进 结 构 优 化 方 法 (The Evolutionary Structural
x fi u pu g xu i 0 i=1,2, ,n
由此可构造如下的迭代公式
x(k1) i
c(k)xi(k)
i=1,2,
,n
其中c(k)=-1- p
f u
ugxui
为小于1的因子
xi
7
x fi u pu g xu i 0 i=1,2, ,n
x fi u pu g xu i
i=1,2, ,n
对于由n个杆件组成的桁架结构,其满应力条件为
Fi Ai
i
i1,2,
,n
由此可构造如下的迭代公式
(k)
A(k1) i
i
A(k) i
i1,2,
,n
i
6
2. 基于K-T条件的准则法 对于结构优化设计问题:
m in f(X ) X R n
s .t.g u ( X ) 0u 1 ,2 ,,p
极值点X*应满足的Kuhn-Tucker条件
结构优化与材料优化
第一节 概述 第二节 结构优化设计的准则法 第三节 结构的拓扑优化方法 第四节 功能材料优化设计 第五节 柔性机构优化设计 第六节 结构多学科设计优化
Sigmund_99行拓扑优化程序
%%%% A 99 LINE TOPOLOGY OPTIMIZATION CODE BY OLE SIGMUND, JANUARY 2000 %%%%%%% CODE MODIFIED FOR INCREASED SPEED, September 2002, BY OLE SIGMUND %%%function top(nelx,nely,volfrac,penal,rmin);nelx=80;nely=20;volfrac=0.4;penal=3;rmin=2;% INITIALIZEx(1:nely,1:nelx) = volfrac;loop = 0;change = 1.;% START ITERA TIONwhile change > 0.01loop = loop + 1;xold = x;% FE-ANAL YSIS[U]=FE(nelx,nely,x,penal);% OBJECTIVE FUNCTION AND SENSITIVITY ANAL YSIS[KE] = lk;c = 0.;for ely = 1:nelyfor elx = 1:nelxn1 = (nely+1)*(elx-1)+ely;n2 = (nely+1)* elx +ely;Ue = U([2*n1-1;2*n1; 2*n2-1;2*n2; 2*n2+1;2*n2+2; 2*n1+1;2*n1+2],1);c = c + x(ely,elx)^penal*Ue'*KE*Ue;dc(ely,elx) = -penal*x(ely,elx)^(penal-1)*Ue'*KE*Ue;endend% FILTERING OF SENSITIVITIES[dc] = check(nelx,nely,rmin,x,dc);% DESIGN UPDA TE BY THE OPTIMALITY CRITERIA METHOD[x] = OC(nelx,nely,x,volfrac,dc);% PRINT RESULTSchange = max(max(abs(x-xold)));disp([' It.: ' sprintf('%4i',loop) ' Obj.: ' sprintf('%10.4f',c) ...' Vol.: ' sprintf('%6.3f',sum(sum(x))/(nelx*nely)) ...' ch.: ' sprintf('%6.3f',change )])% PLOT DENSITIEScolormap(gray); imagesc(-x); axis equal; axis tight; axis off;pause(1e-6);end%%%%%%%%%% OPTIMALITY CRITERIAUPDATE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [xnew]=OC(nelx,nely,x,volfrac,dc)l1 = 0; l2 = 100000; move = 0.2;while (l2-l1 > 1e-4)lmid = 0.5*(l2+l1);xnew = max(0.001,max(x-move,min(1.,min(x+move,x.*sqrt(-dc./lmid)))));if sum(sum(xnew)) - volfrac*nelx*nely > 0;l1 = lmid;elsel2 = lmid;endend%%%%%%%%%% MESH-INDEPENDENCYFILTER %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [dcn]=check(nelx,nely,rmin,x,dc)dcn=zeros(nely,nelx);for i = 1:nelxfor j = 1:nelysum=0.0;for k = max(i-floor(rmin),1):min(i+floor(rmin),nelx)for l = max(j-floor(rmin),1):min(j+floor(rmin),nely)fac = rmin-sqrt((i-k)^2+(j-l)^2);sum = sum+max(0,fac);dcn(j,i) = dcn(j,i) + max(0,fac)*x(l,k)*dc(l,k);endenddcn(j,i) = dcn(j,i)/(x(j,i)*sum);endend%%%%%%%%%%FE-ANAL YSIS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%function [U]=FE(nelx,nely,x,penal)[KE] = lk;K = sparse(2*(nelx+1)*(nely+1), 2*(nelx+1)*(nely+1));F = sparse(2*(nely+1)*(nelx+1),1); U = zeros(2*(nely+1)*(nelx+1),1);for elx = 1:nelxfor ely = 1:nelyn1 = (nely+1)*(elx-1)+ely;n2 = (nely+1)* elx +ely;edof = [2*n1-1; 2*n1; 2*n2-1; 2*n2; 2*n2+1; 2*n2+2; 2*n1+1; 2*n1+2];K(edof,edof) = K(edof,edof) + x(ely,elx)^penal*KE;endend% DEFINE LOADS AND SUPPORTS (HALF MBB-BEAM)F(2*(nelx/2+1)*(nely+1),1) = 1;fixeddofs = [2*(nely/2+1),2*nelx*(nely+1)+2*(nely/2+1)];alldofs = [1:2*(nely+1)*(nelx+1)];freedofs = setdiff(alldofs,fixeddofs);% SOLVINGU(freedofs,:) = K(freedofs,freedofs) \ F(freedofs,:);U(fixeddofs,:)= 0;%%%%%%%%%% ELEMENT STIFFNESSMATRIX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [KE]=lkE = 1.;nu = 0.3;k=[ 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 = E/(1-nu^2)*[ k(1) k(2) k(3) k(4) k(5) k(6) k(7) k(8)k(2) k(1) k(8) k(7) k(6) k(5) k(4) k(3)k(3) k(8) k(1) k(6) k(7) k(4) k(5) k(2)k(4) k(7) k(6) k(1) k(8) k(3) k(2) k(5)k(5) k(6) k(7) k(8) k(1) k(2) k(3) k(4)k(6) k(5) k(4) k(3) k(2) k(1) k(8) k(7)k(7) k(4) k(5) k(2) k(3) k(8) k(1) k(6)k(8) k(3) k(2) k(5) k(4) k(7) k(6) k(1)];%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%。
TopOpt针对99行改进的88行拓扑优化程序完全注释
TopOpt针对99⾏改进的88⾏拓扑优化程序完全注释 博客搬家到⾃⼰搭建的 啦q(≧▽≦q),⼤家快来逛逛鸭!The program can be promoted by line:top88(120,40,0.5,3.0,3.5,1)代码注释88⾏程序为了提⾼效率,逻辑、流程没有99⾏程序那么清楚,建议初学先读99⾏。
%%%%%%%%%%%% AN 88 LINE TOPOLOGY OPTIMIZATION CODE Nov 2010 %%%%%%%%%%%% %%%%%%%%%%%% COMMENTED - OUT BY HAOTIAN_W AUGUST 2020 %%%%%%%%%%%%function top88(nelx,nely,volfrac,penal,rmin,ft)% ===================================================================================% 88⾏程序在99⾏程序上的主要改进:% 1) 将for循环语句向量化处理,发挥MATLAB矩阵运算优势;% 2) 为不断增加数据的数组预分配内存,避免MATLAB花费额外时间寻找更⼤的连续内存块;% 3) 尽可能将部分程序从循环体⾥抽出,避免重复计算;% 4) 设计变量不再代表单元伪密度,新引⼊真实密度变量xphys;% 5) 将原先的所有⼦程序都集成在主程序⾥,避免频繁调⽤;% 总体上,程序的效率有显著提升(近百倍)、内存占⽤降低,但是对初学者来说可读性不如99⾏% ===================================================================================% nelx : ⽔平⽅向上的离散单元数;% nely : 竖直⽅向上的离散单元数;%% volfrac : 容积率,材料体积与设计域体积之⽐,对应的⼯程问题就是"将结构减重到百分之多少";%% penal : 惩罚因⼦,SIMP⽅法是在0-1离散模型中引⼊连续变量x、系数p及中间密度单元,从⽽将离% 散型优化问题转换成连续型优化问题,并且令0≤x≤1,p为惩罚因⼦,通过设定p>1对中间密% 度单元进⾏有限度的惩罚,尽量减少中间密度单元数⽬,使单元密度尽可能趋于0或1;%% 合理选择惩罚因⼦的取值,可以消除多孔材料,从⽽得到理想的拓扑优化结果:% 当penal<=2时存在⼤量多孔材料,计算结果没有可制造性;% 当penal>=3.5时最终拓扑结果没有⼤的改变;% 当penal>=4时结构总体柔度的变化⾮常缓慢,迭代步数增加,计算时间延长;%% rmin : 敏度过滤半径,防⽌出现棋盘格现象;% ft : 与99⾏程序不同的是,本程序提供了两种滤波器,% ft=1时进⾏灵敏度滤波,得到的结果与99⾏程序⼀样;ft=2时进⾏密度滤波。
拓扑优化PPT课件
KlineKe e1
(3)
其中[Ke]为单元刚度矩阵,下标lin表示它与设计变量是线性关系。
如果我们希望将问题设定成一个标准的嵌套式方程,其中要求平衡条
件能排除使刚度矩阵奇异的情况,可以用一个很小但非零的值 min来代 替 0 ,其刚度矩阵可以写成:
N
K af f m in 1mineK e (4) e 1 16
这不仅意味着需要处理大量的设计变量,而且也影响到有限元分析的计算成本。 些为了得到高精度的设计,运用模拟退火法、遗传算法、或是确定性方法计算成本 都是很高的,而且这些方法只适用于相对较小的规模,或是些特定的设计问题,如 最小柔顺性问题。
在式(2)的连续性问题假设中可以看出,寻求结构拓扑的基本思想是通过寻找
一个在定义域 的子集上定义的指示函数来得到的,很明显这一问题很难解决,我
们可以通过限制子集的等级或是扩展设计集来获得一个适当的模式。对于柔度,均
匀的多尺度层状微结构组成了一个扩展的设计空间,同时也意味着整数约束 松弛
为连续约束。
18
2.2 解决灰色尺度:差值模式
由于整数模将0
这包括大量的拓扑方面的著作特别是在所谓的均质化方法和多样性方法的方量的拓扑方面的著作特别是在所谓的均质化方法和多样性方法的方55三种优化的直观区别三种优化的直观区别66尺寸优化的设计变量是板的厚度二力杆的截面积以及梁截面的高度等尺寸优化的设计变量是板的厚度二力杆的截面积以及梁截面的高度等结构的尺寸参数尺寸优化的目的是要在满足结构的力学控制方程周长约束结构的尺寸参数尺寸优化的目的是要在满足结构的力学控制方程周长约束以及诸多性态约束条件的前提下寻求一组最优的结构尺寸参数使得关于结以及诸多性态约束条件的前提下寻求一组最优的结构尺寸参数使得关于结构性能的某种指标函数达到最优
声结构耦合系统双材料模型的拓扑优化设计
声结构耦合系统双材料模型的拓扑优化设计商林源;赵国忠;陈刚【摘要】A bi-material topology optimization approach was investigated based on the microstructure-based design domain method with the combination of an adjoint method and a relaxed form of optimality criteria.An adjoint sensitivity method whereby sound pressure level derivative with respect to topology variables was proposed and deduced.A relaxed form of optimality criteria was deduced and used to solve the optimization problem of the coupled systems.Numerical examples show the high efficiency and the high accuracy of the adjoint sensitivity analysis,and the quick convergence and the high stability of the relaxed form of optimality criteria.The results also show that the topology optimization method of bi-material reduces internal noise and validates the optimization method.%基于微结构设计域法,并结合伴随法与放松形式准则法,研究了针对声结构耦合系统的双材料拓扑优化方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3188-1-1.htmlSigmund教授所编写的top优化经典99行程序,可以说是我们拓扑优化研究的基础;每一个新手入门都会要读懂这个程序,才能去扩展,去创新;99行程序也有好多个版本,用于求解各种问题,如刚度设计、柔顺机构、热耦合问题,但基本思路大同小异;本文拟对其中的一个版本进行解读,愿能对新手有点小小的帮助。
不详之处,还请论坛内高手多指点读懂了该程序,只能说是略懂拓扑优化理论了,我手里就有一些水平集源程序是成千上万行,虽然在99行的基础上成熟了很多,但依然还有很多的发展空间。
源程序如下:%%%% A 99 LINE TOPOLOGY OPTIMIZATION CODE BY OLE SIGMUND, JANUARY 2000 %%%%%%% CODE MODIFIED FOR INCREASED SPEED, September 2002, BY OLE SIGMUND %%%function top(nelx,nely,volfrac,penal,rmin);nelx=80;nely=20;volfrac=0.4;penal=3;rmin=2;% INITIALIZEx(1:nely,1:nelx) = volfrac;loop = 0;change = 1.;% START ITERATIONwhile change > 0.01loop = loop + 1;xold = x;% FE-ANAL YSIS[U]=FE(nelx,nely,x,penal);% OBJECTIVE FUNCTION AND SENSITIVITY ANAL YSIS[KE] = lk;c = 0.;for ely = 1:nelyfor elx = 1:nelxn1 = (nely+1)*(elx-1)+ely;n2 = (nely+1)* elx +ely;Ue = U([2*n1-1;2*n1; 2*n2-1;2*n2; 2*n2+1;2*n2+2; 2*n1+1;2*n1+2],1);c = c + x(ely,elx)^penal*Ue'*KE*Ue;dc(ely,elx) = -penal*x(ely,elx)^(penal-1)*Ue'*KE*Ue;endend% FILTERING OF SENSITIVITIES[dc] = check(nelx,nely,rmin,x,dc);% DESIGN UPDA TE BY THE OPTIMALITY CRITERIA METHOD[x] = OC(nelx,nely,x,volfrac,dc);% PRINT RESULTSchange = max(max(abs(x-xold)));disp([' It.: ' sprintf('%4i',loop) ' Obj.: ' sprintf('%10.4f',c) ...' Vol.: ' sprintf('%6.3f',sum(sum(x))/(nelx*nely)) ...' ch.: ' sprintf('%6.3f',change )])% PLOT DENSITIEScolormap(gray); imagesc(-x); axis equal; axis tight; axis off;pause(1e-6);end%%%%%%%%%% OPTIMALITY CRITERIA UPDATE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [xnew]=OC(nelx,nely,x,volfrac,dc)l1 = 0; l2 = 100000; move = 0.2;while (l2-l1 > 1e-4)lmid = 0.5*(l2+l1);xnew = max(0.001,max(x-move,min(1.,min(x+move,x.*sqrt(-dc./lmid)))));if sum(sum(xnew)) - volfrac*nelx*nely > 0;l1 = lmid;elsel2 = lmid;endend%%%%%%%%%% MESH-INDEPENDENCY FILTER %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [dcn]=check(nelx,nely,rmin,x,dc)dcn=zeros(nely,nelx);for i = 1:nelxfor j = 1:nelysum=0.0;for k = max(i-floor(rmin),1):min(i+floor(rmin),nelx)for l = max(j-floor(rmin),1):min(j+floor(rmin),nely)fac = rmin-sqrt((i-k)^2+(j-l)^2);sum = sum+max(0,fac);dcn(j,i) = dcn(j,i) + max(0,fac)*x(l,k)*dc(l,k);endenddcn(j,i) = dcn(j,i)/(x(j,i)*sum);endend%%%%%%%%%%FE-ANAL YSIS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function [U]=FE(nelx,nely,x,penal)[KE] = lk;K = sparse(2*(nelx+1)*(nely+1), 2*(nelx+1)*(nely+1));F = sparse(2*(nely+1)*(nelx+1),1); U = zeros(2*(nely+1)*(nelx+1),1);for elx = 1:nelxfor ely = 1:nelyn1 = (nely+1)*(elx-1)+ely;n2 = (nely+1)* elx +ely;edof = [2*n1-1; 2*n1; 2*n2-1; 2*n2; 2*n2+1; 2*n2+2; 2*n1+1; 2*n1+2];K(edof,edof) = K(edof,edof) + x(ely,elx)^penal*KE;endend% DEFINE LOADS AND SUPPORTS (HALF MBB-BEAM)F(2*(nelx/2+1)*(nely+1),1) = 1;fixeddofs = [2*(nely/2+1),2*nelx*(nely+1)+2*(nely/2+1)];alldofs = [1:2*(nely+1)*(nelx+1)];freedofs = setdiff(alldofs,fixeddofs);% SOLVINGU(freedofs, :)= K(freedofs,freedofs) \ F(freedofs,:);U(fixeddofs,:)= 0; % 这两行复制后应换成英文字符,我这里为了防止生成QQ表% 情修改了一下格式%%%%%%%%%% ELEMENT STIFFNESS MATRIX %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [KE]=lkE = 1.;nu = 0.3;k=[ 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 = E/(1-nu^2)*[ k(1) k(2) k(3) k(4) k(5) k(6) k(7) k(8)k(2) k(1) k(8) k(7) k(6) k(5) k(4) k(3)k(3) k(8) k(1) k(6) k(7) k(4) k(5) k(2)k(4) k(7) k(6) k(1) k(8) k(3) k(2) k(5)k(5) k(6) k(7) k(8) k(1) k(2) k(3) k(4)k(6) k(5) k(4) k(3) k(2) k(1) k(8) k(7)k(7) k(4) k(5) k(2) k(3) k(8) k(1) k(6)k(8) k(3) k(2) k(5) k(4) k(7) k(6) k(1)];% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%程序执行方法:(just for matlab new users)打开matlab,点开new M-file,将上述源程序复制粘贴到M-文件中,修改蓝色部分的格式,保存。
按F5即可执行~~程序个人解读(会针对大家的提问,高手们的解释,不断补充更新):主程序部分:包括:数据初始化;有限元分析;敏度分析,OC算法,结果显示function top(nelx,nely,volfrac,penal,rmin);nelx=80; % x轴方向的单元数nely=20; % y轴方向单元数volfrac=0.4; %体积比penal=3; %材料插值的惩罚因子rmin=2; %敏度过滤的半径% INITIALIZEx(1:nely,1:nelx) = volfrac; %x是设计变量loop = 0; %存放迭代次数的变量change = 1.; %每次迭代目标函数的改变值,用以判断何时收敛% START ITERATIONwhile change > 0.01 %当两次连续目标函数迭代的差小于等于0.01时,结束迭代loop = loop + 1; %迭代次数加1xold = x; %把前一次的设计变量赋值给xold% FE-ANAL YSIS[U]=FE(nelx,nely,x,penal); %进行有限元分析% OBJECTIVE FUNCTION AND SENSITIVITY ANAL YSIS[KE] = lk; %单元刚度矩阵c = 0.; %用来存放目标函数的变量.这里目标函数是刚度最大,也就是柔%度最小for ely = 1:nelyfor elx = 1:nelxn1 = (nely+1)*(elx-1)+ely;n2 = (nely+1)* elx +ely;Ue = U([2*n1-1;2*n1; 2*n2-1;2*n2; 2*n2+1;2*n2+2; 2*n1+1;2*n1+2],1);c = c + x(ely,elx)^penal*Ue'*KE*Ue; %计算目标函数的值(即柔度%是多少) dc(ely,elx) = -penal*x(ely,elx)^(penal-1)*Ue'*KE*Ue; % 灵敏度分析的结果这一行%和上一行可参考论文中的公式endend% FILTERING OF SENSITIVITIES[dc] = check(nelx,nely,rmin,x,dc); %灵敏度过滤,为了边界光顺一点% DESIGN UPDA TE BY THE OPTIMALITY CRITERIA METHOD[x] = OC(nelx,nely,x,volfrac,dc); %优化准则法更新设计变量% PRINT RESULTSchange = max(max(abs(x-xold))); %计算目标函数的改变量disp([' It.: ' sprintf('%4i',loop) ' Obj.: ' sprintf('%10.4f',c) ...' Vol.: ' sprintf('%6.3f',sum(sum(x))/(nelx*nely)) ...' ch.: ' sprintf('%6.3f',change )]) %屏幕上显示迭代信息% PLOT DENSITIEScolormap(gray); imagesc(-x); axis equal; axis tight; axis off;pause(1e-6); %优化结果的图形显示(个人认为这种图形显示方法很不好,太简单了。