拓扑优化经典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带惩罚因子的各项同性材料模型法),该方法是拓扑优化中常用的变密度材料插值模型中最具代表性的一种。
(完整版)ANSYS拓扑优化原理讲解以及实例操作
拓扑优化是指形状优化,有时也称为外型优化。
拓扑优化的目标是寻找承受单载荷或多载荷的物体的最佳材料分配方案。
这种方案在拓扑优化中表现为“最大刚度”设计。
与传统的优化设计不同的是,拓扑优化不需要给出参数和优化变量的定义。
目标函数、状态变量和设计变量(参见“优化设计”一章)都是预定义好的。
用户只需要给出结构的参数(材料特性、模型、载荷等)和要省去的材料百分比。
给每个有限元的单元赋予内部伪密度来实现。
这些伪密度用PLNSOL ,TOPO 命令来绘出。
拓扑优化的目标——目标函数——是在满足结构的约束(V )情况下减少结构的变形能。
减小结构的变形能相当于提高结构的刚度。
这个技术通过使用设计变量。
结构拓扑优化的基本思想是将寻求结构的最优拓扑问题转化为在给定的设计区域内寻求最优材料分布的问题。
通过拓扑优化分析,设计人员可以全面了解产品的结构和功能特征,可以有针对性地对总体结构和具体结构进行设计。
特别在产品设计初期,仅凭经验和想象进行零部件的设计是不够的。
只有在适当的约束条件下,充分利用拓扑优化技术进行分析,并结合丰富的设计经验,才能设计出满足最佳技术条件和工艺条件的产品。
连续体结构拓扑优化的最大优点是能在不知道结构拓扑形状的前提下,根据已知边界条件和载荷条件确定出较合理的结构形式,它不涉及具体结构尺寸设计,但可以提出最佳设计方案。
拓扑优化技术可以为设计人员提供全新的设计和最优的材料分布方案。
拓扑优化基于概念设计的思想,作为结果的设计空间需要被反馈给设计人员并做出适当的修改。
最优的设计往往比概念设计的方案结构更轻,而性能更佳。
经过设计人员修改过的设计方案可以再经过形状和尺寸优化得到更好的方案。
5.1.2优化拓扑的数学模型优化拓扑的数学解释可以转换为寻求最优解的过程,对于他的描述是:给定系统描述和目标函数,选取一组设计变量及其范围,求设计变量的值,使得目标函数最小(或者最大)。
一种典型的数学表达式为:()()()12,,0,,0min ,g x x v g x x v f x v ⎧=⎪⎪≤⎨⎪⎪⎩式中,x -系统的状态变量;12g g 、-一等式和不等式的结束方程;(),f x v -目标函数;v -设计变量。
拓扑优化学习报告_北理工_王路
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 %
拓扑优化经典99行程序解读
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-文件中,修改蓝色部分的格式,保存。
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时进⾏密度滤波。
拓扑优化第八次课
第7次课回顾¾拓扑优化中的灵敏度分析 直接法伴随法柔顺性问题的灵敏度分析第8次课主要内容¾调用MMA优化子程序¾结构应力拓扑优化基本列式应力约束优化问题中的奇异现象 放松方法MMA程序介绍¾移动渐近算法(Method of Moving Asymptotes)优化程序由瑞典皇家工学院Krister Svanberg教授于1987年开发。
¾后为使用于MBB梁问题及其他算例,对程序进行了重写。
¾2002年发布GCMMA,增强算法的全局收敛性。
[1] K. Svanberg, The method of moving asymptotes { a new method for structural optimization, International Journal for Numerical Methods in Engineering, 1987, 24, 359-373.[2] K. Svanberg, A class of globally convergent optimization methods based on conservative convex separable approximations, SIAM Journal of Optimization, 2002, 12, 555-573.MMA程序介绍¾MMA的程序代码mmasub.m和subsolv.m可以免费用于教育及科研。
可以通过向Svanberg教授发邮件的形式获取。
¾http://www.math.kth.se/~krille/¾求解相同的MBB梁问题,OC算法和MMA算法表现上有什么不同?¾目标函数?计算时间?Time pr. optimization iteration9796.36MMA¾对于相同的简单问题OC计算效率高于MMA.OC VS MMA¾MBB problem 60x20 elementsMMA优化结果OC优化结果mMMA优化原模型¾当优化变量y和z趋近于0的时候,MMA优化模型趋近于原始模型。
拓扑优化经典99行程序解读
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)Ape nal*Ue'*KE*Ue;dc(ely,elx) = -pe nal*x(ely,elx)A(pe nal-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)A2+(j-l)A2);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)A pe nal*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-nuA2)*[ 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-文件中,修改蓝色部分的格式,保存。
拓扑优化99行代码翻译
拓扑优化中的99行matlab代码——o.sigmund摘要这篇文章描述了用matlab语言来简洁的实现在静态负载下符合最小化原理的拓扑优化。
总共只需要输入99行代码,包括优化程序和有限元分析子程序。
这99行代码中,其中36行为主程序,12行为基于最优控制器的优化程序,16行为敏度过滤分析,其余35行代码作为有限元分析。
实际上,除去注释行以及输出行、有限元分析行,仅有49行matlab代码输入用于解决一个适定的拓扑优化问题。
再加上3行补充程序代码,这个程序就可以解决多种负载工况问题。
这个代码主要是以教育指导为用,完整的matlab代码在附录中给出,同时也可以在网页http://www.topopt.dtu.dk上下载。
关键词拓扑优化教育最优准则万维网matlab代码1 简介文中展示的matlab代码主要是为工程教育所用。
学生和在拓扑领域的新手可以在网页http://www.topopt.dtu.dk上下载。
这个代码可以用于结构最优化课程学习,学生们可以在多重负载工况、独立网格选择策略、无源场进行扩展应用。
另一种可能就是用来激发学生们的直觉来进行最优化设计。
研究生可以推测探究在给定边界条件和容量的情况下的拓扑优化并、比较得出最优策略。
在文献中,你可以找到很多处理拓扑优化问题的方法。
在一篇Bendsøe and Kikuchi (1988)的原创论文中,基于对现存结论的学习,所谓微观结构或均化作用的方法被使用。
均化作用方法在很多文章中都被采用,但它也存在一些缺点,比如对微观结构最优化方法果断的评估与决策很麻烦的,而且结果很难获得如果没有对微观结构进行确定的长度衡量。
然而,在这个意义上来说均化作用方法对拓扑优化也是很重要的,它可以在结构的理论分析上提供一定的界限。
拓扑优化的另一种方法叫做“幂律法则”或者SIMP法((Solid Isotropic Material with Penalization) (Bendsøe1989; Zhou and Rozvany 1991; Mlejnek 1992))。
拓扑优化学习报告-北理工-王路
基于99行程序的拓扑优化学习报告(一)背景和前言随着汽车工业的飞速发展以及日益突出的能源问题,汽车工业面临的挑战以及竞争环境也越来越激烈,对汽车产品提出了降低其制造成本及燃油经济性的新要求。
在提高汽车安全性、减少汽车排放和解决能源消耗的背景下,提出了汽车轻量化技术。
实现汽车轻量化的途径包括三个方面:结构优化技术、新型材料和先进性制造工艺。
其中,我们所讨论的是结构优化技术,其中结构优化设计分为三个层次:尺寸优化(Size Optimization)、形状优化(Shape Optimization)和拓扑优化(Topology Optimization)。
本文我们基于99行matlab程序初步学习拓扑优化技术中的理论和优化方法。
拓扑优化技术指的是在给定的设计空间内寻求最佳的材料布局,同时在满足平衡方程、物理关系、几何关系和边界约束条件下使得结构达到某种性能最优的应用技术。
拓扑优化的理论研究最早可以追溯到Michel提出的桁架理论,连续体结构的拓扑优化由于描述和数值计算得困难,发展一直相对缓慢,直到Bendsoe和Kikuchi在1988年提出的均匀化方法之后才得到迅速的发展,其基本思想是在组成拓扑结构中引入微结构,通过微结构的几何参数作为设计变量,通过微结构的增加和删减实现结构的拓扑形状的改变,实现拓扑优化和尺寸优化的统一。
在微结构的基础上,我们介绍变密度法的应用,变密度法是在均匀化方法的基础上产生的,把材料引入微结构代之以密度在0~1之间变化的假想材料,把密度作为设计变量,从而实现材料的删减,因其模型简单、计算变量相对较少成为目前广泛采用的方法。
根据不同的插值模式,变密度法又有不同的插值模型:SIMP法(Solid Isotropic Material with Penalization)、Hashin-Shtrikman法,以及RAMP法(Rational Approximation of Material Properties)。
拓扑优化算法及其实现
min(1, en m)
if enB max(min , en m) if max(min , en m) enB min(1, en m)
if enB min(1, en m)
n1
max(
en
B
min
,
en
m)
min(1, en m)
if enB max(min , en m) if max(min , en m) enB min(1, en m)
优化设计过程:将区域离散成足够多的子区域,对这些子区域进行 结构分析,再按某种优化策略和准则从这些子区域中删除某些单元, 用保留下来的单元描述结构的最优拓扑。
拓扑优化建模方法
变密度法
SIMP( Solid Isotropic Microstructures with Penalization ) (固体各向同性惩罚函数法)
if enB min(1, en m)
xnew = max(0.001,max(x-move,min(1.,min(x+move,x.*sqrt(-dc./lmid)))))
n
C U T F ( e ) pueT keue e1
优化结果:各单元密度组成的矩阵——X
>Imagesc(-x)
目的:消除棋盘格效应及网格依赖性
RAMP( Rational Approximation of Material Properties ) (材料属性的理性近似模型)
Level Set法 (水平集法) ICM(独立映射法) ESO(进化法) ……
优化求解方法 OC法(优化准则法) MMA法(移动渐进线法) SLP(序列线性规划法) SQP(序列二次规划法) …………
9-拓扑优化方法
四、拓扑优化方法分类
从其物理模型的描述方法上一般分为 基结构法(The Ground Structural Method) 均匀化方法(The Homogenization Method) 渐 进 结 构 优 化 方 法 (The Evolutionary Structural
一、拓扑优化的历史
拓扑优化的研究是从最具代表性的桁架开始的,拓扑优化理 论的解析方法可追溯到由Michel提出的Michel桁架理论。 直到1964年Dorn、Gomory、Greenberg等人提出了基结 构法,将拓扑优化引入到数值计算领域,使其克服了Michel 桁架理论的局限性,重新使拓扑优化的研究活跃起来。
对于由n个杆件组成的桁架结构,其满应力条件为
Fi Ai
i
i 1, 2,
,n
由此可构造如下的迭代公式
A(k1)
i
(k)
A i
(k)
i
i
i 1, 2,
,n
2. 基于K-T条件的准则法
对于结构优化设计问题:
min f ( X ) X Rn
s.t. gu( X ) 0 u 1,2, , p
结构优化与材料优化
第一节 概述 第二节 结构优化设计的准则法 第三节 结构的拓扑优化方法 第四节 功能材料优化设计 第五节 柔性机构优化设计 第六节 结构多学科设计优化
第一节 概述
结构轻量化,提高有效载荷是飞行器设计者追求的永恒主题。 随着计算技术、材料科学、制造技术的飞速发展,传统的设 计、制造方法及结构形式已无法满足先进结构性能与功能的 要求,独特的服役力学环境对结构设计提出了前所未有的基 础科学问题。事实表明,火箭或人造卫星的结构重量每减少 一公斤,将获得整体重量减少一百公斤的增量系数;近年来, 复合材料,蜂窝层板及泡沫材料等轻质结构由于其抗冲击、 减震、吸能、隔音、散热等优越性能而受到普遍的关注,在 先进飞行器设计中应用日益广泛, 而这些优异特性的根本在 于进行结构优化设计和材料优化设计。
拓扑优化经典99行程序注释
44. 45. % PRINT RESULTS 屏幕上显示迭代信息 46. 47. 48. 49. 50. 51. % PLOT DENSITIES 优化结果的图形显示 52. colormap(gray); imagesc(-x); axis equal; axis tight; axis off;pause(1e6); 53. end 54. 55. 56. 57. %%%%%%%%%% OPTIMALITY CRITERIA UPDATE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 58. function [xnew]=OC(nelx,nely,x,volfrac,dc) 59. 60. l1 = 0; l2 = 100000; %用于体积约束的拉格朗日乘子 61. move = 0.2; 62. 63. while (l2-l1 > 1e-4) 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 75. 76. 77. %%%%%%%%%% MESH-INDEPENDENCY FILTER 敏度过滤技术子程序%%%%%%%%%%%%%%%%%%% 78. function [dcn]=check(nelx,nely,rmin,x,dc) 79. 80. dcn=zeros(nely,nelx); 81. 82. for i = 1:nelx 83. 85. 86. for k = max(i-floor(rmin),1):min(i+floor(rmin),nelx) for j = 1:nely 84. sum=0.0; 74. end if sum(sum(xnew)) - volfrac*nelx*nely > 0;%二乘法减半 l1 = lmid; else l2 = lmid; end %即论文公式的综合 xnew = max(0.001,max(x-move,min(1.,min(x+move,x.*sqrt(-dc./lmid))))); lmid = 0.5*(l2+l1);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
change = 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 )])
dcn(j,i) = dcn(j,i)/(x(j,i)*sum); end
100. %%%%%%%%%% FE-ANALYSIS 有限元求解子程 序%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 101. function [U]=FE(nelx,nely,x,penal) %自定义函数,最后返回[U] 102. 103. [KE] = lk; %单元刚度矩阵 104. 105. % sparse 把一个全矩阵转化为一个稀疏矩阵,只存储每一个非零元素的三个值:元素值,元 素的行号和列号 106. %总体刚度矩阵的稀疏矩阵 107. % *2 是因为 x,y 都有一个数 108. K = sparse(2*(nelx+1)*(nely+1), 2*(nelx+1)*(nely+1)); 109. %力矩阵的稀疏矩阵 110. F = sparse(2*(nely+1)*(nelx+1),1); 111. U = zeros(2*(nely+1)*(nelx+1),1); %零矩阵 112. 113. for elx = 1:nelx 114. 115. 116. 118. 119. % 左上,右上,右下,左下 自由度 120. % 一个点有两个,所以要*2。第一个从 1 开始,所以*2 之后要-1。 121. edof = [2*n1-1;2*n1; 2*n2-1;2*n2; 2*n2+1;2*n2+2; 2*n1+1;2*n1+2]; 122. 123. %将单元刚度矩阵组装成总的刚度矩阵 124. K(edof,edof) = K(edof,edof) + x(ely,elx)^penal*KE; 125. end 126. end 127. 128. % DEFINE LOADS AND SUPPORTS (HALF MBB-BEAM) for ely = 1:nely %一列列的排序 n1 = (nely+1)*(elx-1)+ely; %左上 +ely; %右上
44. 45. % PRINT RESULTS 屏幕上显示迭代信息 46. 47. 48. 49. 50. 51. % PLOT DENSITIES 优化结果的图形显示 52. colormap(gray); imagesc(-x); axis equal; axis tight; axis off;pause(1e6); 53. end 54. 55. 56. 57. %%%%%%%%%% OPTIMALITY CRITERIA UPDATE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 58. function [xnew]=OC(nelx,nely,x,volfrac,dc) 59. 60. l1 = 0; l2 = 100000; %用于体积约束的拉格朗日乘子 61. move = 0.2; 62. 63. while (l2-l1 > 1e-4) 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 75. 76. 77. %%%%%%%%%% MESH-INDEPENDENCY FILTER 敏度过滤技术子程序%%%%%%%%%%%%%%%%%%% 78. function [dcn]=check(nelx,nely,rmin,x,dc) 79. 80. dcn=zeros(nely,nelx); 81. 82. for i = 1:nelx 83. 85. 86. for k = max(i-floor(rmin),1):min(i+floor(rmin),nelx) for j = 1:nely 84. sum=0.0; 74. end if sum(sum(xnew)) - volfrac*nelx*nely > 0;%二乘法减半 l1 = lmid; else l2 = lmid; end %即论文公式的综合 xnew = max(0.001,max(x-move,min(1.,min(x+move,x.*sqrt(-dc./lmid))))); lmid = 0.5*(l2+l1);
% x 是设计变量(单元伪密度) %存放迭代次数的变量
时
loop = loop + 1; xold = x; %把前一次的设计变量付给 xold
[U]=FE(nelx,nely,x,penal); %有限元分析,得到位移矢量 U
FE: finite element
主程序部分包括: 数据初始化;有限元分析;敏度分析,OC算法,结果显示
1. function top(nelx,nely,volfrac,penal,rmin); 2. 3. nelx=80; 4. nely=20; 5. volfrac=0.4; 6. penal=3; 7. rmin=2; 8. 9. % INITIALIZE 10. x(1:nely,1:nelx) = volfrac; 11. loop = 0; 12. change = 1.; 收敛 13. 14. % START ITERATION 15. while change > 0.01 %当两次连续目标函数迭代的差<=0.01 时,迭代结束 16. 17. 18. 19. % FE-ANALYSIS 20. 21. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. % FILTERING OF SENSITIVITIES 40. 41. [dc] = check(nelx,nely,rmin,x,dc); %灵敏度过滤,为了边界光顺一点 end %所示单元的自由度,左上,右上,右下,左下 for ely = 1:nely for elx = 1:nelx n1 = (nely+1)*(elx-1)+ely; n2 = (nely+1)* elx +ely; %左上角的单元节点 %右上角的单元节点
87. 88. 89. 90. 91. 92. 93. end 94. 95. 96. 98. 99. 97. end
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
表示ely从1到nely,+1递增
% x 轴方向上单元个数 % y 轴方向上单元个数 %体积比 %材料插值的惩罚因子 %敏度过滤半径
{ }是用于元胞数组,即cell,其 中的元素可以是不同格式的,如 字符和数值,大小也可以不同; [ ] 是用于描述矩阵,初始化或 赋值时使用; ( ) 是用于提取元素,或函数调 用,定义时使用。
Ue:元素位移矢量; U:整体位移矢量
c = c + x(ely,elx)^penal*Ue'*KE*Ue; %计算目标函数的值(柔度) dc(ely,elx) = -penal*x(ely,elx)^(penal-1)*Ue'*KE*Ue; %目标函数的灵敏度 end
参考论文中的公式
42. % DESIGN UPDATE BY THE OPTIMALITY CRITERIA METHOD 最优准则法优化更新设计变量 43. [x] = OC(nelx,nely,x,volfrac,dc);
调用有限元分析子程序
22. % OBJECTIVE FUNCTION AND SENSITIVITY ANALYSIS [KE] = lk; c = 0.; %单位刚度矩阵
因为元素刚度矩阵对任何元素都是一样的,所以该子程序仅被调用一次
%用来存放目标函数的变量,这里刚度最大,柔度最小
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);
在矩阵中,若数值为0的元素数目远远多于非0元素的数目, 并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵
117. n2 = (nely+1)* elx
129. F(2,1) = -1; % 应用了一个在左上角的垂直单元力。 130. %按着图上来的,最左边和右下角已经固定 131. fixeddofs 132. alldofs 133. 134. % setdiff 因无约束自由度与固定自由度的不同来找到无约束自由度 135. freedofs 136. 137. % SOLVING 138. U(freedofs,:) = K(freedofs,freedofs) \ F(freedofs,:); 139. U(fixeddofs,:)= 0; % 矩阵 A 的第 r 行:A(r,:) 140. 141. 142. %%%%%%%%%% ELEMENT STIFFNESS MATRIX 单元刚度矩阵的子程 序%%%%%%%%%%%%%%%%%%%% 143. function [KE]=lk 144. 145. E = 1.; 146. nu = 0.3; 147. k=[ 1/2-nu/6 148. -1/4+nu/12 149. 150. 152. 153. 154. 155. 156. 157. 158. %u1,v1, u2,v2, u3,v3, u4,v4 151. 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)]; 1/8+nu/8 -1/4-nu/12 -1/8+3*nu/8 ... nu/6 1/8-3*nu/8]; -1/8-nu/8 = setdiff(alldofs,fixeddofs); %不受约束的自由度 = union([1:2:2*(nely+1)],[2*(nelx+1)*(nely+1)]); %固定结点 = [1:2*(nely+1)*(nelx+1)]; %所有结点