ANSYS 优化设计
1
ANSYS 优化设计
1. 认识 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),设定优化变量,并求解。
/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
最后,在命令输入框中键入“/input,optvolu,inp”,整个优化过程就开始了。
图 2 ANSYS 优化过程图
ANSYS 优化设计
2
几秒钟的优化过程结束后,让我们来看一下优化的结果:
/opt
optlist,all
图 3 优化结果
上图中左右带*的 SET 22 是最优解,由此可以看出,要想在表面积一定的情况下使水杯
容积最大,的确有这样一个规律 H=D=2*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
分析文件包涵了一个完整的循环,但是整个优化过程中是要求设计变量不断改变的,每次循
环都有一个参数重定义的过程,不会使设计变量恢复初始值吗?这一点勿用担心,正是由于
有了另一个优化控制文件,优化过程只在第一次进行完全的参数定义工作,在后续循环中,
ANSYS 优化设计
3
优化控制文件中声明的设计变量定义将被忽略)。有了这样两个文件,简单的在命令窗口把
优化控制文件输入进去(其中的 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
opexe
! 指定设计变量 R
! 指定设计变量 H
! 指定状态变量 S
! 指定优化目标 V
!
! 指定优化方法——子问题逼近法(零阶法)
假定 batch.inp 在目录 bvolu 下,在 cmd 命令行方式下,进入 bvolu 目录,执行命令:
ansys -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
ANSYS 优化设计
4
其结果与用 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 优化设计
5
上述默认公差的定义都能在 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 命令改变默认循环
的次数等,这些实验将会更加加深你对优化过程、收敛准则的理解,便于提高你都负责优化
问题的驾驭能力。
ANSYS 优化设计
拓扑优化实例
6
/clear
/TITLE, A 2-D, multiple compliance minimization problem subjected to volume constraint
/PREP7
BLC4,0,0,3,1! Create solid model (3 x 1 rectangle)
ET,1,82 ! Use 2-D solids. Type 1 is optimized
ET,2,82 ! Type 2 is not optimized.
MP,EX,1,118E9 ! Linear isotropic, material
MP,NUXY,1,0.3
ESIZE,0.05! Use a relatively fine mesh density
TYPE,1
AMESH,ALL ! Free, rectangular-element meshing
NSEL,S,LOC,X,0,0.4! Select region not to be optimized
ESLN
TYPE,2
EMODIF,ALL ! Define type 2 elements
ALLSEL
NSEL,S,LOC,X,0
D,ALL,ALL,0 ! Fixed at X = 0
NSEL,S,LOC,X,3
D,ALL,ALL,0 ! Fixed at X = 3
FORCE = 1000! Value for applied load
NSEL,S,LOC,X,1
NSEL,R,LOC,Y,1
F,ALL,FY,FORCE! Define first load case
ALLSEL
LSWRITE,1 ! Write first load case
FDEL,ALL
NSEL,S,LOC,X,2
NSEL,R,LOC,Y,0
F,ALL,FY,-FORCE ! Define second load case
ALLSEL
LSWRITE,2 ! Write second load case
FDEL,ALL
TOCOMP,MCOMP,MULTIPLE,2 ! Define multiple compliance function
! "MCOMP" for topological optimization
TOVAR,MCOMP,OBJ! Define "MCOMP" as topological objective
TOVAR,VOLUME,CON,,50 ! Define "VOLUME" as topological constraint; 50 percent
volume reduction
TOTYPE,OC! Specify solution approach
TODEF! Initialize topological opt.
/SHOW,topo,grph! Put graphics in a file (remove if interactive)
/DSCALE,,OFF
ANSYS 优化设计
7
/CONTOUR,,2
TOLOOP,12,1! Perform no more than 12 iterations
FINISH
TOGRAPH,OBJ! Graph final objective (compliance) history
TOGRAPH,CON! Graph final constraint (volume) history
TOPRINT,OBJ! Print final objective (compliance) history
TOPRINT,CON! Print final constraint (volume) history
*GET,TITER,TOPO,,ITER! Get iteration counter
*GET,OCMP,TOPO,TITER-1,TOHO ! Get final compliance value
8
第七章 APDL 综合实例
7.1 问题说明
本章在阐明 APDL 技术时本想也采取实例的方式,把 APDL 的各个细节都用一个个详细的
实例说清楚,无奈 APDL 细节内容比较繁复,而且不和 UIDL 那样各成体系,APDL 的应用很
多情况下都是和 UIDL、UPF 结合在一起应用的,它甚至渗透到基础分析中的各个环节中,可
以说也是 ANSYS 的脚本基础。考虑到大家都不会有兴趣来聆听枯燥的数组构建法,宏函数的
参元特性等罗嗦的 APDL 语法,这里我们打算用一个比较大的综合实例来想大家描述一部分
APDL 的功能,从这里你将能看到我们能用 APDL 干些什么。还记得 UIDL 实例解析二中的一
个例子吧,这里我们有必要重温一下:
α
(a)
图 1
r
H
(b)
如图 1(a)所示,一带孔薄板,长 4000mm,宽 2000mm,顶部中心部分 1800mm 处承受
42MP 的压力,左右两个长圆孔中心分别距四周 1000mm,长圆孔的具体形式如图 1(b)所示,
上下分别为半圆,中部用直线衔接。这里假设长圆长轴与水平方向夹角为α。
为了使得孔边缘应力集中最小,这里拟调整α的大小(α∈[-π/2,π/2]),以便在
固定的 H 情况下达到长圆孔周围应力集中最小。
在 UIDL 实例二的部分我们只是在 GUI 界面下实现了它的参数化建模,这部分工作在
本章的综合实例中仍然有效,下面我们将一步步完全实现这一问题。
7.2 解题思想
本问题是在用户给定 H 的情况下求得α角的最优解,使得孔边最大拉应力最小(这是
因为材料抗拉性能比较弱)。这里我们的想法是:把α取每一个角度时候得到的孔边最大拉
应力都求出,比较它们,得到孔边拉应力最小情况下对应的α取值。现在的问题是,我们只
能够对每一离散的α值求取其孔边最大拉应力,让α在[0°~360°]之间连续取值不仅是无
法做到的,而且在工程中也没有必要,这里我们拟每隔一定角度计算一下孔边最大拉应力,
最终在这些有限的角度中求取出最佳的α值。因此我们还需要用户自定义求解的精度参数,
即我们每隔多少角度来计算一次(决定了结果精确到什么程度)。比方说我们定义每隔 5°
计算一次的话,整个优化过程需要进行 180/5=36 次求解运算。
7.3 构建步骤
下面说明一下在构建过程中的一些全局参数:
My_H:用户输入的 H 参数值
My_sita: 每次计算对应的α参数值
My_dsita:每两次计算之间间隔的角度值(用户输入的参数)
My_N:总共需要分析计算的次数。My_N=180/My_dsita
My_sita0:初始α值,这里统一定义为 0°