ANSYS优化揭密引子
时下ANSYS高手颇多,但还有很多FEA战友对ANSYS的优化过程用之不熟,这里抛砖引玉,写下自己对ANSYS优化模块的使用心得,不当之处敬请指正。
deform@smth
Aug,14,2002
认识ANSYS优化模块
1.1 什么时候我需要它的帮忙?
什么是ANSYS优化?我想说明一个例子要比我在这里对你絮叨半天容易理解的多。
注意过普通的水杯吗?底面圆圆的,上面加盖的哪一种。仔细观察一下,你会发现比较老式的此类水杯有一个共同特点:底面直径=水杯高度。
图1 水杯的简化模型为什么是这样呢?偷偷的告诉你:因为只有满足这个条件,才能在原料耗费最少的情况下使杯子的容积最大。可不是,在材料一定的情况下,如果水杯的底面积大,其高度必然就要小;如果高度变大了,底面积又大不了,如何调和这两者之间的矛盾?其实这恰恰就反应了一个完整的优化过程。
在这里,一个水杯的材料是一定的,所要优化的变量就是杯子底面的半径r和杯子的高度h,在ANSYS的优化模块里面把这些需要优化的变量叫做设计变量(DV);优化的目标是要使整个水杯的容积最大,这个目标在ANSYS的优化过程里叫目标函数(OBJ);再者,对设计变量的优化有一定的限制条件,比如说整个杯子的材料不变,这些限制条件在ANSYS的优化模块中用状态变量(SV)来控制。闲话少说,下面我们就来看看ANSYS中怎么通过设定DV、SV、OBJ,利用优化模块求解以上问题。
首先参数化的建立一个分析文件(我假设叫volu.inp),水杯初始半径为R=1,高度为H=1(DV),由于水杯材料直接喝水杯的表面积有关系,这里我假设水杯表面积不能大于100,这样就有S=2πRH+2πR2<100(SV),水杯的容积为V=πR2H (OBJ)。
File:volu.inp
R=1
H=1
S=2*3.14*R*H+2*3.14*R*R
V=10000/(3.14*R*R*H)
然后再建一个优化分析文件(我假设叫optvolu.inp),设定优化变量,并求解。
File:optvolu.inp
/clear,nostart
/input,volu,inp
/opt
opanl,volu,inp
opvar,R,dv,1,10,1e-2
opvar,H,dv,1,10,1e-2
opvar,S,sv,,100,1e-2
opvar,V,obj,,,1e-2
opkeep,on
optype,subp
opsave,optvolu,opt0
opexec
最后,哈,打开Ansys6.1,在命令输入框中键入”/input,optvolu,inp”,整个优化过程就开始了。
图2 ANSYS优化过程图几秒钟的优化过程结束后,让我们来看一下优化的结果:
/opt
optlist,all
图3 优化结果1
上图中左右带*的SET 22是最优解,由此可以看出,要想在表面积一定的情况下使水杯容积最大,的确有这样一个规律 H=D=2*R。有兴趣的同志可以用求极值的方法演算一下,一定会得到相同的答案。(话外语:原来那些无盖的糖瓷盆有一个规律是H=R,也是为了满足瓷盆容积最大。)
ANSYS的优化模块是用来求解工程分析中的优化例子的,但上面一个例子说明即使这样于工程毫无关系纯数学极值问题,也能够轻松求解。不过在细节处会有一些技巧,后面再仔细分析。(其实用ANSYS的优化模块完全能解决数学上比较负责的极值问题,不过现在有了Matlab、Mathematica,大概也没有人愿意来用ANSYS献丑了)
1.2 ANSYS优化设计基础
前面写了一个例子,来说明ANSYS的基本优化过程。在这一节中,我们结合这个例子来说明一下优化模块中的一些概念。
1.2.1 优化模块中的三大变量:
设计变量(DV):即自变量。例子中的opvar,R,dv,1,10,1e-2就是用来定义一个设计变量R,其上限为10,下限为1,公差为10-2(公差和优化过程的收敛有关)。ANSYS优化模块中允许定义不超过60个设计变量。
状态变量(SV):用来体现优化的边界条件,是设计变量的函数。例子里面opvar,S,sv,,100,1e-2就是定义了一个状态变量S,它的上限为100,无下限,公差为10-2。从文件volu.inp中可以看到,S=2*3.14*R*H+2*3.14*R*R。可见,定义这样一个状态变量,即是限制水杯的表面积(可以认为表示材料的多少)不大于100。在ANSYS优化模块中用户可以定义不超过100个状态变量。
目标函数(OBJ):最终的优化目的。它必须是设计变量的函数,而且只能求其最小值。看到volu.inp里面目标函数的定义了吧V=10000/(3.14*R*R*H),为了把求最大体积转化为求最小值,只好对它求倒数了;如果知道目标函数的上限,还可以用一个大数减目标函数的方法来转换。例子中opvar,V,obj,,,1e-2就是定义了一个目标函数V,它的公差是10-2。
1.2.2 ANSYS优化模块中的两种求解模式
ANSYS优化模块的求解有两种运行模式,一种是在GUI方式下运行,即已经打开ANSYS的分析界面后进行分析;另一种是Batch模式,无需打开ANSYS分析界面,后台运行求解。
前面例子的运行过程其实就是一个典型的GUI方式体现,它涉及到两个重要的文件:一个就是类似volu.inp的ANSYS分析文件,如果是一个工程问题,该文件中应该有参数定义、参数建模、求解、结果提取、目标函数赋值的一个全过程(由于优化求解是一个不断跌代的过程,ANSYS分析文件其实是包涵了一个完整的循环)。另一个文件是类似optvolu.inp的优化控制文件,基本语句就那么几条,无非是定义三大变量、优化方式、优化控制等几条,用户拿过去稍稍替换下就可以用在不同的问题上。(注:细心的读者可能会提问,既然ANSYS分析文件包涵了一个完整的循环,但是整个优化过程中是要求设计变量不断改变的,每次循环都有一个参数重定义的过程,不会使设计变量恢复初始值吗?这一点勿用担心,正是由于有了另一个优化控制文件,优化过程只在第一次进行完全的参数定义工作,在后续循环中,优化控制文件中声明的设计变量定义将被忽略)。有了这样两个文件,简单的在命令窗口把优化控制文件输入进去(其中的opanl命令会自动调用指定的ANSYS分析文件),就可以完成整个优化过程。以上说明的是完全使用命令流的GUI方式,至于如何在菜单中进行优化过程的定制,窃以为没有命令流方式快捷,这里就不再赘述了。
另一种方式是后台运行的Batch方式,它只需要一个输入命令流文件(batch文件)。该文件可以简单的把GUI方式下ANSYS分析文件和优化控制文件合并得到。不过有几个注意点:1、需要把optanl语句去掉,因为在batch文件中,不需要提供ANSYS分析文件名字,系统默认batch文件中/opt语句以前的所有部分为ANSYS分析文件内容。2、以前为防止在GUI方式下的重新定义错误而引入的一些语句,如/cle,nostart需要去除。上述例子经过合并、处理,就可以得到Batch方式下需要的batch文件batch.inp
File:batch.inp
R=1
H=1
S=2*3.14*R*H+2*3.14*R*R
V=10000/(3.14*R*R*H)
/opt
opvar,R,dv,1,10,1e-2
opvar,H,dv,1,10,1e-2
opvar,S,sv,,100,1e-2
opvar,V,obj,,,1e-2
opkeep,on
optype,subp
opsave,optvolu,opt0
opexec
假定batch.inp在目录bvolu下,在cmd命令行方式下,进入bvolu目录,执行命令:
ansys61 -b -j bvolu -p ane3flds -i batch.inp –o output.txt
命令中 -b 参数指定用batch模式求解;
-j bvolu参数指定该求解默认工作名字为bvolu (不指定就默认为file)
-p ane3flds 参数指定使用ANSYS/Multiphysics/LS-DYNA求解器
-i batch.inp 参数指定输入batch文件为batch.inp
-o output.txt 参数指定把输出导向到output.txt中,便于查看过程纠错运行结束后,可以从output.txt文件中看到最有解是多少:
文件output.txt中的一部分数据:
>>>>>> SOLUTION HAS CONVERGED TO POSSIBLE OPTIMUM <<<<<<
(BASED ON DV TOLERANCES BETWEEN FINAL TWO DESIGNS)
FINAL VARIABLES ARE
SET 22
(FEASIBLE)
S (SV) 99.997
R (DV) 2.2851
H (DV) 4.6830
V (OBJ) 130.23
其结果与用GUI方式求解完全一样,生成的bvolu.opt文件中也有最优解的信息,同时还能看到求解整个参数迭代求解过程。
1.2.3 ANSYS的优化方法和收敛准则例子中优化控制文件里面的优化命令,还有opkeep,on(用来要求保留最优解的DB),opexec(执行优化),剩下重要的命令就只有optype了,这个命令指定ANSYS优化中使用的优化方法。
优化方法发展到今天可说是形形色色,比较完善了。ANSYS的优化模块中只支持两种优化方法,不能不说是一大遗憾。但ANSYS的这两种优化方法对绝大多数的工程问题已经足够,更何况ANSYS还留下了用户话优化接口,方便用户写出适合于自己问题的优化方法来使用。
看看例子中的命令”optype,subp”,这里指定的是第一种通用的函数逼进优化方法。改种方法的本质是采用最小二乘逼进,求取一个函数面来拟和解空间,然后再对该函数面求极值。无疑这是一种普适的优化方法,不容易陷入局部极值点,但优化精度一般不是很高,因此多用来做粗优化的手段。
另外一种是针对第一种优化方法缺点的改进方法,叫做梯度寻优。如果说第一种方法是C0阶、大范围普适的粗优化方法;第二种方法就是C1阶、局部寻优的精优化方法。一般来说,一个比较负责的问题都需要同时采用两种优化方法,先用函数逼进的第一类方法初步求得最优解基本位置,然后再采用梯度寻优的对最优解的位置进行更精确的确定。(注:但用第二类梯度寻优进行优化,不仅时间消耗长,还可能陷入局部最小点,因此通常的问题都建议使用0阶函数逼进优化subp)
前面讨论了ANSYS的两种优化方法,但光了解优化进行的方式是不够的。ANSYS进行优化计算,都是一个不断迭代的过程。有时候,了解优化过程什么时候结束比了解优化过程本身更加重要。下面我们就来谈谈决定优化过程什么时候结束的条件:优化准则。
假设Fj、Xj和Fj-1、Xj-1分别为目标函数、设计变量第j次迭代和第j-1次迭代的结果(Xj为矢量),Fb和Xb分别是当前的最优目标函数和其相应的设计变量值。如果满足或者,为目标函数的公差,那么认为迭代收敛,于是迭代停止。假设或者,那么也认为设计变量的搜索已经趋于收敛,于是迭代停止。当然,为了防止优化过程在某些问题中不收敛,ANSYS还提供了循环数量控制。比如说,如果你使用的是0阶函数逼进优化,你可以用opsubp命令设定最多循环多少次退出,已经当不可行解连续出现多少次就认为优化过程发散,强行退出等。(注:在0阶函数逼进优化中,默认的最大循环次数为30;默认当连续出现7次不可行解,就认为优化过程发散)
在上面的描述中,可能只有公差和不可行解这两个概念在ANSYS中的意义我们不甚了解了。可行解与不可行解的定义将在下一小节中详细定义,这里说明一下公差。从例子里面可以看出,我对设计变量、状态变量、目标函数都给出了公差限制。从上面一段的的分析可以得知,设计变量、目标函数的公差可以控制优化过程的收敛性。其实设计变量也一样,如果前后两次设计变量之间的误差小于设计变量的公差时,优化过程也会自动停止,不过对它的限制主要是来控制可行性(下一节介绍可行性),三大变量的公差都有一个默认值:
对于设计变量,默认公差就是0.01×(上限-下限),如果只有上限,默认公差为0.01×上限绝对值。(设计变量定义时必须指定上限)。
对于目标函数,由于定义时不指定上下限,默认公差为0.01×当前目标函数值。
对于状态变量,如果指定了上下限,默认公差为0.01×(上限-下限),如果只有上限或者下限,默认公差为0.01×上限或者下限的绝对值。
上述默认公差的定义都能在ANSYS的随机帮助中查到,这里为什么如此冗余的详细介绍它呢?因为大多数情况下你不能得到最优解都是这个东西在作怪。
为什么例子中要每个变量都详细定义公差呢?我们可以把这些公差都去掉,看看是什么结果:
图4优化结果2
由此可见,不带任何公差的最优化分析得不到我们所要求的最有解(151.62显然比带公差后得到的结果130.23要大许多),而且优化过程才做了6步就停止了,查看下ANSYS的输出窗口,显示:
>>>>>> SOLUTION HAS CONVERGED TO POSSIBLE OPTIMUM <<<<<<
(BASED ON OBJ TOLERANCE BETWEEN BEST AND FINAL DESIGNS)
可见是因为导致循环提前结束。(注:细观上图,Fj=157.20,Fb=151.62,默认公差似乎此处应该是1.5720,似乎还没有满足这个收敛准则,为什么ANSYS却认为满足了,这里就不得而知,可能ANSYS内部对默认公差里面的当前值另有解释;如果你强行规定目标函数公差为1,可以看到循环多进行一步后也会提前结束,不过这时候当前解151.65和最优解151.62倒的确相差小于公差1了)。此时,大家一定可以理解例子中为什么要对公差的限制如此严谨了(0.01)。因为程序的取样,迭代都有随机性,只有这样,才能保证程序不会因为上述公差太大的缘故自动停止而得不到最优解。
有兴趣的同学还可以改变一下其他参数的公差大小,甚至用opsubp命令改变默认循环的次数等,这些实验将会更加加深你对优化过程、收敛准则的理解,便于提高你都负责优化问题的驾驭能力。
1.2.4 可行解与不可行解
这两个概念比较好理解,所谓可行解就是满足要求的一组结果。既是说设计变量都在设计变量的上下限内,相应的状态变量也满足状态变量上下限要求。以上任何一条不满足都被示为不可行解。
图4中SET 2、3、4都被示为不可行解,因为他们相应的状态变量都越界了。有的同学会提问,SET 6中状态变量为100.71,不是也越界了吗?这是因为ANSYS中判断越界也有一个公差,状态变量的默认公差在这个例子中是1,而100.71和100直接的差的绝对值小于这个公差,因此认为SET 6也为可行解。
ANSYS优化设计的万能三步曲这里我描述一下拿到一个工程问题,怎么用一种通用的模式进行最优化分析。我通常不不使用Batch模式的优化方法,因为最好还不免需要打开ANSYS的GUI界面去提取优化数据库,绘出变量关系曲线等。这一节介绍的万能方法是基于GUI的命令流方法。
由于鄙人想象力有限,这里只要引以前写APDL教程时候的一个例子来说明优化设计的一般方法。(上次是用APDL做单循环求解最优角度,这里我们用强大的ANSYS优化模块来完成它)
问题描述:
图5 薄板受压的模型图如图5(a)一所示,一带孔薄板,长4000mm,宽2000mm,顶部中心部分1800mm处承受42MP的压力,左右两个长圆孔中心分别踞四周1000mm,长圆孔的具体形式如图5(b)所示,上下分别为半圆,中部用直线衔接。这里假设长圆长轴与水平方向夹角为α。为了使得孔边缘应力集中最小,这里拟调整α的大小(α∈[0,π/2]),以在固定的H情况下达到长圆孔周围应力集中最小。
2.1 构建优化分析文件这里用参数My_sita和My_H对整个模型进行参数化建模:(My_sita表征角α,My_H表征高度H,两者的初始值分别为0°和100mm,最后提取出孔边缘最大应力值mysmax)
File:circle.inp
PI=3.14159
My_H=150
My_sita=45
sita=My_sita/180*PI
r=0.2
H=My_H/1000
!Customize the Environment
keyw,pr_struc,1
/prep7
et,1,shell63
r,1,0.12,0.12,0.12,0.12
uimp,1,ex,dens,nuxy,2.1e9,1.2,0.375
!Modeling
!Create plate
k,1,0,0
k,2,2,0
k,3,2,2
k,4,0,2
k,5,0.9,2
k,6,1,1
l,1,2
l,2,3
l,3,5
l,5,4
l,4,1
al,1,2,3,4,5
!Create hole
!Create my coordinate
k,7,1+H*cos(sita),1+H*sin(sita)
k,10,1+H*cos(sita),1+H*sin(sita),100
k,8,1+r*cos(sita+PI/2),1+r*sin(sita+PI/2)
cskp,11,0,6,7,8
csys,11
!Create Hole
k,9,H,r
l,7,9
l,7,6
adrag,6,,,,,,7
arotat,6,,,,,,7,10,-90
arsys,y,2,3,1
arsym,x,2,5,1
aadd,2,3,4,5,6,7,8,9
asba,1,10
csys,0
arsym,x,2,,,,0,0
nummer,all,,, ,low
aadd,1,2
/auto,1
gplot
!Meshing the plane
smrt,6
amesh,all
!Add DOF
DK,2,UX,0,,,UY
DK,14,UX,0,,,UY
!Add Pressure
SFL,4,PRES,42
SFL,11,PRES,42
/solu
solve
/post1
ar11=ndinqr(0,14)
_s1=
*dim,_s1,,ar11
*vget,_s1(1),node,1,s,1
*vscfun,mysmax,max,_s1(1)
2.2 构建优化控制文件这第二步工作非常简单,随便拿个优化控制文件来,稍微把设计变量、状态变量、目标函数一修改,就成完成了优化控制文件。
File:optcircle.inp
/opt
opclr
fini
/clear,nostart
/input,circle,inp
/opt
opanl,circle,inp
opvar,My_sita,dv,0,90
opvar,H,dv,100,200
opvar,mysmax,obj
opkeep,on
optype,subp
opsave,optcircle,opt0
opexec
2.3 优化求解
现在万事具备,打开ANSYS的GUI界面,输入/input,optcircle,inp,就开始求解了。计算结束后看一下结果:
图6 优化结果3
由此得到最优解在α=48.422°,H=161.79附近。和我们上次用APDL循环优化得到的结果α=40°差不太多。这样,整个优化过程就完成了,非常容易,而且适用于所有的优化问题。
当然好的优化结果并不是单单遵循上面的三步法就能得到的。其实,上面这不过这只是一个粗略的结果。从图6看到,才采样了5个点,我们上次用APDL循环优化都是每5°采样一个点,比这样的0阶优化还精确的多。没有关系,既然嫌结果不精确,我们可以在0阶优化的基础上再进行一下1阶梯度优化:
在circle.inp文件中把My_H=150一句替换成My_H=161.79
把My_sita=45一句替换成My_sita=48.422
在optcircle.inp文件中optype,subp一句替换为optype,first
给其中定义设计变量、状态变量、目标函数的语句都加上公差1e-2,防止其提前收敛。
得到更加精确的结果如下:
图7 优化结果4
这里得到的最优解是当α=43.385°,H=108.50mm时,最优解mysmax=569.25,比原来的最优解值639.03精确了很多。当然这一次1阶优化结束是因为达到了默认的循环次数10,如果你再加以一些处理,或者把默认循环次数加大,可能会得到更优的参数。
ANSYS优化工具理解看完前面这些部分,也许你对ANSYS的优化过程理解的游刃有余了。你已经学会通过手动改变三大变量的公差,或者参数的初始值来获得更优解。不过想不想更加提高自己的?手动在全自动控制中总是一个很大的累赘,也许你会想先自动探测一下解空间,然后通过判断选择一下初始参数集,再进行二级甚至更多级的优化;也许你想自己规划优化的过程;也许你想考察各个设计变量之间的耦合关系和它们对目标函数的影响。如果你想更进一步提高自己的ANSYS优化能力,可能需要进一步吃透ANSYS提供给大家使用的形形色色优化工具。
本来想详细写点优化工具使用的例子,但一来ANSYS培训手册里面有详细的例子讲解,二来时间也不允许,整理几个很新颖的工程例子还是颇伤脑筋,这里就每个优化工具点评一下其特点功用,相信大家也不难掌握。
单循环工具可用来在命令流中控制实现一次优化过程,得到所要目标值。
主要可以用于自己规划的优化过程,不常用。
随机工具可用来在一些优化方案实施前,获得一定数量的可行解。
很多问题在优化过程中会出现大量不可行解,浪费求解效率,在求解前获得一组可行解能够减少在后续迭代中出现不可行解的几率,提高求解效率,复杂问题中常用。
扫描工具可用来研究某一设计变量的变化对目标函数的影响情况。
多是在一定参照解得条件下(参照解默认取最优解),在保持参照解其他变量不变得情况下,考察某一设计变量对目标函数得影响情况,其结果可以看到该设计变量对目标函数的影响趋势和敏度。(有时候可以根据结果把惰性设计变量去除,减小优化过程规模)
梯度工具可用来研究在优化结果处,哪一个设计变量的扰动对目标函数影响最大。
也是在参照解(多是最优解)处,可以考察哪个设计变量对目标函数的变化影响最大。(有时候可以根据结果适当调整设计变量公差,来提高优化效率)
乘子工具可用来研究在整个设计域内,设计变量或设计变量的耦合对目标函数的影响大小。
该工具主要可以考察设计变量之间的耦合性,寻求最佳耦合点。该工具使用不多,感觉在很小的取样点情况下,使用乘子工具没有很大实际意义。
ANSYS优化心得可能大家已经被上面如此之多的讲解讲的混混欲睡了,再坚持一下,我再谈一下我这半年来研究ANSYS优化的心得:
首先,使用上面总结的工程优化三步法,你应该面对任何工程问题都面无难色。三步法中的主要工作都是第一步参数化建模,这个对用惯了命令流的朋友应该没有难度,不习惯命令流的同志慢慢对照log文件也能搞得差不多。与普通工程问题建模求解相比,优化过程的分析文件中多了一个提取目标函数的工作,这一部分内容其实大都差不多,在ANSYS培训手册中随便拷贝一个提取的例子过来,适当修改一下,个性化命令一把,就轻松变成自己的东西了。
再次,优化结果可信吗?普适的0阶优化随机在解空间中抽取采样点,用这些采样点来拟和曲线求解最优一定有效吗?我的看法是,方法是有效的,结果是不是合理就要看分析人的水平了。如果说0阶优化不容易陷入局部最优点,哪可不一定,很多例子中,随机产生的采样点老是在最优解附件徘徊,这时候你就要学会修正初始值;很多情况下收敛过早结束,结果却不是你想要的,你就要学会查看优化过程,搞清收敛过早的原因,从而对症下药,调整公差、循环数量限制等,得到你所想要的最终结果。有些问题中你会发现某些设计变量有惰性(即对目标函数影响不大),你要学会果断剔除冗余设计变量,减小优化规模(大问题中这样做的效果是十分明显的)。再高级点的就是搞点优化方法的二次开发,构建适合自己问题的特殊优化过程,当然这些难度都十分大。
一句话,软件是死的,人是活的。无论软件的功能多么强大,只有懂的正确思考判断的人才能发挥出其完全的功能。
祝大家都早日成为ANSYS的优化模块大师!
(也许你现在已经是了!)
时下ANSYS高手颇多,但还有很多FEA战友对ANSYS的优化过程用之不熟,这里抛砖引玉,写下自己对ANSYS优化模块的使用心得,不当之处敬请指正。
deform@smth
Aug,14,2002
认识ANSYS优化模块
1.1 什么时候我需要它的帮忙?
什么是ANSYS优化?我想说明一个例子要比我在这里对你絮叨半天容易理解的多。
注意过普通的水杯吗?底面圆圆的,上面加盖的哪一种。仔细观察一下,你会发现比较老式的此类水杯有一个共同特点:底面直径=水杯高度。
图1 水杯的简化模型为什么是这样呢?偷偷的告诉你:因为只有满足这个条件,才能在原料耗费最少的情况下使杯子的容积最大。可不是,在材料一定的情况下,如果水杯的底面积大,其高度必然就要小;如果高度变大了,底面积又大不了,如何调和这两者之间的矛盾?其实这恰恰就反应了一个完整的优化过程。
在这里,一个水杯的材料是一定的,所要优化的变量就是杯子底面的半径r和杯子的高度h,在ANSYS的优化模块里面把这些需要优化的变量叫做设计变量(DV);优化的目标是要使整个水杯的容积最大,这个目标在ANSYS的优化过程里叫目标函数(OBJ);再者,对设计变量的优化有一定的限制条件,比如说整个杯子的材料不变,这些限制条件在ANSYS的优化模块中用状态变量(SV)来控制。闲话少说,下面我们就来看看ANSYS中怎么通过设定DV、SV、OBJ,利用优化模块求解以上问题。
首先参数化的建立一个分析文件(我假设叫volu.inp),水杯初始半径为R=1,高度为H=1(DV),由于水杯材料直接喝水杯的表面积有关系,这里我假设水杯表面积不能大于100,这样就有S=2πRH+2πR2<100(SV),水杯的容积为V=πR2H (OBJ)。
File:volu.inp
R=1
H=1
S=2*3.14*R*H+2*3.14*R*R
V=10000/(3.14*R*R*H)
然后再建一个优化分析文件(我假设叫optvolu.inp),设定优化变量,并求解。
File:optvolu.inp
/clear,nostart
/input,volu,inp
/opt
opanl,volu,inp
opvar,R,dv,1,10,1e-2
opvar,H,dv,1,10,1e-2
opvar,S,sv,,100,1e-2
opvar,V,obj,,,1e-2
opkeep,on
optype,subp
opsave,optvolu,opt0
opexec
最后,哈,打开Ansys6.1,在命令输入框中键入”/input,optvolu,inp”,整个优化过程就开始了。
图2 ANSYS优化过程图几秒钟的优化过程结束后,让我们来看一下优化的结果:
/opt
optlist,all
图3 优化结果1
上图中左右带*的SET 22是最优解,由此可以看出,要想在表面积一定的情况下使水杯容积最大,的确有这样一个规律 H=D=2*R。有兴趣的同志可以用求极值的方法演算一下,一定会得到相同的答案。(话外语:原来那些无盖的糖瓷盆有一个规律是H=R,也是为了满足瓷盆容积最大。)
ANSYS的优化模块是用来求解工程分析中的优化例子的,但上面一个例子说明即使这样于工程毫无关系纯数学极值问题,也能够轻松求解。不过在细节处会有一些技巧,后面再仔细分析。(其实用ANSYS的优化模块完全能解决数学上比较负责的极值问题,不过现在有了Matlab、Mathematica,大概也没有人愿意来用ANSYS献丑了)
1.2 ANSYS优化设计基础
前面写了一个例子,来说明ANSYS的基本优化过程。在这一节中,我们结合这个例子来说明一下优化模块中的一些概念。
1.2.1 优化模块中的三大变量:
设计变量(DV):即自变量。例子中的opvar,R,dv,1,10,1e-2就是用来定义一个设计变量R,其上限为10,下限为1,公差为10-2(公差和优化过程的收敛有关)。ANSYS优化模块中允许定义不超过60个设计变量。
状态变量(SV):用来体现优化的边界条件,是设计变量的函数。例子里面opvar,S,sv,,100,1e-2就是定义了一个状态变量S,它的上限为100,无下限,公差为10-2。从文件volu.inp中可以看到,S=2*3.14*R*H+2*3.14*R*R。可见,定义这样一个状态变量,即是限制水杯的表面积(可以认为表示材料的多少)不大于100。在ANSYS优化模块中用户可以定义不超过100个状态变量。
目标函数(OBJ):最终的优化目的。它必须是设计变量的函数,而且只能求其最小值。看到volu.inp里面目标函数的定义了吧V=10000/(3.14*R*R*H),为了把求最大体积转化为求最小值,只好对它求倒数了;如果知道目标函数的上限,还可以用一个大数减目标函数的方法来转换。例子中opvar,V,obj,,,1e-2就是定义了一个目标函数V,它的公差是10-2。
1.2.2 ANSYS优化模块中的两种求解模式
ANSYS优化模块的求解有两种运行模式,一种是在GUI方式下运行,即已经打开ANSYS的分析界面后进行分析;另一种是Batch模式,无需打开ANSYS分析界面,后台运行求解。
前面例子的运行过程其实就是一个典型的GUI方式体现,它涉及到两个重要的文件:一个就是类似volu.inp的ANSYS分析文件,如果是一个工程问题,该文件中应该有参数定义、参数建模、求解、结果提取、目标函数赋值的一个全过程(由于优化求解是一个不断跌代的过程,ANSYS分析文件其实是包涵了一个完整的循环)。另一个文件是类似optvolu.inp的优化控制文件,基本语句就那么几条,无非是定义三大变量、优化方式、优化控制等几条,用户拿过去稍稍替换下就可以用在不同的问题上。(注:细心的读者可能会提问,既然ANSYS分析文件包涵了一个完整的循环,但是整个优化过程中是要求设计变量不断改变的,每次循环都有一个参数重定义的过程,不会使设计变量恢复初始值吗?这一点勿用担心,正是由于有了另一个优化控制文件,优化过程只在第一次进行完全的参数定义工作,在后续循环中,优化控制文件中声明的设计变量定义将被忽略)。有了这样两个文件,简单的在命令窗口把优化控制文件输入进去(其中的opanl命令会自动调用指定的ANSYS分析文件),就可以完成整个优化过程。以上说明的是完全使用命令流的GUI方式,至于如何在菜单中进行优化过程的定制,窃以为没有命令流方式快捷,这里就不再赘述了。
另一种方式是后台运行的Batch方式,它只需要一个输入命令流文件(batch文件)。该文件可以简单的把GUI方式下ANSYS分析文件和优化控制文件合并得到。不过有几个注意点:1、需要把optanl语句去掉,因为在batch文件中,不需要提供ANSYS分析文件名字,系统默认batch文件中/opt语句以前的所有部分为ANSYS分析文件内容。2、以前为防止在GUI方式下的重新定义错误而引入的一些语句,如/cle,nostart需要去除。上述例子经过合并、处理,就可以得到Batch方式下需要的batch文件batch.inp
File:batch.inp
R=1
H=1
S=2*3.14*R*H+2*3.14*R*R
V=10000/(3.14*R*R*H)
/opt
opvar,R,dv,1,10,1e-2
opvar,H,dv,1,10,1e-2
opvar,S,sv,,100,1e-2
opvar,V,obj,,,1e-2
opkeep,on
optype,subp
opsave,optvolu,opt0
opexec
假定batch.inp在目录bvolu下,在cmd命令行方式下,进入bvolu目录,执行命令:
ansys61 -b -j bvolu -p ane3flds -i batch.inp –o output.txt
命令中 -b 参数指定用batch模式求解;
-j bvolu参数指定该求解默认工作名字为bvolu (不指定就默认为file)
-p ane3flds 参数指定使用ANSYS/Multiphysics/LS-DYNA求解器
-i batch.inp 参数指定输入batch文件为batch.inp
-o output.txt 参数指定把输出导向到output.txt中,便于查看过程纠错运行结束后,可以从output.txt文件中看到最有解是多少:
文件output.txt中的一部分数据:
>>>>>> SOLUTION HAS CONVERGED TO POSSIBLE OPTIMUM <<<<<<
(BASED ON DV TOLERANCES BETWEEN FINAL TWO DESIGNS)
FINAL VARIABLES ARE
SET 22
(FEASIBLE)
S (SV) 99.997
R (DV) 2.2851
H (DV) 4.6830
V (OBJ) 130.23
其结果与用GUI方式求解完全一样,生成的bvolu.opt文件中也有最优解的信息,同时还能看到求解整个参数迭代求解过程。
1.2.3 ANSYS的优化方法和收敛准则例子中优化控制文件里面的优化命令,还有opkeep,on(用来要求保留最优解的DB),opexec(执行优化),剩下重要的命令就只有optype了,这个命令指定ANSYS优化中使用的优化方法。
优化方法发展到今天可说是形形色色,比较完善了。ANSYS的优化模块中只支持两种优化方法,不能不说是一大遗憾。但ANSYS的这两种优化方法对绝大多数的工程问题已经足够,更何况ANSYS还留下了用户话优化接口,方便用户写出适合于自己问题的优化方法来使用。
看看例子中的命令”optype,subp”,这里指定的是第一种通用的函数逼进优化方法。改种方法的本质是采用最小二乘逼进,求取一个函数面来拟和解空间,然后再对该函数面求极值。无疑这是一种普适的优化方法,不容易陷入局部极值点,但优化精度一般不是很高,因此多用来做粗优化的手段。
另外一种是针对第一种优化方法缺点的改进方法,叫做梯度寻优。如果说第一种方法是C0阶、大范围普适的粗优化方法;第二种方法就是C1阶、局部寻优的精优化方法。一般来说,一个比较负责的问题都需要同时采用两种优化方法,先用函数逼进的第一类方法初步求得最优解基本位置,然后再采用梯度寻优的对最优解的位置进行更精确的确定。(注:但用第二类梯度寻优进行优化,不仅时间消耗长,还可能陷入局部最小点,因此通常的问题都建议使用0阶函数逼进优化subp)
前面讨论了ANSYS的两种优化方法,但光了解优化进行的方式是不够的。ANSYS进行优化计算,都是一个不断迭代的过程。有时候,了解优化过程什么时候结束比了解优化过程本身更加重要。下面我们就来谈谈决定优化过程什么时候结束的条件:优化准则。
假设Fj、Xj和Fj-1、Xj-1分别为目标函数、设计变量第j次迭代和第j-1次迭代的结果(Xj为矢量),Fb和Xb分别是当前的最优目标函数和其相应的设计变量值。如果满足或者,为目标函数的公差,那么认为迭代收敛,于是迭代停止。假设或者,那么也认为设计变量的搜索已经趋于收敛,于是迭代停止。当然,为了防止优化过程在某些问题中不收敛,ANSYS还提供了循环数量控制。比如说,如果你使用的是0阶函数逼进优化,你可以用opsubp命令设定最多循环多少次退出,已经当不可行解连续出现多少次就认为优化过程发散,强行退出等。(注:在0阶函数逼进优化中,默认的最大循环次数为30;默认当连续出现7次不可行解,就认为优化过程发散)
在上面的描述中,可能只有公差和不可行解这两个概念在ANSYS中的意义我们不甚了解了。可行解与不可行解的定义将在下一小节中详细定义,这里说明一下公差。从例子里面可以看出,我对设计变量、状态变量、目标函数都给出了公差限制。从上面一段的的分析可以得知,设计变量、目标函数的公差可以控制优化过程的收敛性。其实设计变量也一样,如果前后两次设计变量之间的误差小于设计变量的公差时,优化过程也会自动停止,不过对它的限制主要是来控制可行性(下一节介绍可行性),三大变量的公差都有一个默认值:
对于设计变量,默认公差就是0.01×(上限-下限),如果只有上限,默认公差为0.01×上限绝对值。(设计变量定义时必须指定上限)。
对于目标函数,由于定义时不指定上下限,默认公差为0.01×当前目标函数值。
对于状态变量,如果指定了上下限,默认公差为0.01×(上限-下限),如果只有上限或者下限,默认公差为0.01×上限或者下限的绝对值。
上述默认公差的定义都能在ANSYS的随机帮助中查到,这里为什么如此冗余的详细介绍它呢?因为大多数情况下你不能得到最优解都是这个东西在作怪。
为什么例子中要每个变量都详细定义公差呢?我们可以把这些公差都去掉,看看是什么结果:
图4优化结果2
由此可见,不带任何公差的最优化分析得不到我们所要求的最有解(151.62显然比带公差后得到的结果130.23要大许多),而且优化过程才做了6步就停止了,查看下ANSYS的输出窗口,显示:
>>>>>> SOLUTION HAS CONVERGED TO POSSIBLE OPTIMUM <<<<<<
(BASED ON OBJ TOLERANCE BETWEEN BEST AND FINAL DESIGNS)
可见是因为导致循环提前结束。(注:细观上图,Fj=157.20,Fb=151.62,默认公差似乎此处应该是1.5720,似乎还没有满足这个收敛准则,为什么ANSYS却认为满足了,这里就不得而知,可能ANSYS内部对默认公差里面的当前值另有解释;如果你强行规定目标函数公差为1,可以看到循环多进行一步后也会提前结束,不过这时候当前解151.65和最优解151.62倒的确相差小于公差1了)。此时,大家一定可以理解例子中为什么要对公差的限制如此严谨了(0.01)。因为程序的取样,迭代都有随机性,只有这样,才能保证程序不会因为上述公差太大的缘故自动停止而得不到最优解。
有兴趣的同学还可以改变一下其他参数的公差大小,甚至用opsubp命令改变默认循环的次数等,这些实验将会更加加深你对优化过程、收敛准则的理解,便于提高你都负责优化问题的驾驭能力。
1.2.4 可行解与不可行解
这两个概念比较好理解,所谓可行解就是满足要求的一组结果。既是说设计变量都在设计变量的上下限内,相应的状态变量也满足状态变量上下限要求。以上任何一条不满足都被示为不可行解。
图4中SET 2、3、4都被示为不可行解,因为他们相应的状态变量都越界了。有的同学会提问,SET 6中状态变量为100.71,不是也越界了吗?这是因为ANSYS中判断越界也有一个公差,状态变量的默认公差在这个例子中是1,而100.71和100直接的差的绝对值小于这个公差,因此认为SET 6也为可行解。
ANSYS优化设计的万能三步曲这里我描述一下拿到一个工程问题,怎么用一种通用的模式进行最优化分析。我通常不不使用Batch模式的优化方法,因为最好还不免需要打开ANSYS的GUI界面去提取优化数据库,绘出变量关系曲线等。这一节介绍的万能方法是基于GUI的命令流方法。
由于鄙人想象力有限,这里只要引以前写APDL教程时候的一个例子来说明优化设计的一般方法。(上次是用APDL做单循环求解最优角度,这里我们用强大的ANSYS优化模块来完成它)
问题描述:
图5 薄板受压的模型图如图5(a)一所示,一带孔薄板,长4000mm,宽2000mm,顶部中心部分1800mm处承受42MP的压力,左右两个长圆孔中心分别踞四周1000mm,长圆孔的具体形式如图5(b)所示,上下分别为半圆,中部用直线衔接。这里假设长圆长轴与水平方向夹角为α。为了使得孔边缘应力集中最小,这里拟调整α的大小(α∈[0,π/2]),以在固定的H情况下达到长圆孔周围应力集中最小。
2.1 构建优化分析文件这里用参数My_sita和My_H对整个模型进行参数化建模:(My_sita表征角α,My_H表征高度H,两者的初始值分别为0°和100mm,最后提取出孔边缘最大应力值mysmax)
File:circle.inp
PI=3.14159
My_H=150
My_sita=45
sita=My_sita/180*PI
r=0.2
H=My_H/1000
!Customize the Environment
keyw,pr_struc,1
/prep7
et,1,shell63
r,1,0.12,0.12,0.12,0.12
uimp,1,ex,dens,nuxy,2.1e9,1.2,0.375
!Modeling
!Create plate
k,1,0,0
k,2,2,0
k,3,2,2
k,4,0,2
k,5,0.9,2
k,6,1,1
l,1,2
l,2,3
l,3,5
l,5,4
l,4,1
al,1,2,3,4,5
!Create hole
!Create my coordinate
k,7,1+H*cos(sita),1+H*sin(sita)
k,10,1+H*cos(sita),1+H*sin(sita),100
k,8,1+r*cos(sita+PI/2),1+r*sin(sita+PI/2)
cskp,11,0,6,7,8
csys,11
!Create Hole
k,9,H,r
l,7,9
l,7,6
adrag,6,,,,,,7
arotat,6,,,,,,7,10,-90
arsys,y,2,3,1
arsym,x,2,5,1
aadd,2,3,4,5,6,7,8,9
asba,1,10
csys,0
arsym,x,2,,,,0,0
nummer,all,,, ,low
aadd,1,2
/auto,1
gplot
!Meshing the plane
smrt,6
amesh,all
!Add DOF
DK,2,UX,0,,,UY
DK,14,UX,0,,,UY
!Add Pressure
SFL,4,PRES,42
SFL,11,PRES,42
/solu
solve
/post1
ar11=ndinqr(0,14)
_s1=
*dim,_s1,,ar11
*vget,_s1(1),node,1,s,1
*vscfun,mysmax,max,_s1(1)
2.2 构建优化控制文件这第二步工作非常简单,随便拿个优化控制文件来,稍微把设计变量、状态变量、目标函数一修改,就成完成了优化控制文件。
File:optcircle.inp
/opt
opclr
fini
/clear,nostart
/input,circle,inp
/opt
opanl,circle,inp
opvar,My_sita,dv,0,90
opvar,H,dv,100,200
opvar,mysmax,obj
opkeep,on
optype,subp
opsave,optcircle,opt0
opexec
2.3 优化求解
现在万事具备,打开ANSYS的GUI界面,输入/input,optcircle,inp,就开始求解了。计算结束后看一下结果:
图6 优化结果3
由此得到最优解在α=48.422°,H=161.79附近。和我们上次用APDL循环优化得到的结果α=40°差不太多。这样,整个优化过程就完成了,非常容易,而且适用于所有的优化问题。
当然好的优化结果并不是单单遵循上面的三步法就能得到的。其实,上面这不过这只是一个粗略的结果。从图6看到,才采样了5个点,我们上次用APDL循环优化都是每5°采样一个点,比这样的0阶优化还精确的多。没有关系,既然嫌结果不精确,我们可以在0阶优化的基础上再进行一下1阶梯度优化:
在circle.inp文件中把My_H=150一句替换成My_H=161.79
把My_sita=45一句替换成My_sita=48.422
在optcircle.inp文件中optype,subp一句替换为optype,first
给其中定义设计变量、状态变量、目标函数的语句都加上公差1e-2,防止其提前收敛。
得到更加精确的结果如下:
图7 优化结果4
这里得到的最优解是当α=43.385°,H=108.50mm时,最优解mysmax=569.25,比原来的最优解值639.03精确了很多。当然这一次1阶优化结束是因为达到了默认的循环次数10,如果你再加以一些处理,或者把默认循环次数加大,可能会得到更优的参数。
ANSYS优化工具理解看完前面这些部分,也许你对ANSYS的优化过程理解的游刃有余了。你已经学会通过手动改变三大变量的公差,或者参数的初始值来获得更优解。不过想不想更加提高自己的?手动在全自动控制中总是一个很大的累赘,也许你会想先自动探测一下解空间,然后通过判断选择一下初始参数集,再进行二级甚至更多级的优化;也许你想自己规划优化的过程;也许你想考察各个设计变量之间的耦合关系和它们对目标函数的影响。如果你想更进一步提高自己的ANSYS优化能力,可能需要进一步吃透ANSYS提供给大家使用的形形色色优化工具。
本来想详细写点优化工具使用的例子,但一来ANSYS培训手册里面有详细的例子讲解,二来时间也不允许,整理几个很新颖的工程例子还是颇伤脑筋,这里就每个优化工具点评一下其特点功用,相信大家也不难掌握。
单循环工具可用来在命令流中控制实现一次优化过程,得到所要目标值。
主要可以用于自己规划的优化过程,不常用。
随机工具可用来在一些优化方案实施前,获得一定数量的可行解。
很多问题在优化过程中会出现大量不可行解,浪费求解效率,在求解前获得一组可行解能够减少在后续迭代中出现不可行解的几率,提高求解效率,复杂问题中常用。
扫描工具可用来研究某一设计变量的变化对目标函数的影响情况。
多是在一定参照解得条件下(参照解默认取最优解),在保持参照解其他变量不变得情况下,考察某一设计变量对目标函数得影响情况,其结果可以看到该设计变量对目标函数的影响趋势和敏度。(有时候可以根据结果把惰性设计变量去除,减小优化过程规模)
梯度工具可用来研究在优化结果处,哪一个设计变量的扰动对目标函数影响最大。
也是在参照解(多是最优解)处,可以考察哪个设计变量对目标函数的变化影响最大。(有时候可以根据结果适当调整设计变量公差,来提高优化效率)
乘子工具可用来研究在整个设计域内,设计变量或设计变量的耦合对目标函数的影响大小。
该工具主要可以考察设计变量之间的耦合性,寻求最佳耦合点。该工具使用不多,感觉在很小的取样点情况下,使用乘子工具没有很大实际意义。
ANSYS优化心得可能大家已经被上面如此之多的讲解讲的混混欲睡了,再坚持一下,我再谈一下我这半年来研究ANSYS优化的心得:
首先,使用上面总结的工程优化三步法,你应该面对任何工程问题都面无难色。三步法中的主要工作都是第一步参数化建模,这个对用惯了命令流的朋友应该没有难度,不习惯命令流的同志慢慢对照log文件也能搞得差不多。与普通工程问题建模求解相比,优化过程的分析文件中多了一个提取目标函数的工作,这一部分内容其实大都差不多,在ANSYS培训手册中随便拷贝一个提取的例子过来,适当修改一下,个性化命令一把,就轻松变成自己的东西了。
再次,优化结果可信吗?普适的0阶优化随机在解空间中抽取采样点,用这些采样点来拟和曲线求解最优一定有效吗?我的看法是,方法是有效的,结果是不是合理就要看分析人的水平了。如果说0阶优化不容易陷入局部最优点,哪可不一定,很多例子中,随机产生的采样点老是在最优解附件徘徊,这时候你就要学会修正初始值;很多情况下收敛过早结束,结果却不是你想要的,你就要学会查看优化过程,搞清收敛过早的原因,从而对症下药,调整公差、循环数量限制等,得到你所想要的最终结果。有些问题中你会发现某些设计变量有惰性(即对目标函数影响不大),你要学会果断剔除冗余设计变量,减小优化规模(大问题中这样做的效果是十分明显的)。再高级点的就是搞点优化方法的二次开发,构建适合自己问题的特殊优化过程,当然这些难度都十分大。
一句话,软件是死的,人是活的。无论软件的功能多么强大,只有懂的正确思考判断的人才能发挥出其完全的功能。
祝大家都早日成为ANSYS的优化模块大师!
(也许你现在已经是了!)