优化设计
什么是优化设计?
优化设计是一种寻找确定最优设计方案的技术。所谓“最优设计”,指的是一种方案可以满足所有的设计要求,而且所需的支出(如重量,面积,体积,应力,费用等)最小。也就是说,最优设计方案就是一个最有效率的方案。
设计方案的任何方面都是可以优化的,比如说:尺寸(如厚度),形状(如过渡圆角的大小),支撑位置,制造费用,自然频率,材料特性等。实际上,所有可以参数化的ANSYS选项都可以作优化设计。(关于ANSYS参数,请参看ANSYS Modeling and Meshing Guide 第十四章。)
ANSYS程序提供了两种优化的方法,这两种方法可以处理绝大多数的优化问题。零阶方法是一个很完善的处理方法,可以很有效地处理大多数的工程问题。一阶方法基于目标函数对设计变量的敏感程度,因此更加适合于精确的优化分析。
对于这两种方法,ANSYS程序提供了一系列的分析——评估——修正的循环过程。就是对于初始设计进行分析,对分析结果就设计要求进行评估,然后修正设计。这一循环过程重复进行直到所有的设计要求都满足为止。
除了这两种优化方法,ANSYS程序还提供了一系列的优化工具以提高优化过程的效率。例如,随机优化分析的迭代次数是可以指定的。随机计算结果的初始值可以作为优化过程的起点数值。
基本概念在介绍优化设计过程之前,我们先给出一些基本的定义:设计变量,状态变量,目标函数,合理和不合理的设计,分析文件,迭代,循环,设计序列等。我们看以下一个典型的优化设计问题:
在以下的约束条件下找出如下矩形截面梁的最小重量:
总应力(不超过(max [(((max]
梁的变形(不超过( max[(((max]
梁的高度h不超过h max[h(hmax]
图1-1 梁的优化设计示例
设计变量(DVs)为自变量,优化结果的取得就是通过改变设计变量的数值来实现的。每个设计变量都有上下限,它定义了设计变量的变化范围。在以上的问题里,设计变量很显然为梁的宽度b和高度h。b和h都不可能为负值,因此其下限应为b,h>0,而且,h有上限h max。ANSYS优化程序允许定义不超过60个设计变量。
状态变量(SVs)是约束设计的数值。它们是“因变量”,是设计变量的函数。状态变量可能会有上下限,也可能只有单方面的限制,即只有上限或只有下限。在上述梁问题中,有两个状态变量:((总应力)和((梁的位移)。在ANSYS优化程序中用户可以定义不超过100个状态变量。
目标函数是要尽量减小的数值。它必须是设计变量的函数,也就是说,改变设计变量的数值将改变目标函数的数值。在以上的问题中,梁的总重量应该是目标函数。在ANSYS优化程序中,只能设定一个目标函数。
设计变量,状态变量和目标函数总称为优化变量。在ANSYS优化中,这些变量是由用户定义的参数来指定的。用户必须指出在参数集中哪些是设计变量,哪些是状态变量,哪是目标函数。
设计序列是指确定一个特定模型的参数的集合。一般来说,设计序列是由优化变量的数值来确定的,但所有的模型参数(包括不是优化变量的参数)组成了一个设计序列。
一个合理的设计是指满足所有给定的约束条件(设计变量的约束和状态变量的约束)的设计。如果其中任一约束条件不被满足,设计就被认为是不合理的。而最优设计是既满足所有的约束条件又能得到最小目标函数值的设计。(如果所有的设计序列都是不合理的,那么最优设计是最接近于合理的设计,而不考虑目标函数的数值。)
分析文件是一个ANSYS的命令流输入文件,包括一个完整的分析过程(前处理,求解,后处理)。它必须包含一个参数化的模型,用参数定义模型并指出设计变量,状态变量和目标函数。由这个文件可以自动生成优化循环文件(Jobname.LOOP),并在优化计算中循环处理。
一次循环指一个分析周期。(可以理解为执行一次分析文件。)最后一次循环的输出存储在文件Jobname.OPO中。优化迭代(或仅仅是迭代过程)是产生新的设计序列的一次或多次分析循环。一般来说,一次迭代等同于一次循环。但对于一阶方法,一次迭代代表多次循环。
优化数据库记录当前的优化环境,包括优化变量定义,参数,所有优化设定,和设计序列集合。该数据库可以存储(在文件Jobname.OPT),也可以随时读入优化处理器中。
上述的许多概念可以用图解帮助理解。图1-2示出了优化分析中的数据流向。分析文件必须作为一个单独的实体存在,优化数据库不是ANSYS模型数据库的一部分。
优化设计的步骤共有两种方法实现ANSYS优化设计:批处理方法和通过GUI交互式地完成。这两种方法的选择取决于用户对于ANSYS程序的熟悉程度和是否习惯于图形交互方式。
如果对于ANSYS程序的命令相当熟悉,就可以选择用命令输入整个优化文件并通过批处理方式来进行优化。对于复杂的需用大量机时的分析任务来说(如非线性),这种方法更有效率。
而另一方面,交互方式具有更大的灵活性,而且可以实时看到循环过程的结果。在用GUI方式进行优化时,首要的是要建立模型的分析文件,然后优化处理器所提供的功能都可以交互式的使用,以确定设计空间,便于后续优化处理的进行。这些初期交互式的操作可以帮助用户缩小设计空间的大小,使优化过程得到更高的效率。
优化设计通常包括以下几个步骤,这些步骤根据用户所选用优化方法的不同(批处理GUI方式)而有细微的差别。
图1-2 优化数据流向
生成循环所用的分析文件。该文件必须包括整个分析的过程,而且
必须满足以下条件:
参数化建立模型(PREP7)。
求解(SOLUTION)。
提取并指定状态变量和目标函数(POST1/POST26)。
在ANSYS数据库里建立与分析文件中变量相对应的参数。这一步
是标准的做法,但不是必须的(BEGIN或OPT)。
进入OPT,指定分析文件(OPT)。
声明优化变量。
选择优化工具或优化方法。
指定优化循环控制方式。
进行优化分析。
查看设计序列结果(OPT)和后处理(POST1/POST26)。
优化设计步骤的细节在下面列出。批处理方式和交互方式的区别也同时指出。
第一步:生成分析文件分析文件生成是ANSYS优化设计过程中的关键部分。ANSYS程序运用分析文件构造循环文件,进行循环分析。分析文件中可以包括ANSYS提供的任意分析类型(结构,热,电磁等,线性或非线性)。(注:ANSYS/LS-DYNA的显式分析不能进行优化。)
在分析文件中,模型的建立必须是参数化的(通常是优化变量为参数),结果也必须用参数来提取(用于状态变量和目标函数)。优化设计中只能使用数值参数。(参数和ANSYS参数化设计语言(APDL)在ANSYS Modeling and Meshing Guide中有所细述。)
用户的任务是建立分析文件并保证其正确性。分析文件应当覆盖整个分析过程并且是简练的,不是必须的语句(如完成图形显示功能和列表功能的语句等)应当从分析文件中省略掉。只有在交互过程中希望看到的显示[EPLODT等]可以包含在分析文件中,或者将其定位到一个显示文件中[/SHOW]。请注意分析文件是要多次执行的,与优化分析本身无关的命令都会不必要的耗费机时,降低循环效率。
建立分析文件有两种方法:1)用系统编辑器逐行输入;2)交互式地完成分析,将ANSYS的LOG文件作为基础建立分析文件。这两种方式各有优缺点。
用系统编辑器生成分析文件同生成其他分析时的批处理文件方法是一样的。这种方法使得用户可以通过命令输入来完全地控制参数化定义。同样,本方法可以省去了删除多余命令的麻烦。但是,如果对于ANSYS命令集不熟悉的话,这种方法是不方便的。
对于这类用户来说,第二种方法相对容易一些。但是,在最后生成分析文件的过程中,ANSYS的LOG文件要做较大的修改才能适合循环分析。
不论采用哪种方法,分析文件需要包括的内容都是一样的。以下说明建立分析文件的步骤:
参数化建立模型
用设计变量作为参数建立模型的工作是在PREP7中完成的。在给出的梁的例子中,设计变量是B(梁的宽度)和H(梁的高度),因此单元的实参是由B和H来表示的:
…
/PREP7
!初始化设计变量:
B=2.0
H=3.0
!
ET,1,BEAM3 !2-D梁单元
AREA=B*H !梁的横截面面积
IZZ=(B*(H**3))/12 !绕Z轴的转动惯量
R,1,AREA,IZZ,H !以设计变量表示的单元实参
!
!模型的其他部分
MP,EX,1,30E6 !杨氏模量
N,1 !结点
N,11,120
FILL
E,1,2 !单元
EGEN,10,1,-1
FINISH !退出PREP7
…
前面提到,可以对设计的任何方面进行优化:尺寸,形状,材料性质,支撑位置,所加载荷等,唯一要求就是将其参数化。
设计变量(例如B和V)可以在程序的任何部分初始化,一般是在PREP7中定义。这些变量的初值只是在设计计算的开始用得到,在优化循环过程中会被改变。
注意:如果用GUI模式完成输入,可能会遇到直接用鼠标拾取(picking)的操作。有些拾取操作是不允许参数化输入的。因此,应当避免在定义设计变量,状态变量和目标函数时使用这些操作,应该用可以参数化的操作来代替。
求解求解器用于定义分析类型和分析选项,施加载荷,指定载荷步,完成有限元计算。分析中所用到的数据都要指出:凝聚法分析中的主自由度,非线性分析中的收敛准则,谐波分析中的频率范围等。载荷和边界条件也可以作为设计变量。
梁的例子中,SOLUTION部分的输入大致如下:
…
/SOLU
ANTYPE,STATIC !静力分析(缺省)
D,1,UX,0,,11,10,UY !UX=UY=0,梁两端结点固定
SFBEAM,ALL,1,PRES,100 !施加压力
SOLVE
FINISH !退出SOLUTION
这一步骤不仅仅限于一次分析过程。比如,可以先进行热分析再进行应力分析(在热应力计算中)。
参数化提取结果在本步中,提取结果并赋值给相应的参数。这些参数一般为状态变量和目标函数。提取数据的操作用*GET命令(Utility Menu>Parameters>Get Scalar Data)实现。通常用POST1来完成本步操作,特别是涉及到数据的存储,加减或其他操作。
在梁的例题中,梁的总重量是目标函数。因为重量与体积成比例(假定密度是均匀的),那么减小总体积就相当于减小总重量。因此可以选择总体积为目标函数。在本例中,状态变量选择为总应力和位移。这些参数可以用如下方法定义:
…
/POST1
SET,…
NSORT,U,Y !以UY为基准对结点排序
*GET,DMAX,SORT,,MAX !参数DMAX=最大位移
!
!线单元的推导数值由ETABLE得出
ETABLE,VOLU,VOLU !VOLU=每个单元的体积
ETABLE,SMAX_I,NMISC,1 !SMAX_I=每个单元I结点处应力的
最大值
ETABLE,SMAX_J,NMISC,3 !SMAX_J=每个单元J结点处应力的最
大值
!
SSUM !将单元表中每列的数据相加
*GET,VOLUME,SSUM,,ITEM,VOLU
!参数VOLUME=总体积
ESORT,ETAB,SMAX_I,,1 !按照单元SMAX_I的绝对值大小排序
*GET,SMAXI,SORT,,MAX !参数SMAXI=SMAX_I的最大值
ESORT,ETAB,SMAX_J,,1 !按照单元SMAX_J的绝对值大小排序
*GET,SMAXJ,SORT,,MAX !参数SMAXJ=SMAX_J的最大值
SMAX=SMAXI>SMAXJ !参数SMAX=最大应力值
FINISH
…
请查阅*GET和ETABLE命令以得到更详细的说明。
分析文件的准备到此为止,我们已经对于分析文件的基本需求做了说明。如果是用系统编辑器来编辑的批处理文件,那么简单地存盘进入第二步即可。如果是用交互方式建模的话,用户必须在交互环境下生成分析文件。可以通过两种方式完成本步操作:数据库命令流文件或程序命令流文件。
数据库命令流文件——可以通过LGWRITE命令(Utility Menu>File>Write DB Log File)生成命令流文件。LGWRITE将数据库内部的命令流写到文件Jobname.LGW中。内部命令流包含了生成当前模型所用的所有命令。
程序命令流文件——Jobname.LOG包含了交互方式下用户输入的所有命令。如果用Jobneme.LOG作为分析文件时,用户必须用系统编辑器删除文件中所有不必要的命令。因为交互方式下所有的操作都记录在LOG文件中,编辑工作会比较烦琐。而且,如果分析是在几个过程中完成的,就必须将几个LOG文合在一起编辑生成一个完整的分析文件。(关于数据库命令流文件和程序命令流文件,请参看ANSYS Operations Guide。)
注——用户可以退出ANSYS或使用/SYS命令来编辑分析文件。细节请参看本章“生成分析文件”一节。
第二步:建立优化过程中的参数在完成了分析文件的建立以后,就可以开始优化分析了。(如果是在系统中建立的分析文件的话,就要重新进入ANSYS。)如果在交互方式下进行优化的话,最好(但不是必须)从分析文件中建立参数到ANSYS数据库中来。(在批处理方式下除外。)
做这一步有两个好处。初始参数值可能作为一阶方法的起点,而且,对于各种优化过程来说,参数在数据库中可以在GUI下进行操作,便于定义优化变量。建立数据库参数可以选择下列任一种方法:
读入与分析文件相联的数据库文件(Jobname.DB)。这样可以在ANSYS中建立整个模型的数据库。读入数据库文件可以用如下方法:
Command,RESUME
GUI,Utility Menu>File>Resume Jobname.db
Utility Menu>File>Resume from
将分析文件直接读入ANSYS进行整个分析。这样将重新建立整个数据库,但对于大模型来说要耗费大量的机时。要读入分析文件,可以选择下列方法之一:
Command,/INPUT
GUI,Utility Menu>File>Read Input from
仅从存储的参数文件中读参数到ANSYS中,参数文件是用PARSAV命令或由Utility Menu>Parameters>Save Parameters 存储的。读入参数可以用下列方法之一:
Command,PARRES
GUI,Utility Menu>Parameters>Restore Parameters
重新定义分析文件中存在的参数。不过,这样做需要知道分析文件中定义了那些参数。用以下任一方式:
Command,*SET or,=” command
GUI,Utility Menu>Parameters>Scalar Parameters
可以选择使用以上任意一种方式,然后用OPVAR命令(菜单路径Main Menu>Design Opt>Design Variables)来指定优化变量。(参看第四步)
注——在优化过程中,ANSYS数据库不一定要同分析文件一致。模型的输入是在优化循环过程中由分析文件中自动读入的。
第三步:进入OPT,指定分析文件(OPT)
以下的步骤是由OPT处理器来完成的。首次进入优化处理器时,ANSYS数据库中的所有参数自动作为设计序列1。这些参数值假定是一个设计序列。进入优化处理器可以用如下方式:
Command,/OPT
GUI,Main Menu>Design Opt
在交互方式下,用户必须指定分析文件名。这个文件用于生成优化循环文件Jobname.LOOP。分析文件名无缺省值,因此必须输入。指定分析文件名,可以用下列方式之一:
Command,OPANL
GUI,Main Menu>Design Opt>Assign
在批处理方式下,分析文件通常是批命令流的第一部分,从文件的第一行到命令/OPT第一次出现。在批处理方式中,缺省的分析文件名是Jobname.BAT(它是一个临时性的文件,是批处理输入文件的一个拷贝)。因此,在批处理方式下通常不用指定分析文件名。但是,如果出于某种考虑将批文件分成两个部分(一个用于分析,另一个用于整个优化分析),那么就必须在进入优化处理器后指定分析文件[OPANL]。
注——在分析文件中,/PREP7和/OPT命令必须出现在行的第一个非零字符处(即,不允许有诸如$等符号出现在有这些命令的行中)。这一点在生成优化循环文件时很关键。
第四步:声明优化变量下一步是声明优化变量,即指定哪些参数是设计变量,哪些参数是状态变量,哪个参数是目标函数。以上提到,允许有不超过60个设计变量和不超过100个状态变量,但只能有一个目标函数。声明优化变量可以用如下的方法:
Command,OPVAR
GUI,Main Menu>Design Opt>Design Variables
Main Menu>Design Opt>State Variables
Main Menu>Design Opt>Objective
对于设计变量和状态变量可以定义最大和最小值。目标函数不需要给定范围。每一个变量都有一个公差值,这个公差值可以由用户输入,也可以选择由程序计算得出。
如果用OPVAR命令定义的参数名不存在,ANSYS数据库中将自动定义这个参数,并将初始值设为零。
用户可以在任意时间简单地通过重新定义参数的方法来改变已经定义过的参数,也可以删除一个优化变量[OPVAR,Name,DEL]。这种删除操作并不真正删除这个参数,而是不将它继续作为优化变量而已。(参看“执行后修正优化变量”部分。)
第五步:选择优化工具或优化方法
ANSYS程序提供了一些优化工具和方法。缺省方法是单次循环。指定后续优化的工具和方法用下列命令:
Command,OPTYPE
GUI,Main Menu>Design Opt>Method/Tool
优化方法是使单个函数(目标函数)在控制条件下达到最小值的传统化的方法。有两种方法是可用的:零阶方法和一阶方法。除此之外,用户可以提供外部的优化算法替代ANSYS本身的优化方法。使用其中任何一种方法之前,必须先定义目标函数。
零阶方法(直接法):这是一个完善的零阶方法,使用所有因变量(状态变量和目标函数)的逼近。该方法是通用的方法,可以有效的处理绝大多数的工程问题。
一阶方法(间接法):本方法使用偏导数,即,使用因变量的一阶偏导数。此方法精度很高,尤其是在因变量变化很大,设计空间也相对较大时。但是,消耗的机时较多。
用户提供的优化方法:外部的优化程序(USEROP)可以代替ANSYS优化过程。
优化工具是搜索和处理设计空间的技术。因为求最小值不一定是优化的最终目标,所以目标函数在使用这些优化工具时可以不指出。但是,必须要指定设计变量。下面是可用的优化工具:
单步运行:实现一次循环并求出一个FEA解。可以通过一系列的单次循环,每次求解前设定不同的设计变量来研究目标函数与设计变量的变化关系。
随机搜索法:进行多次循环,每次循环设计变量随机变化。用户可以指定最大循环次数和期望合理解的数目。本工具主要用来研究整个设计空间,并为以后的优化分析提供合理解。
等步长搜索法:以一个参考设计序列为起点,本工具生成几个设计序列。它按照单一步长在每次计算后将设计变量在变化范围内加以改变。对于目标函数和状态变量的整体变化评估可以用本工具实现。
乘子计算法:是一个统计工具,用来生成由各种设计变量极限值组合的设计序列。这种技术与称之为经验设计的技术相关,后者是用二阶的整体和部分因子分析。主要目标是计算目标函数和状态变量的关系和相互影响。
最优梯度法:对用户指定的参考设计序列,本工具计算目标函数和状态变量对设计变量的梯度。使用本工具可以确定局部的设计敏感性。
用户提供的优化工具:可以用外部过程(USEROP)替代ANSYS优化工具。
用户可以通过USEROP过程将自己的方法和工具补充进去。更详细的解释在ANSYS Programmer’s Manual中。
第六步:指定优化循环控制方式每种优化方法和工具都有相应的循环控制参数,比如最大迭代次数等。所有这些控制参数的设定都在同一个路径下:
GUI:Main Menu>Design Opt>Method/Tool
以下列出设定控制参数的命令:
设定零阶方法的控制参数:
Command,OPSUBP
和
Command,OPEQN
设定一阶方法的控制参数:
Command,OPFRST
设定随机搜索法的控制参数:
Command,OPRAND
设定等步长搜索法的控制参数:
Command,OPSWEEP
设定乘子计算法的控制参数:
Command,OPFACT
设定最优梯度法的控制参数:
Command,OPGRAD
设定用户优化工具的控制参数:
Command,OPUSER
程序还提供了几个总体控制来设定优化过程中数据的存储方法:
指定优化数据的存储文件名(缺省为Jobname.OPT):
Command,OPDATA
GUI,Main Menu>Design Opt>Controls
用下列方法激活详细的结果输出:
Command,OPPRNT
GUI,Main Menu>Design Opt>Controls
确定最佳设计系列的数据是否存储,用下列方法(缺省是数据库和结果文件存储最后一个设计系列):
Command,OPKEEP
GUI,Main Menu>Design Opt>Controls
用户还可以控制几个循环特性,包括分析文件在循环中如何读取。可以从第一行读取(缺省),也可以从第一个/PREP7出现的位置开始读取;设定为优化变量的参数可以忽略(缺省),也可以在循环中处理。而且,用户可以指定循环中存储哪种变量:只存储数值变量还是存储数值变量和数组变量。这个功能可以在循环中控制参数的数值(包括设计变量和非设计变量)。用下列方法设定这些循环控制特性:
Command,OPLOOP
GUI,Main Menu>Design Opt>Controls
注——OPLOOP命令中的Parms变量控制在循环中存储哪个参数。在循环中存储数值变量和数组变量的选项在一般情况下不设置,除非是数组变量在分析文件外定义,而在循环中需要保存的情况。
第七步:进行优化分析所有的控制选项设定好以后,就可以进行分析了。用下列方法开始分析:
Command,OPEXE
GUI,Main Menu>Design Opt>Run
在OPEXE执行时,优化循环文件(Jobname.LOOP)会根据分析文件生成。这个循环文件对用户是透明的,并在分析循环中使用。循环在满足下列情况时终止:收敛;中断(不收敛,但最大循环次数或是最大不合理解的数目达到了);分析完成。
如果循环是由于模型的问题(如网格划分有问题,非线性求解不收敛,与设计变量数值冲突等)中断时,优化处理器将进行下一次循环。如果是在交互方式下,程序将显示一个警告信息并询问是继续还是结束循环。如果是在批处理方式下,循环将自动继续。NCNV命令(Main Menu>Solution>Nonlinear>Criteria to Stop)是控制非线性分析的,在优化循环中将被忽略。中断循环的设计序列是存盘的,但参数的数据有可能非常大,不符合实际情况。
所有优化变量和其他参数在每次迭代后将存储在优化数据文件(Jobname.OPT)中。最多可以存储130组这样的序列。如果已经达到了130个序列,那么其中数据最“不好”的序列将被删除。
对于上述梁的例子,优化部分的输入大致如下:
/OPT !进入优化处理器
OPANL,… !分析文件名(批处理方式不需要)
!
! 声明优化变量
OPVAR,B,DV,.5,16.5 !B和H为设计变量
OPVAR,H,DV,.5,8
OPVAR,DMAX,SV,-0.1,0 !DMAX和SMAX为状态变量
OPVAR,SMAX,SV,0,20000
OPVAR,VOLUME,OBJ !VOLUME为目标函数
!
!指定优化类型和控制
OPTYPE,SUBP !零阶方法
OPSUBP,30 !最大迭代次数
OPEXE !开始优化循环不同的优化过程可以系列地完成。比如,可以在零阶方法的分析结束后再做等步长搜索。下面的命令对最佳设计序列做等步长搜索:
OPTYPE,SWEEP !扫描评估工具
OPSWEEP,BEST,5 !最佳设计序列每个设计变量5次评估
OPEXE !开始优化循环请查阅/OPT,OPANL,OPTYPE,OPSUBP,OPSWEEP和OPEXE命令以得到更详细的说明。
第八步:查看设计序列结果优化循环结束以后,可以用本部分介绍的命令或相应的GUI路径来查看设计序列。这些命令适用于任意优化方法和工具生成的结果。
列出指定序列号的参数值:
Command,OPLIST
GUI,Main Menu>Design Opt>List
可以选择列出所有参数的数值,也可以只列出优化变量。
用图显示指定的参数随序列号的变化,可以看出变量是如何随迭代过程变化的。用以下方法实现:
Command,PLVAROPT
GUI,Main Menu>Design Opt>Graphs/Tables
将图的X轴由序列号换成别的参数:
Command,XVAROPT
GUI,Main Menu>Design Opt>Graphs/Tables
对于PLVAROPT和PRVAROPT操作,设计序列将自动按照XVAROPT中参数以升序排列。
对于等步长,乘子和梯度工具有一些特别的查看结果的方法。对于等步长搜索,用OPRSW命令列出结果,用OPLSW命令图示结果。对于乘子工具,用OPRFA命令列出结果,用OPLFA命令图示结果。对于梯度工具,用OPRGR命令列出结果,用OPLGR命令图示结果。(相应的路径在后面对命令的详细叙述中提及。)
另一个得到优化数据的方法是用STATUS命令(Main Menu>Design Opt>Status)。在优化处理器中使用本命令,将得到另外一些关于当前优化任务的信息,如分析文件名,优化技术,设计序列数,优化变量等。用STATUS命令可以方便的查看优化环境,验证需要的设定是否全部输入优化处理器。
除了查看优化数据,用户可能希望用POST1或POST26对分析结果进行后处理。缺省情况下,最后一个设计序列的结果存储在文件 Jobname.RST(或.RTH等,视分析类型而定)中。如果在循环运行前将OPKEEP设为ON,最佳设计序列的数据也将存储在数据库和结果文件中。“最佳结果”在文件Jobname.BRST(.BRTH等)中,“最佳数据库”在文件Jobname.BDB中。
操作设计序列查看数据以后,可能需要对其做一些操作。比如说,在随机搜索后,用户可能希望将所有的不合理设计序列删除,以合理的设计序列为数据点来进行后面的优化。这里提供了几种改变设计序列的方法。
下面两个命令可以删除不需要的序列:
用下列命令选择最佳设计序列或所有合理的序列:
Command,OPSEL
GUI,Main Menu>Design Opt>Select/Delete
(所有没有用OPSEL命令选择的设计序列将永久地从优化数据库中删除。)
删除指定范围内的设计序列:
Command,OPDEL
GUI,Main Menu>Design Opt>Select/Delete
对于这两个命令,剩余设计序列的原始序列号将不变。(优化数据库可以存储130个设计序列。)
下列命令也可以对设计序列进行操作:
将两个现存的序列相加形成一个新的设计序列(可以有比例系数):
Command,OPADD
GUI,Main Menu>Design Opt>Combine
用当前的数值参数值(没有在分析循环中运行)生成一个新的设计序列:
Command,OPMAKE
GUI,Main Menu>Design Opt>Create
多层优化计算在很多情况下要做多于一次优化计算的分析。比如,在一次优化后没有找到需要的优化结果,或是用一种优化工具开始计算然后做随后的优化分析(例如,先进行随机搜索,然后用零阶方法)。从第一次较少次数的循环中得到的结果可以作为修改设计空间并进行以后优化分析的依据。
如果用户在同一次ANSYS运行中执行所有的优化时,这个过程是很顺利的。在一次执行以后,简单的重新定义所有的优化输入,然后开始下一步分析。用下列命令开始下一步分析:
Command,OPEXE
GUI,Main Menu>Design Opt>Run
如果在执行完一次优化以后退出了ANSYS,可以用以后叙述的方法开始后续的分析。
重新开始执行优化分析要重新开始优化分析,通过如下命令读入优化数据库文件(Jobname.OPT):
Command,OPRESU
GUI,Main Menu>Design Opt>Resume
数据读入后,指定优化类型,控制等,然后开始循环。(对应于数据库的分析文件必须可用以完成优化。)用下列方法开始循环:
Command,OPEXE
GUI,Main Menu>Design Opt>Run
标准的重启动大致如下:
...
...
/OPT
OPRESU,....,!读入文件(缺省为Jobname.OPT)
OPSEL,10 !选择10个最佳设计
OPTYPE,...,!指定优化工具或方法
...,!指定其他优化输入
OPEXE !开始优化循环请查阅/OPT,OPRESU,OPSEL,OPTYPE和OPEXE命令以得到更详细的说明。
注——除了优化数据,ANSYS工作文件名将存储在优化数据库文件中(Jobname.OPT)。
因此,如果优化数据文件被读入,该文件名将覆盖当前的文件名[/FILNAME]。
在交互方式下可以用OPRESU命令(Main Menu>Design Opt>Resume)读入批处理方式下生成的优化数据,这样便于交互的查看批处理优化的数据。
如果在读入数据前优化数据库中有数据的话,应当首先清除优化数据库。在这个过程中,所有的设置将恢复其缺省值,所有的设计序列将被删除。用下列方式清除数据库:
Command,OPCLR
GUI,Main Menu>Design Opt>Clear&Reset
因为ANSYS数据库是不受OPCLR命令影响的,所以在读入一个新的优化数据库前应该清除ANSYS数据库。用下列方法清除ANSYS数据库:
Command,/CLEAR
GUI,Utility Menu>File>Clear&Start New
与OPRESU命令相对应的是OPSAVE命令(Main Menu>Design Opt>Save),其功能是将优化数据写入指定的文件中(缺省为Jobname.OPT)。优化数据在每次优化循环结束的时候自动存储(见OPDATA命令),但用户也可以随时用OPSAVE命令存储优化数据。
优化技术理解计算机程序的算法总是很有用的,尤其是在优化设计中。在这一部分中,将提供对下列方法的说明:零阶方法,一阶方法,随机搜索法,等步长搜索法,乘子计算法和最优梯度法。(更多的细节参见ANSYS Theory Reference 第20章。)
零阶方法零阶方法之所以称为零阶方法是由于它只用到因变量而不用到它的偏导数。在零阶方法中有两个重要的概念:目标函数和状态变量的逼近方法,由约束的优化问题转换为非约束的优化问题。
逼近方法:
本方法中,程序用曲线拟合来建立目标函数和设计变量之间的关系。这是通过用几个设计变量序列计算目标函数然后求得各数据点间最小平方实现的。该结果曲线(或平面)叫做逼近。每次优化循环生成一个新的数据点,目标函数就完成一次更新。实际上是逼近被求解最小值而并非目标函数。
状态变量也是同样处理的。每个状态变量都生成一个逼近并在每次循环后更新。
用户可以控制优化近似的逼近曲线。可以指定线性拟合,平方拟合或平方差拟合。缺省情况下,用平方差拟合目标函数,用平方拟合状态变量。用下列方法实现该控制功能:
Command,OPEQN
GUI,Main Menu>Design Opt>Method/Tool
OPEQN同样可以控制设计数据点在形成逼近时如何加权;见ANSYS Theory Reference。
转换为非约束问题状态变量和设计变量的数值范围约束了设计,优化问题就成为约束的优化问题。ANSYS程序将其转化为非约束问题,因为后者的最小化方法比前者更有效率。转换是通过对目标函数逼近加罚函数的方法计入所加约束的。
搜索非约束目标函数的逼近是在每次迭代中用Sequential Unconstrained Minimization Technique(SUMT) 实现的。
收敛检查在每次循环结束时都要进行收敛检查。当当前的,前面的或最佳设计是合理的而且满足下列条件之一时,问题就是收敛的:
目标函数值由最佳合理设计到当前设计的变化应小于目标函数允差。
最后两个设计之间的差值应小于目标函数允差。
从当前设计到最佳合理设计所有设计变量的变化值应小于各自的允差。
最后两个设计所有设计变量的变化值应小于各自的允差。
用下列方法指定目标函数和设计变量允差:
Command,OPVAR
GUI,Main Menu>Design Opt>Design Variables
Main Menu>Design Opt>Objective
收敛并不代表实际的最小值已经得到了,只说明以上四个准则之一满足了。因此,用户必须确定当前设计优化的结果是否足够。如果不足的话,就要另外做附加的优化分析。
有时候求解过程会在收敛前终止,这是因为发生下列情况之一:
指定的循环次数达到了。
连续的不合理设计达到了指定的值(OPSUBP命令的NINFS域)。缺省值为7。
零阶方法的特殊问题由于目标函数和状态变量都是使用逼近的,因此优化设计和逼近数值具有同样的精确度。下面给出了一些得到较好的逼近的建议。
对于零阶方法,优化处理器开始通过随机搜索建立状态变量和目标函数的逼近。由于是随机搜索,收敛的速度可能很慢。用户有时可以通过给出多个合理的起始设计来加速收敛。只简单的运行一系列的随机搜索并删除所有不合理的设计。用下列方法之一运行随机搜索:
Command,OPTYPE,RAND
GUI,Main Menu>Design Opt>method/Tool
用下列方法删除所有不合理设计:
Command,OPSEL
GUI,Main Menu>Design Opt>Select/Delete
也可以运行多次单独的循环,并在每次运行前指定新的设计变量序列来生成起始设计序列。用下列方法:
Command,OPTYPE,RUN
GUI,Main Menu>Design Opt>Method/Tool
(如果对问题的特性有些认识的话,后一种方法更好些。)
注——做一些小的设计分析将有利于收敛。但如果设计之间差别不大,也就是说设计数据点“堆积”在一起时,用户就要指定优化处理器沿一个指定的路径分析,以避免丢掉好的设计。
如果零阶方法生成了许多不合理的设计的话,可能说明状态变量的近似不能良好的反映状态变量的实际情况。在这种情况下,可以处理如下:
(增加连续不合理设计的允许值,然后进行附加的零阶方法分析(如果合
理的设计好象要达到了)。用下列方法:
Command,OPSUBP,NINFS
GUI,Main Menu>Design Opt>Method/Tool
(在连续的逼近中不断的选择最佳设计,可以得到更好的曲线拟合。用
下列方法实现:
Command,OPSEL
GUI,Main Menu>Design Opt>Select/Delete
(在状态变量逼近时选择交叉项。用下列方法:
Command,OPEQN,KFSV
GUI,Main Menu>Design Opt>Method/Tool
一阶方法同零阶方法一样,一阶方法通过对目标函数添加罚函数将问题转换为非约束的。但是,与零阶方法不同的是,一阶方法将真实的有限元结果最小化,而不是对逼近数值进行操作。
一阶方法使用因变量对设计变量的偏导数。在每次迭代中,梯度计算(用最大斜度法或共轭方向法)确定搜索方向,并用线搜索法对非约束问题进行最小化。
因此,每次迭代都有一系列的子迭代(其中包括搜索方向和梯度计算)组成。这就使得一次优化迭代有多次分析循环。
OPFRST命令(Main Menu>Design Opt>Method/Tool)有两个输入域可以用来改善一阶方法的收敛。用户可以指定计算梯度的设计变量范围变化程度,也可以指定线搜索步长的范围。一般来说,这两个输入值的缺省数值就足够了。见ANSYS Theory Reference。
收敛检查一阶方法在收敛或中断时结束。当当前的设计序列相对于前面的和最佳序列满足下面任意一种情况时,问题就称为收敛:
目标函数值由最佳合理设计到当前设计的变化应小于目标函数允差。
从当前设计到前面设计目标函数的变化值应小于允差。
同时要求最后的迭代使用最大斜度搜索,否则要进行附加的迭代。
用下列方法指定目标函数允差:
Command,OPVAR
GUI,Main Menu>Design Opt>Objective
问题在收敛之前可能中断。在用OPFRST命令NITR域指定的最大迭代次数达到的情况下出现。
一阶方法的特殊情况与零阶方法相比,一阶方法计算量大且结果精确。但是,精确度高并不能保证最佳求解。下面是一些注意点:
一阶方法可能在不合理的设计序列上收敛。这时可能是找到了一个局部最小值,或是不存在合理设计空间。如果出现这种情况,可以使用零阶方法,因其可以更好的研究整个设计空间。也可以先运行随机搜索确定合理设计空间(如果存在的话),然后以合理设计序列为起点重新运行一阶方法。
一阶方法更容易获得局部最小值。(见后面“局部和全局最小值”的说明。)这是因为一阶方法从设计空间的一个序列开始计算求解,如果起点很接近局部最小值的话,就会选择该最小值而找不到全局最小值。如果怀疑得到的是局部最小值,可以用零阶方法或随机搜索验证,如上所述。
目标函数允差过紧将会引起迭代次数很多。因为本方法计算实际有限元解(而非逼近),在计算过程中会根据给定的允差尽量找到确切的结果。
随机搜索法对于随机搜索法[OPTYPE,RAND],程序完成指定次数的分析循环,并在每次循环中使用随机搜索变量值。用户可以用OPRAND命令(Main Menu>Design Opt>Method/Tool)指定最大迭代次数和最大合理设计数。如果给出了最大合理设计数,在达到这个数值时循环将终止,而忽略最大迭代次数是否达到。
随机搜索法往往作为零阶方法的先期处理。它也可以用来完成一些小的设计任务。例如可以做一系列的随机搜索,然后通过查看结果来判断当前设计空间是否合理。
等步长搜索法等步长搜索法[OPTYPE,SWEEP]用于在设计空间内完成扫描分析。将生成n*NSPS个设计序列,n是设计变量的个数,NSPS是每个扫描中评估点的数目(由OPSWEEP命令指定)。对于每个设计变量,变量范围将划分为NSPS-1个相等的步长,进行NSPS次循环。问题的设计变量在每次循环中以步长递增,其他的设计变量保持其参考值不变。设计序列中设计变量的参考值用OPSWEEP命令的Dset指定(Main Menu>Design Opt>Method/Tool)。
图示和列表显示等步长搜索结果用下列方法图示设计变量数值和响应变量的数值关系:
Command,OPLSW
GUI,Main Menu>Design Opt>Tool Results>Sweeps
纵坐标表示目标函数或状态变量的实际数值。横坐标表示正交化(0到1)的设计变量,正交范围为设计变量的最大最小值[OPVAR]。
用下列方法生成列表的结果:
Command,OPRSW
GUI,Main Menu>Design Opt>Tool Results>Print
正交化的响应数据值和正交化的设计变量值将列出。目标函数和状态变量的结果与参考设计序列数值正交[OPSWEEP,Dset]。对于设计变量,0相应于最小值,1相应于最大值。
乘子计算法本工具[OPTYPE,FACT]用二阶技术生成设计空间上极值点上的设计序列数值。(这个二阶技术在每个设计变量的两个极值点上取值。)可以用OPFACT命令(Main Menu>Design Opt>Method/Tool)指定是完成整体的还是部分子的评估。对于整体评估,程序进行2n次循环,n是设计变量的个数。1/2部分的评估进行2n/2次循环,依此类推。
图示和列表显示乘子计算结果可以用棒式图和表格显示目标函数或状态变量的某些方面。例如,可以图示每个设计变量对目标函数的主要作用。用户同样可以查看两个和三个变量之间的互相作用。
用下列命令显示棒式图:
Command,OPLFA
GUI,Main Menu>Design Opt>Tool Results>Factorial
用下列命令对目标函数或状态变量的作用列表:
Command,OPRFA
GUI,Main Menu>Design Opt>Tool Results>Print
要得到更详细的说明,请查阅ANSYS Theory Reference 第20章“Design Optimization”。
最优梯度法最优梯度法[OPTYPE,GRAD]计算设计空间中某一点的梯度。梯度结果用于研究目标函数或状态变量的敏感性。用下列方式指定在哪个设计序列计算梯度:
Command,OPGRAD
GUI,Main Menu>Design Opt>Method/Tool
本工具做的循环次数等于设计变量的数目。
图示和列表显示最优梯度法的结果用户可以用图显示设计变量和响应变量的数值。纵坐标表示目标函数或状态变量的实际数值。横坐标表示设计变量一个小的(1%)变化值。用下列方法列表表示结果:
Command,OPRGR
GUI,Main Menu>Design Opt>Tool Results>Print
1%的变化值是相对于设计变量的变化范围(由OPVAR命令中MAX-MIN数值确定),而不是相对于当前的设计变量数值的。
选择优化变量的一些说明下面列出了许多如何定义设计变量,状态变量和目标函数的建议。
选择设计变量设计变量往往是长度,厚度,直径或模型坐标等几何参数。其必须是正值。关于设计变量要记住的几点如下:
使用尽量少的设计变量。选用太多的设计变量会使得收敛于局部最小值的可能性增加,在问题是高度非线性时甚至会引起不收敛。显而易见,越多的设计变量需要越多的迭代次数,从而需要更多的机时。一种减少设计变量的做法就是将其中的一些变量用其他的设计变量表示。这通常叫做设计变量合并。
设计变量合并不能用于设计变量是真正独立的情况下。但是,可以根据模型的结构判断是否允许某些设计变量之间可以逻辑的合并。例如,如果优化形式是对称的,可以用一个设计变量表示对称部分。
给设计变量定义一个合理的范围(OPVAR命令中的MIN和MAX)。范围过大可能不能表示好的设计空间,而范围过小可能排除了好的设计。记住只有正的数值是可以的,因此要设定一个上限。
选择可以提供实际优化设计的设计变量。例如,可以只用一个设计变量X1对图1-3a的悬臂梁进行重量优化。但是,这排除了用曲线或变截面得到更小的重量的可能。为了包括这种设计,需要选择四个设计变量X1到X4(图1-3c)。也可以用另外一种设计变量选择方法完成该优化设计,见图1-3d。同时,要避免选择产生不实际结果或不需要的设计。
图1-3 阶梯型悬臂梁的设计变量选择
选择状态变量状态变量通常是控制设计的因变量数值。状态变量的例子有应力,温度,热流率,频率,变形,吸收能,消耗时间等。状态变量必须是ANSYS可以计算的数值;实际上任何参数都能被定义为状态变量。选择状态变量的一些要点为:
在定义状态变量[OPVAR命令]时,在MIN域中输入空值表示无下限。同样,在MAX域中输入空值表示无上限。在这两个域中输入0值表示以0为限。如:
UPVAR,SIG,SV,,1000 !SIG小于等于1000
OPVAR,SIG,SV,0,1000 !SIG大于等于0且小于等于1000
选择足够约束设计的状态变量数。如在应力分析中,只选择最大应力数值为状态变量不好,因为在不同循环中,最大应力位置是变化的。同样也要避免另一个极端如选择每个单元中的应力都为状态变量。比较好的方法是定义几个关键位置的应力为状态变量。
在零阶方法中,如果可能的话,选择与设计变量为线性或平方关系的参数为状态变量。例如,状态变量G=Z1/Z2且G<C(Z1和Z2是设计变量,C是常数)可能不会得到G的较好的逼近,因为G与Z2是反比关系。如果将状态变量表示为G=Z1-(C*Z2)且G<0,状态变量逼近就准确了。
如果状态变量有上下限时,给定一个合理的限制值[OPVAR命令的MIN和MAX域]。应避免过小的范围,因为此时合理设计可能不存在。如500到1000psi的应力范围要比900到1000psi的范围好。
如果要指定相同的约束数值(如频率为386.4HZ),定义两个相同数值的状态变量将实际值包含起来,如下所示:
...
*GET,FREQ,ACTIVE,,SET,FREQ !参数FREQ等于计算频率
FREQ1=FREQ
FREQ2=FREQ
...
/OPT
OPVAR,FREQ1,SV,,387 !上限FREQ1=387
OPVAR,FREQ2,SV,386 !下限FREQ2=386
...
合理区域现为386到387,但每个状态变量有足够宽的范围以加速逼近(见OPVAR命令)。
在定义参数前用选择功能避免在奇异点处(如集中载荷)附近选择状态变量。
选择目标函数目标函数是设计要最小化或最大化的数值。选择目标函数要记住以下几点:
ANSYS程序总是最小化目标函数。如果要最大化数值x,就将问题转化为求数值x1=C-x或x1=1/x的最小值,其中C是远大于x的数值。定义C-x的方法比用1/ x的方法要好,因为后者是反比关系,在零阶方法中不能得到准确的逼近。
目标函数值在优化过程中应为正值,因为负值将会引起数据问题。为了避免负值出现,可以将一个足够大的正值加到目标函数上(大于目标函数的最大值)。
总体建议本部分说明了在优化设计中要记住的一些关键点。最重要的一点是要记住优化过程是一系列的分析过程,即一系列的前处理-求解-后处理-优化的循环。建议从一个简单的例子开始理解整个优化的过程。一旦理解了这个过程,求解实际问题时就会觉得很方便。
生成分析文件前面在“准备分析文件”一部分中提到,通过交互方式建模后有两种方式生成分析文件:用内部数据库命令流[LGWRITE](Utility Menu>File>Write DB Log File),或通过过程命令流文件(Jobname.LOG)。用内部数据库命令流有几个优点:
LGWRITE命令有一个选项(Kedit域)删除不重要的命令,或将其作为评论行写到文件中。该选项会自动对命令流文件做自动处理,但用户仍应做一下查看以确保文件适合优化。而且,内部数据库命令流包括整个模型的数据库,因此不需要几个文件拼凑起来。数据库命令流是存储在数据库文件中(Jobname.DB)的,读入的数据库将包含其完整的数据库命令流。(见ANSYS Operations Guide。)
注意:推荐在LGWRITE命令Kedit域中使用Kedit=COMMENT而不用Kedit=REMOVE。有些被Kedit过滤的命令有可能在后面*GET操作中用到(如EXREM和PLNSOL)。这些命令在Jobname.LGW的最后编辑中不能作为备注行。
注——/CLEAR命令将数据库从内存中清除,同时也清除了数据库命令流。在每次优化循环的开始将运行一个/CLEAR命令。如果/LGWRITE命令是在优化循环以后输入的,那么结果文件将是不完整的命令流。一般,数据库命令流文件是在优化循环开始前写的。
前面说过,在定义优化变量时不能用鼠标拾取的操作。如果因为拾取较方便而使用了这种操作,那么特殊的GUI生成命令(如FLST和FITEM)将写入命令流中。这些命令在ANSYS Commands Reference中有叙述。但是在最后处理命令流文件时将这些命令转化为参数形式将非常烦琐。
执行后修改设计变量序列在执行了一次或多次优化分析后[OPEXE],用户可能要删除一些设计变量[OPVAR,Name,DEL]然后进行下面的分析。通常,用户需要这些参数的数值保持不变(在最后优化过程的数值或用户指定的数值),而不要恢复回分析文件中的数值。假定在循环文件中没有重定义设计变量值,可以用下列方法修正“删除”了的设计变量数值:
在分析文件中,在/PREP7命令前初始化设计变量数值。(只有后来要修改的参数才出现在/PREP7命令前。
在下一个优化前,输入OPLOOP,PREP(Main Menu>Design Opt>Controls)从第一个/PREP7处读入分析文件。
如果不做上面两步操作,在以后的优化分析中设计变量将设为其初始值。
在下面的例子中,我们从两个设计变量,AREA1和AREA2开始进行优化。然后AREA2被“删除”(不再是设计变量),保持其当前值。
AREA1=5.00 !AREA1是第一个面积
AREA2=5.00 !AREA2是第二个面积
/PREP7 !进入PREP7前处理器
!用AREA1和AREA2建立参数化模型
...
...
FINISH
/SOLVE
!施加载荷等并求解
...
FINISH
/POST1
SET,...
...
*GET,SIG1,..,!定义用做状态变量和目标函数的参数
*GET,SIG2,...
*GET,SIG3,...
...
FINISH
/OPT !进入优化分析模块
OPVAR,AREA1,DV,..,!定义参数AREA1和AREA2为设计变量
OPVAR,AREA2,DV,...
OPVAR,SIG1,SV,..,!指定状态变量
OPVAR,SIG2,SV,...
OPVAR,TVOL,OBJ !指定目标函数
OPTYPE,SUBP !零阶方法
OPEXE !执行优化
OPVAR,AREA2,DEL !删除设计变量AREA2
STATUS !验证当前优化变量
OPLOOP,PREP !从第一个/PREP7位置读入分析文件
OPTYPE,..,!指定优化类型
..,!指定其他优化控制
OPEXE !执行优化
FINISH
请参阅OPVAR,OPTYPE,OPEXE和OPLOOP命令以得到更详细的解释。
执行后修正优化变量优化变量可以在优化执行之间修改,此时使用[OPVAR]命令(Main Menu>Design Opt>Design Variables)。例如,用户可能想修改目标函数的允差,状态变量的上下限,或删除一个设计变量,定义一个新的设计变量。不论是哪种情况,只要优化变量在一次优化分析后修改了,程序将自动对优化数据库进行部分的修改。这将不影响现存的设计序列和优化设定选项。只有与优化计算有关的信息将被清除。这样做是为了清除不适合于修改后的优化变量序列的数据。
局部最小值和全局最小值有些情况下,求解过程将终止于得到一个局部最小值而非全局最小值(见图1-4)。要验证这种情况是否存在,可以用一个不同的初始设计序列(即不同的初始设计变量值)重新进行分析。另外的方法见“零阶方法的特殊情况”一章。
最小重量和最小体积如果当前分析不需要时,应避免指定材料密度。因为不计算质量矩阵,可以节省机时。因为重量=密度*体积,所以可以通过这种方式参数化地计算重量,而把体积作为最小化的目标(假定模型密度是均匀的)。
网格密度在形状优化问题中,循环之间有限元网格是变化的,因此验证网格精度是否足够很重要。通过用参数方式指定网格划分数或网格大小,可以在每次循环中正确的改变之。
而且,在线性应力或热分析中,可以用能量法则列出每次循环的误差率(见ANSYS Basic Analysis Procedures Guide 第五章)。一个更加有趣的扩展方式是在设计优化循环中进行一次自适应网格循环来保证网格划分误差不超过一个定值。自适应网格划分的内容见ANSYS Advanced Analysis Techniques Guide 第二章。用下列方法列出误差率:
Command,PRERR
GUI,Main Menu>General Postproc>List Results>Percent Error
Utility Menu>List>Results>Percent Error
使用子结构如果模型只有一部分在优化设计中改变的话,可以考虑把不变的部分作成子结构。优化运行将只在使用部分(和扩展部分,如果必须的话)进行循环,从而大大节省机时。(子结构见ANSYS Advanced Analysis Techniques Guide。)
优化分析的示例(GUI方法)
在本例中,用一阶方法进行优化分析。
问题描述一个有三根杆组成的珩架承受纵向和横向载荷。珩架的重量在最大应力不超过400psi最小化。(因此重量为目标函数。)三根梁的横截面面积和基本尺寸B在指定范围内变化。
结构的重量初始设计为109.10磅。缺省允差(由程序计算)为初始重量的1%(11磅)。但是,为了便于收敛,一阶方法的优化分析中将目标函数的允差定为2.0。
问题参数分析中使用如下材料特性:
E=2.1E6psi
RHO=2.85E-4lb/in3 (比重)
最大许用应力=400psi
分析中使用如下几何特性:
横截面面积变化范围=1到1000in2 (初始值为1000)
基本尺寸B变化范围=400到1000in (初始值为1000)
问题简图
第一步:指定文件名选择Utility Menu>File>Change Jobname,打开文件名对话框。
输入“truss”为工作文件名。
单击OK关闭对话框。
第二步:指定分析题目选择Utility Menu>File>Change Title,打开更改分析题目对话框。
输入“Optimization of a Three-Bar Truss”作为分析题目。
单击OK关闭对话框。
第三步:定义参数初始值选择Utility Menu>Parameters>Scalar Parameters,打开数值参数对话框。在选择区域中输入下列内容:
B=1000 按ENTER键
A1=1000 按ENTER键
A2=1000 按ENTER键
A3=1000 单击OK。
参数将在菜单中显示出来。
在数值参数对话框中单击OK。
第四步:定义单元类型选择Main Menu>Preprocessor>Element Type>Add/Edit/Delete,打开单元类型对话框。
在单元类型库对话框中单击Add。
在左边列中单击Structural Link。
在右边列中单击2D Spar 1。
在单元参考号区域键入1。
在单元类型库对话框中单击OK。
在单元类型对话框中单击Close。
第五步:定义实参选择Main Menu>Preprocessor>Real Constants,打开实参对话框。
单击Add,打开实参对话框中单元类型。
单击OK,打开LINK1实参对话框。
在实参序列号区域中键入1。
在横截面区域中键入A1。
单击Apply。这将确认LINK1的实参并将1000输入实参1的横截面区域。
在实参序列号区域键入2。
在横截面面积区域键入A2。
单击Apply。这将确认LINK1的实参并将1000输入实参1的横截面区域。
10.在实参序列号区域键入3。
11.在横截面面积区域键入A3。
12.在LINK1实参对话框中单击OK。
13.在实参对话框中单击 Close。
第六步:定义材料特性选择Main Menu>Preprocessor>Material Props>-Constant->Isotropic,打开各项同性材料特性对话框。
在材料号区域中输入1。
单击OK打开第二个各项同性材料特性对话框。
在杨氏模量对话框输入2.1E6。
单击OK并关闭对话框。
第七步:生成结点选择Main Menu>Preprocessor>-Modeling->Create>Nodes>In Active CS,打开在活动坐标系中生成结点对话框。
在结点号区域中输入1。
在活动坐标域,第一个域中输入-B,第二个域中输入0,第三个输入0。
单击Apply。结点1将出现在ANSYS图形窗口。
在结点号码域中输入2。
在活动坐标域,第一个域中输入0,第二个域中输入0,第三个输入0。
单击Apply。结点2将出现在ANSYS图形窗口。
在结点号码域中输入3。
在活动坐标域,第一个域中输入B,第二个域中输入0,第三个输入0。
10.单击Apply。结点2将出现在ANSYS图形窗口。
11.在结点号码域中输入3。
12.在活动坐标域,第一个域中输入0,第二个域中输入-1000,第三个输入0。
13.单击OK关闭在活动坐标系生成结点对话框。结点4将出现在ANSYS图形窗口中。所有4个结点都出现在ANSYS图形窗口中。
14.打开结点号码。选择菜单Utility Menu>PlotCtrls>Window Controls>Window Options打开窗口选项对话框。
15.在结点号码框上单击OFF(将切换为ON)。
16.单击OK关闭对话框。
17.选择菜单Utility Menu>PlotCtrls>Window Controls>Windows Options打开窗口对话框。
18.在坐标位置出选取不显示选项。
19.单击OK关闭对话框。
第八步:生成单元选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>-Auto Numbered->Thru Nodes打开结点对话框的单元项。
在图形窗口,拾取结点1和4(按照该顺序)。在选择的结点周围将出现一个小框。
在该对话框单击OK关闭对话框。ANSYS图形窗口中1和4结点之间将出现一个线单元1。
选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>
Elem Attributes打开单元特性对话框。
在实参序列号中输入2。
在单元特性对话框中单击OK。
选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>-Auto Numbered->Thru Nodes打开结点对话框的单元项。
在图形窗口,拾取结点2和4(按照该顺序)。
在该对话框单击OK关闭对话框。ANSYS图形窗口中3和4结点之间将出现一个线单元2。
10.选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>Elem Attributes打开单元特性对话框。
11.在实参序列号中输入2。
12.在单元特性对话框中单击OK。
13.选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>-Auto Numbered->Thru Nodes打开结点对话框的单元项。
14.在图形窗口,拾取结点2和4(按照该顺序)。
15.在该对话框单击OK关闭对话框。ANSYS图形窗口中3和4结点之间将出现一个线单元3。
第九步:施加位移约束和载荷选择菜单Main Menu>Solution>-Loads->Apply>-Structural->Displacement>On Nodes 打开Apply U,ROT on Nodes的对话框。
在ANSYS图形窗口,拾取结点1,2和3。
单击OK关闭对话框并打开第二个Apply U,ROT on Nodes的对话框。
在要约束的自由度菜单上单击ALL DOF选项。
单击OK关闭对话框。
选择菜单Main Menu>Solution>-Loads-Apply>-Structural-Force/Moment>On Nodes打开Apply F/M on Nodes对话框。
在ANSYS图形窗口,拾取结点4。
在对话框中单击OK关闭并打开第二个Apply F/M on Nodes对话框。
将Force/Mom方向设为FX。
10.在Force/Moment Value域输入200000。
11.单击OK关闭对话框。在结点4上将出现一个横向箭头表示施加的载荷。
12.选择菜单Main Menu>Solution>-Loads-Apply>-Strutural-Force/Moment>On Nodes打开Apply F/M on Nodes对话框。
13.在ANSYS图形窗口,单击结点4。
14.在对话框中单击OK关闭并打开第二个Apply F/M on Nodes对话框。
15.将Force/Mom方向设为FX。
16.在Force/Moment Value域输入-200000。
17.单击OK关闭对话框。在结点4上将出现一个垂直箭头表示施加的载荷。
第十步:求解模型选择菜单Main Menu>Solution>-Solve->Current LS打开Solve Current Load Step对话框。求解目标和载荷步选项在出现在状态窗口。
查看状态窗口中的目标信息并在菜单条上单击Close关闭。
在该对话框中单击OK。
求解完毕后,将出现信息框告诉用户求解完毕。单击Close关闭对话框。
第十一步,进入后处理器并读出单元总体积选择菜单Main Menu>General Postproc>Element Table>Define Table 打开Element Table Data 对话框。
单击Add定义单元表格并打开Define Additional Elementary Table Items 对话框。
在User Label域中输入EVOL。
在Item,Comp Results Data Item菜单的左列单击Geometry,在右列单击Elem Volume VOLU。
单击OK关闭对话框。
在Element Table Data对话框中单击Close。
选择菜单Main Menu>General Postproc>Element Table>Sum of Each Item打开Tabular Sum of Each Element Table Item对话框。
单击OK计算总和。SSUM命令窗口将显示总和为0.382842E+07。
单击菜单条上的Close关闭SSUM命令窗口。
10.选择菜单Utility Menu>Parameters>Get Scalar Data打开Get Scalar Data对话框。
11.在Type of Data to be Retrieved 菜单左列单击Results Data,在右列单击Elem Table Sums。
12.单击OK关闭对话框并打开Get Element Table Sum Results 对话框。
13.在Name of Parameter to be Defined域输入VTOT。
14.单击OK关闭对话框。
15.选择菜单Utility Menu>Parameters>Scalar Parameters 打开Scalar Parameters对话框。
16.在Selection域输入RHO=2.85E-4并按ENTER键。本信息应显示在菜单上。
17.在Selection域输入WT=RHO*VTOT并按ENTER键。总的体积将计算并显示在菜单中。重量应为1091.10173。
18.单击Close关闭对话框。
第十二步:读出轴向应力选择菜单Main Menu>General Postproc>Element Table>Define Table打开Element Table Data对话框。
单击Add打开Define Additional Element Table Items对话框。
在User Lable for Item域键入SIG。
在Item,Comp Results Data Item菜单左列单击By Sequence Num,在右列单击LS。
在Selection域,在“LS”后键入1(表示序列号为1)。
单击OK关闭对话框。
在Element Table Data对话框中单击Close。
选择菜单Utility Menu>Parameters>Get Scalar Data打开Get Scalar Data对话框。
在the Type of Data to be Retrieved菜单,在左列单击Results Data,在右列单击Elem Table Data。
10.单击OK关闭对话框并打开Get Element Table Data对话框。
11.在Name of Parameter to be Defined 域输入SIG1。
12.在Element Number N域输入1。
13.将Elem Table Data to be Retrieved 域设为SIG。
14.单击Apply关闭对话框并打开Get Scalar Data 对话框。
15.在Type of Data to be Retrieved菜单,在左列单击Results Data,在右列单击Elem Table Data。
16.单击OK打开Get Element Table Data 对话框。
17.在Name of Parameter to be Defined 域输入SIG2。
18.在Element Number N域输入2。
19.将Elem Table Data to be Retrieved 域设为SIG。
20.单击Apply关闭对话框并打开Get Scalar Data 对话框。
21.在Type of Data to be Retrieved菜单,在左列单击Results Data,在右列单击Elem Table Data。
22.单击OK打开Get Element Table Data 对话框。
23.在Name of Parameter to be Defined 域输入SIG3。
24.在Element Number N域输入3。
25.将Elem Table Data to be Retrieved 域设为SIG。
26.单击OK关闭对话框。
27.计算轴向应力的绝对值。选择菜单Utility Menu>Parameters>Scalar Parameters打开Scalar Parameters对话框。在Selection域输入以下信息:
SIG1=ABS(SIG1) 输入ENTER
SIG2=ABS(SIG2) 输入ENTER
SIG3=ABS(SIG3) 单击OK
28.单击Close关闭对话框。
第十三步:显示当前设计选择菜单Utility Menu>PlotCtrls>Style>Size and Shape打开the Size and Shape对话框。
在Display of element shapes based on real constant description表示的行中单击OFF将其切换为ON。
在Real constant Multiplier 域中输入2。
单击OK关闭对话框。
选择菜单Utility Menu>PlotCtrls>Pan,Zoom,Rotate打开Pan,Zoom,Rotate对话框。
单击ISO显示3杆珩架的轴测图。
单击Close关闭对话框。
选择菜单Utility Menu>Plot>Elements画出珩架。
第十四步:生成优化分析文件选择菜单Utility Menu>File>Write DB Log File打开Write Database Log对话框。
在Write Database Log To域中添加“truss.lgw”到路径名中。
单击OK关闭对话框。
第十五步:进入优化处理器并指定分析文件选择菜单Main Menu>Design Opt>-Analysis File->Assign打开Assign Analysis File对话框。
在Selection域添加“truss.lgw”到路径名(或在文件列表中拾取truss.lgw)。
单击OK关闭对话框。
第十六步:定义优化设计变量选择菜单Main Menu>Design Opt>Design Variables打开Design Variables对话框。
单击Add打开Define a Design Variable对话框。
在Parameter Name菜单单击B;B将出现在Selection域。
在Minimum Value域中输入400。
在Maximum Value域中输入2000。
单击Apply确认设计变量。
在Parameter Name菜单单击A1;A1将出现在Selection域。
在Minimum Value域中输入1。
在Maximum Value域中输入1000。
10.单击Apply确认设计变量。
11.在Parameter Name菜单单击A2。
12.在Minimum Value域中输入1。
13.在Maximum Value域中输入1000。
14.单击Apply确认设计变量。
15.在Parameter Name菜单单击A3。
16.在Minimum Value域中输入1。
17.在Maximum Value域中输入1000。
18.单击OK关闭对话框。
19.单击Close关闭Design Variables对话框。
第十七步:定义优化状态变量选择菜单Main Menu>Design Opt>State Variables打开State Variables对话框。
单击Add打开Define a State Variable 对话框。
在Parameters Name域选择SIG1;SIG1将出现在Selection 域。
在Upper Limit 域输入400。
单击Apply确认状态变量。
在Parameters Name域选择SIG2;SIG2将出现在Selection 域。
在Upper Limit 域输入400。
单击Apply确认状态变量。
在Parameters Name域选择SIG3;SIG3将出现在Selection 域。
10.在Upper Limit 域输入400。
11.单击OK关闭对话框。
12.单击Close关闭State Variable对话框。
第十八步:存储优化数据库选择菜单Main Menu>Design Opt>-Opt Database->Save打开Save Optimization Data 对话框。
在Selection域添加“trussvar.opt”到路径名。
单击OK关闭对话框。
第十九步:设置重量为目标函数选择菜单Main Menu>Design Opt>Objective 打开Define Objective Function对话框。
在Parameter Name菜单单击WT;WT将出现在Selection域。
在Convergence Tolerance域输入2。
单击OK关闭对话框。
第二十步:指定一阶优化方法选择菜单Main Menu>Design Opt>Method/Tool打开Specify Optimization Method对话框。
在Select Method/Tool列表中单击First-Order radio按纽。
单击OK打开Controls for First-Order Optimization对话框。
在maximum Iterations域中输入45。
单击OK关闭对话框。
第二十一步:运行优化选择菜单Main Menu>Design Opt>Run打开Begin Execution of Run 对话框。
查看分析信息,单击OK开始优化运算。
求解过程要持续一些时间。在优化循环结束后,最佳设计序列号为16,重量为301.23。
第二十二步:列出最佳设计序列和所有设计序列选择菜单Main Menu>Design Opt>-Design Sets->List打开List Design Set对话框。
在列表选项中拾取BEST序列。
拾取OK打开OPLIST命令窗口。最佳序列为16。
在查看优化参数值后,在菜单条上单击Close。
选择菜单Main Menu>Design Opt>-Design Sets->List打开List Design Sets 对话框。
在列表选项中拾取ALL序列。
单击OK打开OPLIST命令窗口。
查看完所有设计序列后,单击菜单条上的Close。
第二十三步:将重量和基本尺寸作为迭代次数的函数显示选择菜单Utility Menu>PlotCtrls>Pan,Zoom,Rotate 打开Pan-Zoom-Rotate对话框。
单击Front选择X-Y平面视角。
单击Close关闭对话框。
选择Utility Menu>PlotCtrls>Style>Graphs打开Graph Controls对话框。
在X-Axis标记域输入ITERATION NUMBER。
在Y-Axis标记域输入STRUCTURE WEIGHT。
单击OK关闭对话框。
选择菜单Main Menu>Design Opt>Graphs/Tables打开Graph/List Tables of Design Set Parameters对话框。
在Y-Variable Params菜单单击WT。
10.单击OK关闭对话框。在ANSYS图形窗口将显示重量和迭代的图形。
11.选择Utility Menu>PlotCtrls>Style>Graphs打开Graph Controls对话框。
12.在Y-Axis 标记域输入BASE DIMENSION。
13.单击OK关闭对话框。
14.选择菜单Main Menu>Design Opt>Graphs/Tables打开Graph/List Tables of Design Set Parameters 对话框。
15.在Y-Variable Params菜单单击WT不选它,然后单击B。
16.单击OK关闭对话框。在ANSYS图形窗口将显示Base Dimension和Iteration图形。
第二十四步:将最大应力和截面尺寸作为迭代数的函数显示选择菜单Utility Menu>PlotCtrls>Style>Graphs打开Graph Controls对话框。
在Y-Axis 标记域输入MAXIMUM STRESS。
单击OK关闭对话框。
选择菜单Main Menu>Design Opt>Graphs/Tables打开Graph/List Tables of Design Set Parameters对话框。
在Y-Variable Params菜单单击B不选它,然后单击SIG1,SIG2,SIG3。
单击OK关闭对话框。在ANSYS图形窗口将显示应力和迭代数的图形。
选择菜单Utility Menu>PlotCtrls>Style>Graphs打开Graph Controls对话框。
在Y-Axis 标记域输入CROSS-SECTIONAL AREA。
单击OK关闭对话框。
10.选择菜单Main Menu>Design Opt>Graphs/Tables打开Graph/List Tables of Design Set Parameters对话框。
11.在Y-Variable Params菜单单击 SIG1,SIG2,SIG3不选它,然后单击A1,A2,A3。
12.单击OK关闭对话框。在ANSYS图形窗口将显示截面面积和迭代数的图形。
第二十五步:退出ANSYS
在ANSYS工具栏单击Quit。
选择一个选项存盘,然后单击OK。
优化分析示例(命令和批处理方式)
也可以用命令行方式做以上的优化分析。以!开始的行为注释行。
/FILNAM,truss
/TITLE,Optimization of a three-bar truss
!初始化设计变量参数
B=1000 !基本尺寸
A1=1000 !第一个面积
A2=1000 !第二个面积
A3=1000 !第三个面积
!
!进入PREP7并建模
/PREP7
ET,1,LINK1 !二维杆单元
R,1,A1 !以参数形式的实参
R,2,A2
R,3,A3
MP,EX,1,2.1E6 !杨氏模量
N,1,-B,0,0 !定义结点
N,2,0,0,0
N,3,B,0,0
N,4,0,-1000,0
E,1,4 !定义单元
REAL,2
E,2,4
REAL,3
E,3,4
FINISH
!
!进入求解器,定义载荷和求解
/SOLU
D,1,ALL,0,,3 !结点UX=UY=0
F,4,FX,200000 !结点4上的X方向载荷分量
F,4,FY,-200000 !结点4上的Y方向载荷分量
SOLVE
FINISH
!
!进入POST1并读出状态变量数值
/POST1
SET,LAST
ETABLE,EVOL,VOLU !将每个单元的体积放入ETABLE
SSUM !将单元表格内数据求和
*GET,VTOT,SSUM,,ITEM,EVOL !VTOT=总体积
RHO=2.85E-4
WT=RHO*VTOT !计算总体积
ETABLE,SIG,LS,1 !将轴向应力放入ETABLE
!
*GET,SIG,ELEM,1,ETAB,SIG !SIG1=第一个单元的轴向应力
*GET,SIG,ELEM,2,ETAB,SIG !SIG2=第二个单元的轴向应力
*GET,SIG,ELEM,3,ETAB,SIG !SIG3=第三个单元的轴向应力
!
SIG1=ABS(SIG1) !计算轴向应力的绝对值
SIG2=ABS(SIG2)
SIG3=ABS(SIG3)
!
/ESHAPE,2 !以实体单元模式显示壳单元
/VIEW,1,1,1,1 !轴测视图
EPLOT !画单元
!
/OPT !进入优化处理器
OPANL,truss,lgw !指定分析文件(批处理方式中不用这个命令)
!
OPVAR,B,DV,400,2000 !定义设计变量
OPVAR,A1,DV,1,1000
OPVAR,A2,DV,1,1000
OPVAR,A3,DV,1,1000
OPVAR,SIG1,SV,,400 !定义状态变量
OPVAR,SIG2,SV,,400
OPVAR,SIG3,SV,,400
!
OPSAVE,trussvar,opt !存储数据
!
OPVAR,WT,OBJ,,,2,!定义目标函数
!
OPTYPE,FIRST !定义一阶方法
OPFRST,45 !最大45次迭代
OPEXE !开始优化分析
!
OPLIST,16 !列出最佳设计序列,号为16
OPLIST,ALL !列出所有设计序列
!
/VIEW,1,,,1 !前视图
!
/AXLAB,X,ITERATION NUMBER !画重量对迭代数图形
/AXLAB,Y STRUCTURE WEIGHT
PLVAROPT,WT
!
/AXLAB,Y,BASE DIMENSION !画B对迭代数图形
PLVAROPT,B
!
/AXLAB,Y,MAX STRESS !画最大应力对迭代数图形
PLVAROPT,SIG1,SIG2,SIG3
!
/AXLAB,Y,CROSS-SECTIONAL AREA ! 画面积对迭代数图形
PLVAROPT,A1,A2,A3
!
FINISH
/EXIT
《ANSYS Verification Manual》中的例题:
VM155 悬臂梁的形状优化
VM157 框架结构的优化
什么是优化设计?
优化设计是一种寻找确定最优设计方案的技术。所谓“最优设计”,指的是一种方案可以满足所有的设计要求,而且所需的支出(如重量,面积,体积,应力,费用等)最小。也就是说,最优设计方案就是一个最有效率的方案。
设计方案的任何方面都是可以优化的,比如说:尺寸(如厚度),形状(如过渡圆角的大小),支撑位置,制造费用,自然频率,材料特性等。实际上,所有可以参数化的ANSYS选项都可以作优化设计。(关于ANSYS参数,请参看ANSYS Modeling and Meshing Guide 第十四章。)
ANSYS程序提供了两种优化的方法,这两种方法可以处理绝大多数的优化问题。零阶方法是一个很完善的处理方法,可以很有效地处理大多数的工程问题。一阶方法基于目标函数对设计变量的敏感程度,因此更加适合于精确的优化分析。
对于这两种方法,ANSYS程序提供了一系列的分析——评估——修正的循环过程。就是对于初始设计进行分析,对分析结果就设计要求进行评估,然后修正设计。这一循环过程重复进行直到所有的设计要求都满足为止。
除了这两种优化方法,ANSYS程序还提供了一系列的优化工具以提高优化过程的效率。例如,随机优化分析的迭代次数是可以指定的。随机计算结果的初始值可以作为优化过程的起点数值。
基本概念在介绍优化设计过程之前,我们先给出一些基本的定义:设计变量,状态变量,目标函数,合理和不合理的设计,分析文件,迭代,循环,设计序列等。我们看以下一个典型的优化设计问题:
在以下的约束条件下找出如下矩形截面梁的最小重量:
总应力(不超过(max [(((max]
梁的变形(不超过( max[(((max]
梁的高度h不超过h max[h(hmax]
图1-1 梁的优化设计示例
设计变量(DVs)为自变量,优化结果的取得就是通过改变设计变量的数值来实现的。每个设计变量都有上下限,它定义了设计变量的变化范围。在以上的问题里,设计变量很显然为梁的宽度b和高度h。b和h都不可能为负值,因此其下限应为b,h>0,而且,h有上限h max。ANSYS优化程序允许定义不超过60个设计变量。
状态变量(SVs)是约束设计的数值。它们是“因变量”,是设计变量的函数。状态变量可能会有上下限,也可能只有单方面的限制,即只有上限或只有下限。在上述梁问题中,有两个状态变量:((总应力)和((梁的位移)。在ANSYS优化程序中用户可以定义不超过100个状态变量。
目标函数是要尽量减小的数值。它必须是设计变量的函数,也就是说,改变设计变量的数值将改变目标函数的数值。在以上的问题中,梁的总重量应该是目标函数。在ANSYS优化程序中,只能设定一个目标函数。
设计变量,状态变量和目标函数总称为优化变量。在ANSYS优化中,这些变量是由用户定义的参数来指定的。用户必须指出在参数集中哪些是设计变量,哪些是状态变量,哪是目标函数。
设计序列是指确定一个特定模型的参数的集合。一般来说,设计序列是由优化变量的数值来确定的,但所有的模型参数(包括不是优化变量的参数)组成了一个设计序列。
一个合理的设计是指满足所有给定的约束条件(设计变量的约束和状态变量的约束)的设计。如果其中任一约束条件不被满足,设计就被认为是不合理的。而最优设计是既满足所有的约束条件又能得到最小目标函数值的设计。(如果所有的设计序列都是不合理的,那么最优设计是最接近于合理的设计,而不考虑目标函数的数值。)
分析文件是一个ANSYS的命令流输入文件,包括一个完整的分析过程(前处理,求解,后处理)。它必须包含一个参数化的模型,用参数定义模型并指出设计变量,状态变量和目标函数。由这个文件可以自动生成优化循环文件(Jobname.LOOP),并在优化计算中循环处理。
一次循环指一个分析周期。(可以理解为执行一次分析文件。)最后一次循环的输出存储在文件Jobname.OPO中。优化迭代(或仅仅是迭代过程)是产生新的设计序列的一次或多次分析循环。一般来说,一次迭代等同于一次循环。但对于一阶方法,一次迭代代表多次循环。
优化数据库记录当前的优化环境,包括优化变量定义,参数,所有优化设定,和设计序列集合。该数据库可以存储(在文件Jobname.OPT),也可以随时读入优化处理器中。
上述的许多概念可以用图解帮助理解。图1-2示出了优化分析中的数据流向。分析文件必须作为一个单独的实体存在,优化数据库不是ANSYS模型数据库的一部分。
优化设计的步骤共有两种方法实现ANSYS优化设计:批处理方法和通过GUI交互式地完成。这两种方法的选择取决于用户对于ANSYS程序的熟悉程度和是否习惯于图形交互方式。
如果对于ANSYS程序的命令相当熟悉,就可以选择用命令输入整个优化文件并通过批处理方式来进行优化。对于复杂的需用大量机时的分析任务来说(如非线性),这种方法更有效率。
而另一方面,交互方式具有更大的灵活性,而且可以实时看到循环过程的结果。在用GUI方式进行优化时,首要的是要建立模型的分析文件,然后优化处理器所提供的功能都可以交互式的使用,以确定设计空间,便于后续优化处理的进行。这些初期交互式的操作可以帮助用户缩小设计空间的大小,使优化过程得到更高的效率。
优化设计通常包括以下几个步骤,这些步骤根据用户所选用优化方法的不同(批处理GUI方式)而有细微的差别。
图1-2 优化数据流向
生成循环所用的分析文件。该文件必须包括整个分析的过程,而且
必须满足以下条件:
参数化建立模型(PREP7)。
求解(SOLUTION)。
提取并指定状态变量和目标函数(POST1/POST26)。
在ANSYS数据库里建立与分析文件中变量相对应的参数。这一步
是标准的做法,但不是必须的(BEGIN或OPT)。
进入OPT,指定分析文件(OPT)。
声明优化变量。
选择优化工具或优化方法。
指定优化循环控制方式。
进行优化分析。
查看设计序列结果(OPT)和后处理(POST1/POST26)。
优化设计步骤的细节在下面列出。批处理方式和交互方式的区别也同时指出。
第一步:生成分析文件分析文件生成是ANSYS优化设计过程中的关键部分。ANSYS程序运用分析文件构造循环文件,进行循环分析。分析文件中可以包括ANSYS提供的任意分析类型(结构,热,电磁等,线性或非线性)。(注:ANSYS/LS-DYNA的显式分析不能进行优化。)
在分析文件中,模型的建立必须是参数化的(通常是优化变量为参数),结果也必须用参数来提取(用于状态变量和目标函数)。优化设计中只能使用数值参数。(参数和ANSYS参数化设计语言(APDL)在ANSYS Modeling and Meshing Guide中有所细述。)
用户的任务是建立分析文件并保证其正确性。分析文件应当覆盖整个分析过程并且是简练的,不是必须的语句(如完成图形显示功能和列表功能的语句等)应当从分析文件中省略掉。只有在交互过程中希望看到的显示[EPLODT等]可以包含在分析文件中,或者将其定位到一个显示文件中[/SHOW]。请注意分析文件是要多次执行的,与优化分析本身无关的命令都会不必要的耗费机时,降低循环效率。
建立分析文件有两种方法:1)用系统编辑器逐行输入;2)交互式地完成分析,将ANSYS的LOG文件作为基础建立分析文件。这两种方式各有优缺点。
用系统编辑器生成分析文件同生成其他分析时的批处理文件方法是一样的。这种方法使得用户可以通过命令输入来完全地控制参数化定义。同样,本方法可以省去了删除多余命令的麻烦。但是,如果对于ANSYS命令集不熟悉的话,这种方法是不方便的。
对于这类用户来说,第二种方法相对容易一些。但是,在最后生成分析文件的过程中,ANSYS的LOG文件要做较大的修改才能适合循环分析。
不论采用哪种方法,分析文件需要包括的内容都是一样的。以下说明建立分析文件的步骤:
参数化建立模型
用设计变量作为参数建立模型的工作是在PREP7中完成的。在给出的梁的例子中,设计变量是B(梁的宽度)和H(梁的高度),因此单元的实参是由B和H来表示的:
…
/PREP7
!初始化设计变量:
B=2.0
H=3.0
!
ET,1,BEAM3 !2-D梁单元
AREA=B*H !梁的横截面面积
IZZ=(B*(H**3))/12 !绕Z轴的转动惯量
R,1,AREA,IZZ,H !以设计变量表示的单元实参
!
!模型的其他部分
MP,EX,1,30E6 !杨氏模量
N,1 !结点
N,11,120
FILL
E,1,2 !单元
EGEN,10,1,-1
FINISH !退出PREP7
…
前面提到,可以对设计的任何方面进行优化:尺寸,形状,材料性质,支撑位置,所加载荷等,唯一要求就是将其参数化。
设计变量(例如B和V)可以在程序的任何部分初始化,一般是在PREP7中定义。这些变量的初值只是在设计计算的开始用得到,在优化循环过程中会被改变。
注意:如果用GUI模式完成输入,可能会遇到直接用鼠标拾取(picking)的操作。有些拾取操作是不允许参数化输入的。因此,应当避免在定义设计变量,状态变量和目标函数时使用这些操作,应该用可以参数化的操作来代替。
求解求解器用于定义分析类型和分析选项,施加载荷,指定载荷步,完成有限元计算。分析中所用到的数据都要指出:凝聚法分析中的主自由度,非线性分析中的收敛准则,谐波分析中的频率范围等。载荷和边界条件也可以作为设计变量。
梁的例子中,SOLUTION部分的输入大致如下:
…
/SOLU
ANTYPE,STATIC !静力分析(缺省)
D,1,UX,0,,11,10,UY !UX=UY=0,梁两端结点固定
SFBEAM,ALL,1,PRES,100 !施加压力
SOLVE
FINISH !退出SOLUTION
这一步骤不仅仅限于一次分析过程。比如,可以先进行热分析再进行应力分析(在热应力计算中)。
参数化提取结果在本步中,提取结果并赋值给相应的参数。这些参数一般为状态变量和目标函数。提取数据的操作用*GET命令(Utility Menu>Parameters>Get Scalar Data)实现。通常用POST1来完成本步操作,特别是涉及到数据的存储,加减或其他操作。
在梁的例题中,梁的总重量是目标函数。因为重量与体积成比例(假定密度是均匀的),那么减小总体积就相当于减小总重量。因此可以选择总体积为目标函数。在本例中,状态变量选择为总应力和位移。这些参数可以用如下方法定义:
…
/POST1
SET,…
NSORT,U,Y !以UY为基准对结点排序
*GET,DMAX,SORT,,MAX !参数DMAX=最大位移
!
!线单元的推导数值由ETABLE得出
ETABLE,VOLU,VOLU !VOLU=每个单元的体积
ETABLE,SMAX_I,NMISC,1 !SMAX_I=每个单元I结点处应力的
最大值
ETABLE,SMAX_J,NMISC,3 !SMAX_J=每个单元J结点处应力的最
大值
!
SSUM !将单元表中每列的数据相加
*GET,VOLUME,SSUM,,ITEM,VOLU
!参数VOLUME=总体积
ESORT,ETAB,SMAX_I,,1 !按照单元SMAX_I的绝对值大小排序
*GET,SMAXI,SORT,,MAX !参数SMAXI=SMAX_I的最大值
ESORT,ETAB,SMAX_J,,1 !按照单元SMAX_J的绝对值大小排序
*GET,SMAXJ,SORT,,MAX !参数SMAXJ=SMAX_J的最大值
SMAX=SMAXI>SMAXJ !参数SMAX=最大应力值
FINISH
…
请查阅*GET和ETABLE命令以得到更详细的说明。
分析文件的准备到此为止,我们已经对于分析文件的基本需求做了说明。如果是用系统编辑器来编辑的批处理文件,那么简单地存盘进入第二步即可。如果是用交互方式建模的话,用户必须在交互环境下生成分析文件。可以通过两种方式完成本步操作:数据库命令流文件或程序命令流文件。
数据库命令流文件——可以通过LGWRITE命令(Utility Menu>File>Write DB Log File)生成命令流文件。LGWRITE将数据库内部的命令流写到文件Jobname.LGW中。内部命令流包含了生成当前模型所用的所有命令。
程序命令流文件——Jobname.LOG包含了交互方式下用户输入的所有命令。如果用Jobneme.LOG作为分析文件时,用户必须用系统编辑器删除文件中所有不必要的命令。因为交互方式下所有的操作都记录在LOG文件中,编辑工作会比较烦琐。而且,如果分析是在几个过程中完成的,就必须将几个LOG文合在一起编辑生成一个完整的分析文件。(关于数据库命令流文件和程序命令流文件,请参看ANSYS Operations Guide。)
注——用户可以退出ANSYS或使用/SYS命令来编辑分析文件。细节请参看本章“生成分析文件”一节。
第二步:建立优化过程中的参数在完成了分析文件的建立以后,就可以开始优化分析了。(如果是在系统中建立的分析文件的话,就要重新进入ANSYS。)如果在交互方式下进行优化的话,最好(但不是必须)从分析文件中建立参数到ANSYS数据库中来。(在批处理方式下除外。)
做这一步有两个好处。初始参数值可能作为一阶方法的起点,而且,对于各种优化过程来说,参数在数据库中可以在GUI下进行操作,便于定义优化变量。建立数据库参数可以选择下列任一种方法:
读入与分析文件相联的数据库文件(Jobname.DB)。这样可以在ANSYS中建立整个模型的数据库。读入数据库文件可以用如下方法:
Command,RESUME
GUI,Utility Menu>File>Resume Jobname.db
Utility Menu>File>Resume from
将分析文件直接读入ANSYS进行整个分析。这样将重新建立整个数据库,但对于大模型来说要耗费大量的机时。要读入分析文件,可以选择下列方法之一:
Command,/INPUT
GUI,Utility Menu>File>Read Input from
仅从存储的参数文件中读参数到ANSYS中,参数文件是用PARSAV命令或由Utility Menu>Parameters>Save Parameters 存储的。读入参数可以用下列方法之一:
Command,PARRES
GUI,Utility Menu>Parameters>Restore Parameters
重新定义分析文件中存在的参数。不过,这样做需要知道分析文件中定义了那些参数。用以下任一方式:
Command,*SET or,=” command
GUI,Utility Menu>Parameters>Scalar Parameters
可以选择使用以上任意一种方式,然后用OPVAR命令(菜单路径Main Menu>Design Opt>Design Variables)来指定优化变量。(参看第四步)
注——在优化过程中,ANSYS数据库不一定要同分析文件一致。模型的输入是在优化循环过程中由分析文件中自动读入的。
第三步:进入OPT,指定分析文件(OPT)
以下的步骤是由OPT处理器来完成的。首次进入优化处理器时,ANSYS数据库中的所有参数自动作为设计序列1。这些参数值假定是一个设计序列。进入优化处理器可以用如下方式:
Command,/OPT
GUI,Main Menu>Design Opt
在交互方式下,用户必须指定分析文件名。这个文件用于生成优化循环文件Jobname.LOOP。分析文件名无缺省值,因此必须输入。指定分析文件名,可以用下列方式之一:
Command,OPANL
GUI,Main Menu>Design Opt>Assign
在批处理方式下,分析文件通常是批命令流的第一部分,从文件的第一行到命令/OPT第一次出现。在批处理方式中,缺省的分析文件名是Jobname.BAT(它是一个临时性的文件,是批处理输入文件的一个拷贝)。因此,在批处理方式下通常不用指定分析文件名。但是,如果出于某种考虑将批文件分成两个部分(一个用于分析,另一个用于整个优化分析),那么就必须在进入优化处理器后指定分析文件[OPANL]。
注——在分析文件中,/PREP7和/OPT命令必须出现在行的第一个非零字符处(即,不允许有诸如$等符号出现在有这些命令的行中)。这一点在生成优化循环文件时很关键。
第四步:声明优化变量下一步是声明优化变量,即指定哪些参数是设计变量,哪些参数是状态变量,哪个参数是目标函数。以上提到,允许有不超过60个设计变量和不超过100个状态变量,但只能有一个目标函数。声明优化变量可以用如下的方法:
Command,OPVAR
GUI,Main Menu>Design Opt>Design Variables
Main Menu>Design Opt>State Variables
Main Menu>Design Opt>Objective
对于设计变量和状态变量可以定义最大和最小值。目标函数不需要给定范围。每一个变量都有一个公差值,这个公差值可以由用户输入,也可以选择由程序计算得出。
如果用OPVAR命令定义的参数名不存在,ANSYS数据库中将自动定义这个参数,并将初始值设为零。
用户可以在任意时间简单地通过重新定义参数的方法来改变已经定义过的参数,也可以删除一个优化变量[OPVAR,Name,DEL]。这种删除操作并不真正删除这个参数,而是不将它继续作为优化变量而已。(参看“执行后修正优化变量”部分。)
第五步:选择优化工具或优化方法
ANSYS程序提供了一些优化工具和方法。缺省方法是单次循环。指定后续优化的工具和方法用下列命令:
Command,OPTYPE
GUI,Main Menu>Design Opt>Method/Tool
优化方法是使单个函数(目标函数)在控制条件下达到最小值的传统化的方法。有两种方法是可用的:零阶方法和一阶方法。除此之外,用户可以提供外部的优化算法替代ANSYS本身的优化方法。使用其中任何一种方法之前,必须先定义目标函数。
零阶方法(直接法):这是一个完善的零阶方法,使用所有因变量(状态变量和目标函数)的逼近。该方法是通用的方法,可以有效的处理绝大多数的工程问题。
一阶方法(间接法):本方法使用偏导数,即,使用因变量的一阶偏导数。此方法精度很高,尤其是在因变量变化很大,设计空间也相对较大时。但是,消耗的机时较多。
用户提供的优化方法:外部的优化程序(USEROP)可以代替ANSYS优化过程。
优化工具是搜索和处理设计空间的技术。因为求最小值不一定是优化的最终目标,所以目标函数在使用这些优化工具时可以不指出。但是,必须要指定设计变量。下面是可用的优化工具:
单步运行:实现一次循环并求出一个FEA解。可以通过一系列的单次循环,每次求解前设定不同的设计变量来研究目标函数与设计变量的变化关系。
随机搜索法:进行多次循环,每次循环设计变量随机变化。用户可以指定最大循环次数和期望合理解的数目。本工具主要用来研究整个设计空间,并为以后的优化分析提供合理解。
等步长搜索法:以一个参考设计序列为起点,本工具生成几个设计序列。它按照单一步长在每次计算后将设计变量在变化范围内加以改变。对于目标函数和状态变量的整体变化评估可以用本工具实现。
乘子计算法:是一个统计工具,用来生成由各种设计变量极限值组合的设计序列。这种技术与称之为经验设计的技术相关,后者是用二阶的整体和部分因子分析。主要目标是计算目标函数和状态变量的关系和相互影响。
最优梯度法:对用户指定的参考设计序列,本工具计算目标函数和状态变量对设计变量的梯度。使用本工具可以确定局部的设计敏感性。
用户提供的优化工具:可以用外部过程(USEROP)替代ANSYS优化工具。
用户可以通过USEROP过程将自己的方法和工具补充进去。更详细的解释在ANSYS Programmer’s Manual中。
第六步:指定优化循环控制方式每种优化方法和工具都有相应的循环控制参数,比如最大迭代次数等。所有这些控制参数的设定都在同一个路径下:
GUI:Main Menu>Design Opt>Method/Tool
以下列出设定控制参数的命令:
设定零阶方法的控制参数:
Command,OPSUBP
和
Command,OPEQN
设定一阶方法的控制参数:
Command,OPFRST
设定随机搜索法的控制参数:
Command,OPRAND
设定等步长搜索法的控制参数:
Command,OPSWEEP
设定乘子计算法的控制参数:
Command,OPFACT
设定最优梯度法的控制参数:
Command,OPGRAD
设定用户优化工具的控制参数:
Command,OPUSER
程序还提供了几个总体控制来设定优化过程中数据的存储方法:
指定优化数据的存储文件名(缺省为Jobname.OPT):
Command,OPDATA
GUI,Main Menu>Design Opt>Controls
用下列方法激活详细的结果输出:
Command,OPPRNT
GUI,Main Menu>Design Opt>Controls
确定最佳设计系列的数据是否存储,用下列方法(缺省是数据库和结果文件存储最后一个设计系列):
Command,OPKEEP
GUI,Main Menu>Design Opt>Controls
用户还可以控制几个循环特性,包括分析文件在循环中如何读取。可以从第一行读取(缺省),也可以从第一个/PREP7出现的位置开始读取;设定为优化变量的参数可以忽略(缺省),也可以在循环中处理。而且,用户可以指定循环中存储哪种变量:只存储数值变量还是存储数值变量和数组变量。这个功能可以在循环中控制参数的数值(包括设计变量和非设计变量)。用下列方法设定这些循环控制特性:
Command,OPLOOP
GUI,Main Menu>Design Opt>Controls
注——OPLOOP命令中的Parms变量控制在循环中存储哪个参数。在循环中存储数值变量和数组变量的选项在一般情况下不设置,除非是数组变量在分析文件外定义,而在循环中需要保存的情况。
第七步:进行优化分析所有的控制选项设定好以后,就可以进行分析了。用下列方法开始分析:
Command,OPEXE
GUI,Main Menu>Design Opt>Run
在OPEXE执行时,优化循环文件(Jobname.LOOP)会根据分析文件生成。这个循环文件对用户是透明的,并在分析循环中使用。循环在满足下列情况时终止:收敛;中断(不收敛,但最大循环次数或是最大不合理解的数目达到了);分析完成。
如果循环是由于模型的问题(如网格划分有问题,非线性求解不收敛,与设计变量数值冲突等)中断时,优化处理器将进行下一次循环。如果是在交互方式下,程序将显示一个警告信息并询问是继续还是结束循环。如果是在批处理方式下,循环将自动继续。NCNV命令(Main Menu>Solution>Nonlinear>Criteria to Stop)是控制非线性分析的,在优化循环中将被忽略。中断循环的设计序列是存盘的,但参数的数据有可能非常大,不符合实际情况。
所有优化变量和其他参数在每次迭代后将存储在优化数据文件(Jobname.OPT)中。最多可以存储130组这样的序列。如果已经达到了130个序列,那么其中数据最“不好”的序列将被删除。
对于上述梁的例子,优化部分的输入大致如下:
/OPT !进入优化处理器
OPANL,… !分析文件名(批处理方式不需要)
!
! 声明优化变量
OPVAR,B,DV,.5,16.5 !B和H为设计变量
OPVAR,H,DV,.5,8
OPVAR,DMAX,SV,-0.1,0 !DMAX和SMAX为状态变量
OPVAR,SMAX,SV,0,20000
OPVAR,VOLUME,OBJ !VOLUME为目标函数
!
!指定优化类型和控制
OPTYPE,SUBP !零阶方法
OPSUBP,30 !最大迭代次数
OPEXE !开始优化循环不同的优化过程可以系列地完成。比如,可以在零阶方法的分析结束后再做等步长搜索。下面的命令对最佳设计序列做等步长搜索:
OPTYPE,SWEEP !扫描评估工具
OPSWEEP,BEST,5 !最佳设计序列每个设计变量5次评估
OPEXE !开始优化循环请查阅/OPT,OPANL,OPTYPE,OPSUBP,OPSWEEP和OPEXE命令以得到更详细的说明。
第八步:查看设计序列结果优化循环结束以后,可以用本部分介绍的命令或相应的GUI路径来查看设计序列。这些命令适用于任意优化方法和工具生成的结果。
列出指定序列号的参数值:
Command,OPLIST
GUI,Main Menu>Design Opt>List
可以选择列出所有参数的数值,也可以只列出优化变量。
用图显示指定的参数随序列号的变化,可以看出变量是如何随迭代过程变化的。用以下方法实现:
Command,PLVAROPT
GUI,Main Menu>Design Opt>Graphs/Tables
将图的X轴由序列号换成别的参数:
Command,XVAROPT
GUI,Main Menu>Design Opt>Graphs/Tables
对于PLVAROPT和PRVAROPT操作,设计序列将自动按照XVAROPT中参数以升序排列。
对于等步长,乘子和梯度工具有一些特别的查看结果的方法。对于等步长搜索,用OPRSW命令列出结果,用OPLSW命令图示结果。对于乘子工具,用OPRFA命令列出结果,用OPLFA命令图示结果。对于梯度工具,用OPRGR命令列出结果,用OPLGR命令图示结果。(相应的路径在后面对命令的详细叙述中提及。)
另一个得到优化数据的方法是用STATUS命令(Main Menu>Design Opt>Status)。在优化处理器中使用本命令,将得到另外一些关于当前优化任务的信息,如分析文件名,优化技术,设计序列数,优化变量等。用STATUS命令可以方便的查看优化环境,验证需要的设定是否全部输入优化处理器。
除了查看优化数据,用户可能希望用POST1或POST26对分析结果进行后处理。缺省情况下,最后一个设计序列的结果存储在文件 Jobname.RST(或.RTH等,视分析类型而定)中。如果在循环运行前将OPKEEP设为ON,最佳设计序列的数据也将存储在数据库和结果文件中。“最佳结果”在文件Jobname.BRST(.BRTH等)中,“最佳数据库”在文件Jobname.BDB中。
操作设计序列查看数据以后,可能需要对其做一些操作。比如说,在随机搜索后,用户可能希望将所有的不合理设计序列删除,以合理的设计序列为数据点来进行后面的优化。这里提供了几种改变设计序列的方法。
下面两个命令可以删除不需要的序列:
用下列命令选择最佳设计序列或所有合理的序列:
Command,OPSEL
GUI,Main Menu>Design Opt>Select/Delete
(所有没有用OPSEL命令选择的设计序列将永久地从优化数据库中删除。)
删除指定范围内的设计序列:
Command,OPDEL
GUI,Main Menu>Design Opt>Select/Delete
对于这两个命令,剩余设计序列的原始序列号将不变。(优化数据库可以存储130个设计序列。)
下列命令也可以对设计序列进行操作:
将两个现存的序列相加形成一个新的设计序列(可以有比例系数):
Command,OPADD
GUI,Main Menu>Design Opt>Combine
用当前的数值参数值(没有在分析循环中运行)生成一个新的设计序列:
Command,OPMAKE
GUI,Main Menu>Design Opt>Create
多层优化计算在很多情况下要做多于一次优化计算的分析。比如,在一次优化后没有找到需要的优化结果,或是用一种优化工具开始计算然后做随后的优化分析(例如,先进行随机搜索,然后用零阶方法)。从第一次较少次数的循环中得到的结果可以作为修改设计空间并进行以后优化分析的依据。
如果用户在同一次ANSYS运行中执行所有的优化时,这个过程是很顺利的。在一次执行以后,简单的重新定义所有的优化输入,然后开始下一步分析。用下列命令开始下一步分析:
Command,OPEXE
GUI,Main Menu>Design Opt>Run
如果在执行完一次优化以后退出了ANSYS,可以用以后叙述的方法开始后续的分析。
重新开始执行优化分析要重新开始优化分析,通过如下命令读入优化数据库文件(Jobname.OPT):
Command,OPRESU
GUI,Main Menu>Design Opt>Resume
数据读入后,指定优化类型,控制等,然后开始循环。(对应于数据库的分析文件必须可用以完成优化。)用下列方法开始循环:
Command,OPEXE
GUI,Main Menu>Design Opt>Run
标准的重启动大致如下:
...
...
/OPT
OPRESU,....,!读入文件(缺省为Jobname.OPT)
OPSEL,10 !选择10个最佳设计
OPTYPE,...,!指定优化工具或方法
...,!指定其他优化输入
OPEXE !开始优化循环请查阅/OPT,OPRESU,OPSEL,OPTYPE和OPEXE命令以得到更详细的说明。
注——除了优化数据,ANSYS工作文件名将存储在优化数据库文件中(Jobname.OPT)。
因此,如果优化数据文件被读入,该文件名将覆盖当前的文件名[/FILNAME]。
在交互方式下可以用OPRESU命令(Main Menu>Design Opt>Resume)读入批处理方式下生成的优化数据,这样便于交互的查看批处理优化的数据。
如果在读入数据前优化数据库中有数据的话,应当首先清除优化数据库。在这个过程中,所有的设置将恢复其缺省值,所有的设计序列将被删除。用下列方式清除数据库:
Command,OPCLR
GUI,Main Menu>Design Opt>Clear&Reset
因为ANSYS数据库是不受OPCLR命令影响的,所以在读入一个新的优化数据库前应该清除ANSYS数据库。用下列方法清除ANSYS数据库:
Command,/CLEAR
GUI,Utility Menu>File>Clear&Start New
与OPRESU命令相对应的是OPSAVE命令(Main Menu>Design Opt>Save),其功能是将优化数据写入指定的文件中(缺省为Jobname.OPT)。优化数据在每次优化循环结束的时候自动存储(见OPDATA命令),但用户也可以随时用OPSAVE命令存储优化数据。
优化技术理解计算机程序的算法总是很有用的,尤其是在优化设计中。在这一部分中,将提供对下列方法的说明:零阶方法,一阶方法,随机搜索法,等步长搜索法,乘子计算法和最优梯度法。(更多的细节参见ANSYS Theory Reference 第20章。)
零阶方法零阶方法之所以称为零阶方法是由于它只用到因变量而不用到它的偏导数。在零阶方法中有两个重要的概念:目标函数和状态变量的逼近方法,由约束的优化问题转换为非约束的优化问题。
逼近方法:
本方法中,程序用曲线拟合来建立目标函数和设计变量之间的关系。这是通过用几个设计变量序列计算目标函数然后求得各数据点间最小平方实现的。该结果曲线(或平面)叫做逼近。每次优化循环生成一个新的数据点,目标函数就完成一次更新。实际上是逼近被求解最小值而并非目标函数。
状态变量也是同样处理的。每个状态变量都生成一个逼近并在每次循环后更新。
用户可以控制优化近似的逼近曲线。可以指定线性拟合,平方拟合或平方差拟合。缺省情况下,用平方差拟合目标函数,用平方拟合状态变量。用下列方法实现该控制功能:
Command,OPEQN
GUI,Main Menu>Design Opt>Method/Tool
OPEQN同样可以控制设计数据点在形成逼近时如何加权;见ANSYS Theory Reference。
转换为非约束问题状态变量和设计变量的数值范围约束了设计,优化问题就成为约束的优化问题。ANSYS程序将其转化为非约束问题,因为后者的最小化方法比前者更有效率。转换是通过对目标函数逼近加罚函数的方法计入所加约束的。
搜索非约束目标函数的逼近是在每次迭代中用Sequential Unconstrained Minimization Technique(SUMT) 实现的。
收敛检查在每次循环结束时都要进行收敛检查。当当前的,前面的或最佳设计是合理的而且满足下列条件之一时,问题就是收敛的:
目标函数值由最佳合理设计到当前设计的变化应小于目标函数允差。
最后两个设计之间的差值应小于目标函数允差。
从当前设计到最佳合理设计所有设计变量的变化值应小于各自的允差。
最后两个设计所有设计变量的变化值应小于各自的允差。
用下列方法指定目标函数和设计变量允差:
Command,OPVAR
GUI,Main Menu>Design Opt>Design Variables
Main Menu>Design Opt>Objective
收敛并不代表实际的最小值已经得到了,只说明以上四个准则之一满足了。因此,用户必须确定当前设计优化的结果是否足够。如果不足的话,就要另外做附加的优化分析。
有时候求解过程会在收敛前终止,这是因为发生下列情况之一:
指定的循环次数达到了。
连续的不合理设计达到了指定的值(OPSUBP命令的NINFS域)。缺省值为7。
零阶方法的特殊问题由于目标函数和状态变量都是使用逼近的,因此优化设计和逼近数值具有同样的精确度。下面给出了一些得到较好的逼近的建议。
对于零阶方法,优化处理器开始通过随机搜索建立状态变量和目标函数的逼近。由于是随机搜索,收敛的速度可能很慢。用户有时可以通过给出多个合理的起始设计来加速收敛。只简单的运行一系列的随机搜索并删除所有不合理的设计。用下列方法之一运行随机搜索:
Command,OPTYPE,RAND
GUI,Main Menu>Design Opt>method/Tool
用下列方法删除所有不合理设计:
Command,OPSEL
GUI,Main Menu>Design Opt>Select/Delete
也可以运行多次单独的循环,并在每次运行前指定新的设计变量序列来生成起始设计序列。用下列方法:
Command,OPTYPE,RUN
GUI,Main Menu>Design Opt>Method/Tool
(如果对问题的特性有些认识的话,后一种方法更好些。)
注——做一些小的设计分析将有利于收敛。但如果设计之间差别不大,也就是说设计数据点“堆积”在一起时,用户就要指定优化处理器沿一个指定的路径分析,以避免丢掉好的设计。
如果零阶方法生成了许多不合理的设计的话,可能说明状态变量的近似不能良好的反映状态变量的实际情况。在这种情况下,可以处理如下:
(增加连续不合理设计的允许值,然后进行附加的零阶方法分析(如果合
理的设计好象要达到了)。用下列方法:
Command,OPSUBP,NINFS
GUI,Main Menu>Design Opt>Method/Tool
(在连续的逼近中不断的选择最佳设计,可以得到更好的曲线拟合。用
下列方法实现:
Command,OPSEL
GUI,Main Menu>Design Opt>Select/Delete
(在状态变量逼近时选择交叉项。用下列方法:
Command,OPEQN,KFSV
GUI,Main Menu>Design Opt>Method/Tool
一阶方法同零阶方法一样,一阶方法通过对目标函数添加罚函数将问题转换为非约束的。但是,与零阶方法不同的是,一阶方法将真实的有限元结果最小化,而不是对逼近数值进行操作。
一阶方法使用因变量对设计变量的偏导数。在每次迭代中,梯度计算(用最大斜度法或共轭方向法)确定搜索方向,并用线搜索法对非约束问题进行最小化。
因此,每次迭代都有一系列的子迭代(其中包括搜索方向和梯度计算)组成。这就使得一次优化迭代有多次分析循环。
OPFRST命令(Main Menu>Design Opt>Method/Tool)有两个输入域可以用来改善一阶方法的收敛。用户可以指定计算梯度的设计变量范围变化程度,也可以指定线搜索步长的范围。一般来说,这两个输入值的缺省数值就足够了。见ANSYS Theory Reference。
收敛检查一阶方法在收敛或中断时结束。当当前的设计序列相对于前面的和最佳序列满足下面任意一种情况时,问题就称为收敛:
目标函数值由最佳合理设计到当前设计的变化应小于目标函数允差。
从当前设计到前面设计目标函数的变化值应小于允差。
同时要求最后的迭代使用最大斜度搜索,否则要进行附加的迭代。
用下列方法指定目标函数允差:
Command,OPVAR
GUI,Main Menu>Design Opt>Objective
问题在收敛之前可能中断。在用OPFRST命令NITR域指定的最大迭代次数达到的情况下出现。
一阶方法的特殊情况与零阶方法相比,一阶方法计算量大且结果精确。但是,精确度高并不能保证最佳求解。下面是一些注意点:
一阶方法可能在不合理的设计序列上收敛。这时可能是找到了一个局部最小值,或是不存在合理设计空间。如果出现这种情况,可以使用零阶方法,因其可以更好的研究整个设计空间。也可以先运行随机搜索确定合理设计空间(如果存在的话),然后以合理设计序列为起点重新运行一阶方法。
一阶方法更容易获得局部最小值。(见后面“局部和全局最小值”的说明。)这是因为一阶方法从设计空间的一个序列开始计算求解,如果起点很接近局部最小值的话,就会选择该最小值而找不到全局最小值。如果怀疑得到的是局部最小值,可以用零阶方法或随机搜索验证,如上所述。
目标函数允差过紧将会引起迭代次数很多。因为本方法计算实际有限元解(而非逼近),在计算过程中会根据给定的允差尽量找到确切的结果。
随机搜索法对于随机搜索法[OPTYPE,RAND],程序完成指定次数的分析循环,并在每次循环中使用随机搜索变量值。用户可以用OPRAND命令(Main Menu>Design Opt>Method/Tool)指定最大迭代次数和最大合理设计数。如果给出了最大合理设计数,在达到这个数值时循环将终止,而忽略最大迭代次数是否达到。
随机搜索法往往作为零阶方法的先期处理。它也可以用来完成一些小的设计任务。例如可以做一系列的随机搜索,然后通过查看结果来判断当前设计空间是否合理。
等步长搜索法等步长搜索法[OPTYPE,SWEEP]用于在设计空间内完成扫描分析。将生成n*NSPS个设计序列,n是设计变量的个数,NSPS是每个扫描中评估点的数目(由OPSWEEP命令指定)。对于每个设计变量,变量范围将划分为NSPS-1个相等的步长,进行NSPS次循环。问题的设计变量在每次循环中以步长递增,其他的设计变量保持其参考值不变。设计序列中设计变量的参考值用OPSWEEP命令的Dset指定(Main Menu>Design Opt>Method/Tool)。
图示和列表显示等步长搜索结果用下列方法图示设计变量数值和响应变量的数值关系:
Command,OPLSW
GUI,Main Menu>Design Opt>Tool Results>Sweeps
纵坐标表示目标函数或状态变量的实际数值。横坐标表示正交化(0到1)的设计变量,正交范围为设计变量的最大最小值[OPVAR]。
用下列方法生成列表的结果:
Command,OPRSW
GUI,Main Menu>Design Opt>Tool Results>Print
正交化的响应数据值和正交化的设计变量值将列出。目标函数和状态变量的结果与参考设计序列数值正交[OPSWEEP,Dset]。对于设计变量,0相应于最小值,1相应于最大值。
乘子计算法本工具[OPTYPE,FACT]用二阶技术生成设计空间上极值点上的设计序列数值。(这个二阶技术在每个设计变量的两个极值点上取值。)可以用OPFACT命令(Main Menu>Design Opt>Method/Tool)指定是完成整体的还是部分子的评估。对于整体评估,程序进行2n次循环,n是设计变量的个数。1/2部分的评估进行2n/2次循环,依此类推。
图示和列表显示乘子计算结果可以用棒式图和表格显示目标函数或状态变量的某些方面。例如,可以图示每个设计变量对目标函数的主要作用。用户同样可以查看两个和三个变量之间的互相作用。
用下列命令显示棒式图:
Command,OPLFA
GUI,Main Menu>Design Opt>Tool Results>Factorial
用下列命令对目标函数或状态变量的作用列表:
Command,OPRFA
GUI,Main Menu>Design Opt>Tool Results>Print
要得到更详细的说明,请查阅ANSYS Theory Reference 第20章“Design Optimization”。
最优梯度法最优梯度法[OPTYPE,GRAD]计算设计空间中某一点的梯度。梯度结果用于研究目标函数或状态变量的敏感性。用下列方式指定在哪个设计序列计算梯度:
Command,OPGRAD
GUI,Main Menu>Design Opt>Method/Tool
本工具做的循环次数等于设计变量的数目。
图示和列表显示最优梯度法的结果用户可以用图显示设计变量和响应变量的数值。纵坐标表示目标函数或状态变量的实际数值。横坐标表示设计变量一个小的(1%)变化值。用下列方法列表表示结果:
Command,OPRGR
GUI,Main Menu>Design Opt>Tool Results>Print
1%的变化值是相对于设计变量的变化范围(由OPVAR命令中MAX-MIN数值确定),而不是相对于当前的设计变量数值的。
选择优化变量的一些说明下面列出了许多如何定义设计变量,状态变量和目标函数的建议。
选择设计变量设计变量往往是长度,厚度,直径或模型坐标等几何参数。其必须是正值。关于设计变量要记住的几点如下:
使用尽量少的设计变量。选用太多的设计变量会使得收敛于局部最小值的可能性增加,在问题是高度非线性时甚至会引起不收敛。显而易见,越多的设计变量需要越多的迭代次数,从而需要更多的机时。一种减少设计变量的做法就是将其中的一些变量用其他的设计变量表示。这通常叫做设计变量合并。
设计变量合并不能用于设计变量是真正独立的情况下。但是,可以根据模型的结构判断是否允许某些设计变量之间可以逻辑的合并。例如,如果优化形式是对称的,可以用一个设计变量表示对称部分。
给设计变量定义一个合理的范围(OPVAR命令中的MIN和MAX)。范围过大可能不能表示好的设计空间,而范围过小可能排除了好的设计。记住只有正的数值是可以的,因此要设定一个上限。
选择可以提供实际优化设计的设计变量。例如,可以只用一个设计变量X1对图1-3a的悬臂梁进行重量优化。但是,这排除了用曲线或变截面得到更小的重量的可能。为了包括这种设计,需要选择四个设计变量X1到X4(图1-3c)。也可以用另外一种设计变量选择方法完成该优化设计,见图1-3d。同时,要避免选择产生不实际结果或不需要的设计。
图1-3 阶梯型悬臂梁的设计变量选择
选择状态变量状态变量通常是控制设计的因变量数值。状态变量的例子有应力,温度,热流率,频率,变形,吸收能,消耗时间等。状态变量必须是ANSYS可以计算的数值;实际上任何参数都能被定义为状态变量。选择状态变量的一些要点为:
在定义状态变量[OPVAR命令]时,在MIN域中输入空值表示无下限。同样,在MAX域中输入空值表示无上限。在这两个域中输入0值表示以0为限。如:
UPVAR,SIG,SV,,1000 !SIG小于等于1000
OPVAR,SIG,SV,0,1000 !SIG大于等于0且小于等于1000
选择足够约束设计的状态变量数。如在应力分析中,只选择最大应力数值为状态变量不好,因为在不同循环中,最大应力位置是变化的。同样也要避免另一个极端如选择每个单元中的应力都为状态变量。比较好的方法是定义几个关键位置的应力为状态变量。
在零阶方法中,如果可能的话,选择与设计变量为线性或平方关系的参数为状态变量。例如,状态变量G=Z1/Z2且G<C(Z1和Z2是设计变量,C是常数)可能不会得到G的较好的逼近,因为G与Z2是反比关系。如果将状态变量表示为G=Z1-(C*Z2)且G<0,状态变量逼近就准确了。
如果状态变量有上下限时,给定一个合理的限制值[OPVAR命令的MIN和MAX域]。应避免过小的范围,因为此时合理设计可能不存在。如500到1000psi的应力范围要比900到1000psi的范围好。
如果要指定相同的约束数值(如频率为386.4HZ),定义两个相同数值的状态变量将实际值包含起来,如下所示:
...
*GET,FREQ,ACTIVE,,SET,FREQ !参数FREQ等于计算频率
FREQ1=FREQ
FREQ2=FREQ
...
/OPT
OPVAR,FREQ1,SV,,387 !上限FREQ1=387
OPVAR,FREQ2,SV,386 !下限FREQ2=386
...
合理区域现为386到387,但每个状态变量有足够宽的范围以加速逼近(见OPVAR命令)。
在定义参数前用选择功能避免在奇异点处(如集中载荷)附近选择状态变量。
选择目标函数目标函数是设计要最小化或最大化的数值。选择目标函数要记住以下几点:
ANSYS程序总是最小化目标函数。如果要最大化数值x,就将问题转化为求数值x1=C-x或x1=1/x的最小值,其中C是远大于x的数值。定义C-x的方法比用1/ x的方法要好,因为后者是反比关系,在零阶方法中不能得到准确的逼近。
目标函数值在优化过程中应为正值,因为负值将会引起数据问题。为了避免负值出现,可以将一个足够大的正值加到目标函数上(大于目标函数的最大值)。
总体建议本部分说明了在优化设计中要记住的一些关键点。最重要的一点是要记住优化过程是一系列的分析过程,即一系列的前处理-求解-后处理-优化的循环。建议从一个简单的例子开始理解整个优化的过程。一旦理解了这个过程,求解实际问题时就会觉得很方便。
生成分析文件前面在“准备分析文件”一部分中提到,通过交互方式建模后有两种方式生成分析文件:用内部数据库命令流[LGWRITE](Utility Menu>File>Write DB Log File),或通过过程命令流文件(Jobname.LOG)。用内部数据库命令流有几个优点:
LGWRITE命令有一个选项(Kedit域)删除不重要的命令,或将其作为评论行写到文件中。该选项会自动对命令流文件做自动处理,但用户仍应做一下查看以确保文件适合优化。而且,内部数据库命令流包括整个模型的数据库,因此不需要几个文件拼凑起来。数据库命令流是存储在数据库文件中(Jobname.DB)的,读入的数据库将包含其完整的数据库命令流。(见ANSYS Operations Guide。)
注意:推荐在LGWRITE命令Kedit域中使用Kedit=COMMENT而不用Kedit=REMOVE。有些被Kedit过滤的命令有可能在后面*GET操作中用到(如EXREM和PLNSOL)。这些命令在Jobname.LGW的最后编辑中不能作为备注行。
注——/CLEAR命令将数据库从内存中清除,同时也清除了数据库命令流。在每次优化循环的开始将运行一个/CLEAR命令。如果/LGWRITE命令是在优化循环以后输入的,那么结果文件将是不完整的命令流。一般,数据库命令流文件是在优化循环开始前写的。
前面说过,在定义优化变量时不能用鼠标拾取的操作。如果因为拾取较方便而使用了这种操作,那么特殊的GUI生成命令(如FLST和FITEM)将写入命令流中。这些命令在ANSYS Commands Reference中有叙述。但是在最后处理命令流文件时将这些命令转化为参数形式将非常烦琐。
执行后修改设计变量序列在执行了一次或多次优化分析后[OPEXE],用户可能要删除一些设计变量[OPVAR,Name,DEL]然后进行下面的分析。通常,用户需要这些参数的数值保持不变(在最后优化过程的数值或用户指定的数值),而不要恢复回分析文件中的数值。假定在循环文件中没有重定义设计变量值,可以用下列方法修正“删除”了的设计变量数值:
在分析文件中,在/PREP7命令前初始化设计变量数值。(只有后来要修改的参数才出现在/PREP7命令前。
在下一个优化前,输入OPLOOP,PREP(Main Menu>Design Opt>Controls)从第一个/PREP7处读入分析文件。
如果不做上面两步操作,在以后的优化分析中设计变量将设为其初始值。
在下面的例子中,我们从两个设计变量,AREA1和AREA2开始进行优化。然后AREA2被“删除”(不再是设计变量),保持其当前值。
AREA1=5.00 !AREA1是第一个面积
AREA2=5.00 !AREA2是第二个面积
/PREP7 !进入PREP7前处理器
!用AREA1和AREA2建立参数化模型
...
...
FINISH
/SOLVE
!施加载荷等并求解
...
FINISH
/POST1
SET,...
...
*GET,SIG1,..,!定义用做状态变量和目标函数的参数
*GET,SIG2,...
*GET,SIG3,...
...
FINISH
/OPT !进入优化分析模块
OPVAR,AREA1,DV,..,!定义参数AREA1和AREA2为设计变量
OPVAR,AREA2,DV,...
OPVAR,SIG1,SV,..,!指定状态变量
OPVAR,SIG2,SV,...
OPVAR,TVOL,OBJ !指定目标函数
OPTYPE,SUBP !零阶方法
OPEXE !执行优化
OPVAR,AREA2,DEL !删除设计变量AREA2
STATUS !验证当前优化变量
OPLOOP,PREP !从第一个/PREP7位置读入分析文件
OPTYPE,..,!指定优化类型
..,!指定其他优化控制
OPEXE !执行优化
FINISH
请参阅OPVAR,OPTYPE,OPEXE和OPLOOP命令以得到更详细的解释。
执行后修正优化变量优化变量可以在优化执行之间修改,此时使用[OPVAR]命令(Main Menu>Design Opt>Design Variables)。例如,用户可能想修改目标函数的允差,状态变量的上下限,或删除一个设计变量,定义一个新的设计变量。不论是哪种情况,只要优化变量在一次优化分析后修改了,程序将自动对优化数据库进行部分的修改。这将不影响现存的设计序列和优化设定选项。只有与优化计算有关的信息将被清除。这样做是为了清除不适合于修改后的优化变量序列的数据。
局部最小值和全局最小值有些情况下,求解过程将终止于得到一个局部最小值而非全局最小值(见图1-4)。要验证这种情况是否存在,可以用一个不同的初始设计序列(即不同的初始设计变量值)重新进行分析。另外的方法见“零阶方法的特殊情况”一章。
最小重量和最小体积如果当前分析不需要时,应避免指定材料密度。因为不计算质量矩阵,可以节省机时。因为重量=密度*体积,所以可以通过这种方式参数化地计算重量,而把体积作为最小化的目标(假定模型密度是均匀的)。
网格密度在形状优化问题中,循环之间有限元网格是变化的,因此验证网格精度是否足够很重要。通过用参数方式指定网格划分数或网格大小,可以在每次循环中正确的改变之。
而且,在线性应力或热分析中,可以用能量法则列出每次循环的误差率(见ANSYS Basic Analysis Procedures Guide 第五章)。一个更加有趣的扩展方式是在设计优化循环中进行一次自适应网格循环来保证网格划分误差不超过一个定值。自适应网格划分的内容见ANSYS Advanced Analysis Techniques Guide 第二章。用下列方法列出误差率:
Command,PRERR
GUI,Main Menu>General Postproc>List Results>Percent Error
Utility Menu>List>Results>Percent Error
使用子结构如果模型只有一部分在优化设计中改变的话,可以考虑把不变的部分作成子结构。优化运行将只在使用部分(和扩展部分,如果必须的话)进行循环,从而大大节省机时。(子结构见ANSYS Advanced Analysis Techniques Guide。)
优化分析的示例(GUI方法)
在本例中,用一阶方法进行优化分析。
问题描述一个有三根杆组成的珩架承受纵向和横向载荷。珩架的重量在最大应力不超过400psi最小化。(因此重量为目标函数。)三根梁的横截面面积和基本尺寸B在指定范围内变化。
结构的重量初始设计为109.10磅。缺省允差(由程序计算)为初始重量的1%(11磅)。但是,为了便于收敛,一阶方法的优化分析中将目标函数的允差定为2.0。
问题参数分析中使用如下材料特性:
E=2.1E6psi
RHO=2.85E-4lb/in3 (比重)
最大许用应力=400psi
分析中使用如下几何特性:
横截面面积变化范围=1到1000in2 (初始值为1000)
基本尺寸B变化范围=400到1000in (初始值为1000)
问题简图
第一步:指定文件名选择Utility Menu>File>Change Jobname,打开文件名对话框。
输入“truss”为工作文件名。
单击OK关闭对话框。
第二步:指定分析题目选择Utility Menu>File>Change Title,打开更改分析题目对话框。
输入“Optimization of a Three-Bar Truss”作为分析题目。
单击OK关闭对话框。
第三步:定义参数初始值选择Utility Menu>Parameters>Scalar Parameters,打开数值参数对话框。在选择区域中输入下列内容:
B=1000 按ENTER键
A1=1000 按ENTER键
A2=1000 按ENTER键
A3=1000 单击OK。
参数将在菜单中显示出来。
在数值参数对话框中单击OK。
第四步:定义单元类型选择Main Menu>Preprocessor>Element Type>Add/Edit/Delete,打开单元类型对话框。
在单元类型库对话框中单击Add。
在左边列中单击Structural Link。
在右边列中单击2D Spar 1。
在单元参考号区域键入1。
在单元类型库对话框中单击OK。
在单元类型对话框中单击Close。
第五步:定义实参选择Main Menu>Preprocessor>Real Constants,打开实参对话框。
单击Add,打开实参对话框中单元类型。
单击OK,打开LINK1实参对话框。
在实参序列号区域中键入1。
在横截面区域中键入A1。
单击Apply。这将确认LINK1的实参并将1000输入实参1的横截面区域。
在实参序列号区域键入2。
在横截面面积区域键入A2。
单击Apply。这将确认LINK1的实参并将1000输入实参1的横截面区域。
10.在实参序列号区域键入3。
11.在横截面面积区域键入A3。
12.在LINK1实参对话框中单击OK。
13.在实参对话框中单击 Close。
第六步:定义材料特性选择Main Menu>Preprocessor>Material Props>-Constant->Isotropic,打开各项同性材料特性对话框。
在材料号区域中输入1。
单击OK打开第二个各项同性材料特性对话框。
在杨氏模量对话框输入2.1E6。
单击OK并关闭对话框。
第七步:生成结点选择Main Menu>Preprocessor>-Modeling->Create>Nodes>In Active CS,打开在活动坐标系中生成结点对话框。
在结点号区域中输入1。
在活动坐标域,第一个域中输入-B,第二个域中输入0,第三个输入0。
单击Apply。结点1将出现在ANSYS图形窗口。
在结点号码域中输入2。
在活动坐标域,第一个域中输入0,第二个域中输入0,第三个输入0。
单击Apply。结点2将出现在ANSYS图形窗口。
在结点号码域中输入3。
在活动坐标域,第一个域中输入B,第二个域中输入0,第三个输入0。
10.单击Apply。结点2将出现在ANSYS图形窗口。
11.在结点号码域中输入3。
12.在活动坐标域,第一个域中输入0,第二个域中输入-1000,第三个输入0。
13.单击OK关闭在活动坐标系生成结点对话框。结点4将出现在ANSYS图形窗口中。所有4个结点都出现在ANSYS图形窗口中。
14.打开结点号码。选择菜单Utility Menu>PlotCtrls>Window Controls>Window Options打开窗口选项对话框。
15.在结点号码框上单击OFF(将切换为ON)。
16.单击OK关闭对话框。
17.选择菜单Utility Menu>PlotCtrls>Window Controls>Windows Options打开窗口对话框。
18.在坐标位置出选取不显示选项。
19.单击OK关闭对话框。
第八步:生成单元选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>-Auto Numbered->Thru Nodes打开结点对话框的单元项。
在图形窗口,拾取结点1和4(按照该顺序)。在选择的结点周围将出现一个小框。
在该对话框单击OK关闭对话框。ANSYS图形窗口中1和4结点之间将出现一个线单元1。
选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>
Elem Attributes打开单元特性对话框。
在实参序列号中输入2。
在单元特性对话框中单击OK。
选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>-Auto Numbered->Thru Nodes打开结点对话框的单元项。
在图形窗口,拾取结点2和4(按照该顺序)。
在该对话框单击OK关闭对话框。ANSYS图形窗口中3和4结点之间将出现一个线单元2。
10.选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>Elem Attributes打开单元特性对话框。
11.在实参序列号中输入2。
12.在单元特性对话框中单击OK。
13.选择菜单Main Menu>Preprocessor>-Modeling->Create>Elements>-Auto Numbered->Thru Nodes打开结点对话框的单元项。
14.在图形窗口,拾取结点2和4(按照该顺序)。
15.在该对话框单击OK关闭对话框。ANSYS图形窗口中3和4结点之间将出现一个线单元3。
第九步:施加位移约束和载荷选择菜单Main Menu>Solution>-Loads->Apply>-Structural->Displacement>On Nodes 打开Apply U,ROT on Nodes的对话框。
在ANSYS图形窗口,拾取结点1,2和3。
单击OK关闭对话框并打开第二个Apply U,ROT on Nodes的对话框。
在要约束的自由度菜单上单击ALL DOF选项。
单击OK关闭对话框。
选择菜单Main Menu>Solution>-Loads-Apply>-Structural-Force/Moment>On Nodes打开Apply F/M on Nodes对话框。
在ANSYS图形窗口,拾取结点4。
在对话框中单击OK关闭并打开第二个Apply F/M on Nodes对话框。
将Force/Mom方向设为FX。
10.在Force/Moment Value域输入200000。
11.单击OK关闭对话框。在结点4上将出现一个横向箭头表示施加的载荷。
12.选择菜单Main Menu>Solution>-Loads-Apply>-Strutural-Force/Moment>On Nodes打开Apply F/M on Nodes对话框。
13.在ANSYS图形窗口,单击结点4。
14.在对话框中单击OK关闭并打开第二个Apply F/M on Nodes对话框。
15.将Force/Mom方向设为FX。
16.在Force/Moment Value域输入-200000。
17.单击OK关闭对话框。在结点4上将出现一个垂直箭头表示施加的载荷。
第十步:求解模型选择菜单Main Menu>Solution>-Solve->Current LS打开Solve Current Load Step对话框。求解目标和载荷步选项在出现在状态窗口。
查看状态窗口中的目标信息并在菜单条上单击Close关闭。
在该对话框中单击OK。
求解完毕后,将出现信息框告诉用户求解完毕。单击Close关闭对话框。
第十一步,进入后处理器并读出单元总体积选择菜单Main Menu>General Postproc>Element Table>Define Table 打开Element Table Data 对话框。
单击Add定义单元表格并打开Define Additional Elementary Table Items 对话框。
在User Label域中输入EVOL。
在Item,Comp Results Data Item菜单的左列单击Geometry,在右列单击Elem Volume VOLU。
单击OK关闭对话框。
在Element Table Data对话框中单击Close。
选择菜单Main Menu>General Postproc>Element Table>Sum of Each Item打开Tabular Sum of Each Element Table Item对话框。
单击OK计算总和。SSUM命令窗口将显示总和为0.382842E+07。
单击菜单条上的Close关闭SSUM命令窗口。
10.选择菜单Utility Menu>Parameters>Get Scalar Data打开Get Scalar Data对话框。
11.在Type of Data to be Retrieved 菜单左列单击Results Data,在右列单击Elem Table Sums。
12.单击OK关闭对话框并打开Get Element Table Sum Results 对话框。
13.在Name of Parameter to be Defined域输入VTOT。
14.单击OK关闭对话框。
15.选择菜单Utility Menu>Parameters>Scalar Parameters 打开Scalar Parameters对话框。
16.在Selection域输入RHO=2.85E-4并按ENTER键。本信息应显示在菜单上。
17.在Selection域输入WT=RHO*VTOT并按ENTER键。总的体积将计算并显示在菜单中。重量应为1091.10173。
18.单击Close关闭对话框。
第十二步:读出轴向应力选择菜单Main Menu>General Postproc>Element Table>Define Table打开Element Table Data对话框。
单击Add打开Define Additional Element Table Items对话框。
在User Lable for Item域键入SIG。
在Item,Comp Results Data Item菜单左列单击By Sequence Num,在右列单击LS。
在Selection域,在“LS”后键入1(表示序列号为1)。
单击OK关闭对话框。
在Element Table Data对话框中单击Close。
选择菜单Utility Menu>Parameters>Get Scalar Data打开Get Scalar Data对话框。
在the Type of Data to be Retrieved菜单,在左列单击Results Data,在右列单击Elem Table Data。
10.单击OK关闭对话框并打开Get Element Table Data对话框。
11.在Name of Parameter to be Defined 域输入SIG1。
12.在Element Number N域输入1。
13.将Elem Table Data to be Retrieved 域设为SIG。
14.单击Apply关闭对话框并打开Get Scalar Data 对话框。
15.在Type of Data to be Retrieved菜单,在左列单击Results Data,在右列单击Elem Table Data。
16.单击OK打开Get Element Table Data 对话框。
17.在Name of Parameter to be Defined 域输入SIG2。
18.在Element Number N域输入2。
19.将Elem Table Data to be Retrieved 域设为SIG。
20.单击Apply关闭对话框并打开Get Scalar Data 对话框。
21.在Type of Data to be Retrieved菜单,在左列单击Results Data,在右列单击Elem Table Data。
22.单击OK打开Get Element Table Data 对话框。
23.在Name of Parameter to be Defined 域输入SIG3。
24.在Element Number N域输入3。
25.将Elem Table Data to be Retrieved 域设为SIG。
26.单击OK关闭对话框。
27.计算轴向应力的绝对值。选择菜单Utility Menu>Parameters>Scalar Parameters打开Scalar Parameters对话框。在Selection域输入以下信息:
SIG1=ABS(SIG1) 输入ENTER
SIG2=ABS(SIG2) 输入ENTER
SIG3=ABS(SIG3) 单击OK
28.单击Close关闭对话框。
第十三步:显示当前设计选择菜单Utility Menu>PlotCtrls>Style>Size and Shape打开the Size and Shape对话框。
在Display of element shapes based on real constant description表示的行中单击OFF将其切换为ON。
在Real constant Multiplier 域中输入2。
单击OK关闭对话框。
选择菜单Utility Menu>PlotCtrls>Pan,Zoom,Rotate打开Pan,Zoom,Rotate对话框。
单击ISO显示3杆珩架的轴测图。
单击Close关闭对话框。
选择菜单Utility Menu>Plot>Elements画出珩架。
第十四步:生成优化分析文件选择菜单Utility Menu>File>Write DB Log File打开Write Database Log对话框。
在Write Database Log To域中添加“truss.lgw”到路径名中。
单击OK关闭对话框。
第十五步:进入优化处理器并指定分析文件选择菜单Main Menu>Design Opt>-Analysis File->Assign打开Assign Analysis File对话框。
在Selection域添加“truss.lgw”到路径名(或在文件列表中拾取truss.lgw)。
单击OK关闭对话框。
第十六步:定义优化设计变量选择菜单Main Menu>Design Opt>Design Variables打开Design Variables对话框。
单击Add打开Define a Design Variable对话框。
在Parameter Name菜单单击B;B将出现在Selection域。
在Minimum Value域中输入400。
在Maximum Value域中输入2000。
单击Apply确认设计变量。
在Parameter Name菜单单击A1;A1将出现在Selection域。
在Minimum Value域中输入1。
在Maximum Value域中输入1000。
10.单击Apply确认设计变量。
11.在Parameter Name菜单单击A2。
12.在Minimum Value域中输入1。
13.在Maximum Value域中输入1000。
14.单击Apply确认设计变量。
15.在Parameter Name菜单单击A3。
16.在Minimum Value域中输入1。
17.在Maximum Value域中输入1000。
18.单击OK关闭对话框。
19.单击Close关闭Design Variables对话框。
第十七步:定义优化状态变量选择菜单Main Menu>Design Opt>State Variables打开State Variables对话框。
单击Add打开Define a State Variable 对话框。
在Parameters Name域选择SIG1;SIG1将出现在Selection 域。
在Upper Limit 域输入400。
单击Apply确认状态变量。
在Parameters Name域选择SIG2;SIG2将出现在Selection 域。
在Upper Limit 域输入400。
单击Apply确认状态变量。
在Parameters Name域选择SIG3;SIG3将出现在Selection 域。
10.在Upper Limit 域输入400。
11.单击OK关闭对话框。
12.单击Close关闭State Variable对话框。
第十八步:存储优化数据库选择菜单Main Menu>Design Opt>-Opt Database->Save打开Save Optimization Data 对话框。
在Selection域添加“trussvar.opt”到路径名。
单击OK关闭对话框。
第十九步:设置重量为目标函数选择菜单Main Menu>Design Opt>Objective 打开Define Objective Function对话框。
在Parameter Name菜单单击WT;WT将出现在Selection域。
在Convergence Tolerance域输入2。
单击OK关闭对话框。
第二十步:指定一阶优化方法选择菜单Main Menu>Design Opt>Method/Tool打开Specify Optimization Method对话框。
在Select Method/Tool列表中单击First-Order radio按纽。
单击OK打开Controls for First-Order Optimization对话框。
在maximum Iterations域中输入45。
单击OK关闭对话框。
第二十一步:运行优化选择菜单Main Menu>Design Opt>Run打开Begin Execution of Run 对话框。
查看分析信息,单击OK开始优化运算。
求解过程要持续一些时间。在优化循环结束后,最佳设计序列号为16,重量为301.23。
第二十二步:列出最佳设计序列和所有设计序列选择菜单Main Menu>Design Opt>-Design Sets->List打开List Design Set对话框。
在列表选项中拾取BEST序列。
拾取OK打开OPLIST命令窗口。最佳序列为16。
在查看优化参数值后,在菜单条上单击Close。
选择菜单Main Menu>Design Opt>-Design Sets->List打开List Design Sets 对话框。
在列表选项中拾取ALL序列。
单击OK打开OPLIST命令窗口。
查看完所有设计序列后,单击菜单条上的Close。
第二十三步:将重量和基本尺寸作为迭代次数的函数显示选择菜单Utility Menu>PlotCtrls>Pan,Zoom,Rotate 打开Pan-Zoom-Rotate对话框。
单击Front选择X-Y平面视角。
单击Close关闭对话框。
选择Utility Menu>PlotCtrls>Style>Graphs打开Graph Controls对话框。
在X-Axis标记域输入ITERATION NUMBER。
在Y-Axis标记域输入STRUCTURE WEIGHT。
单击OK关闭对话框。
选择菜单Main Menu>Design Opt>Graphs/Tables打开Graph/List Tables of Design Set Parameters对话框。
在Y-Variable Params菜单单击WT。
10.单击OK关闭对话框。在ANSYS图形窗口将显示重量和迭代的图形。
11.选择Utility Menu>PlotCtrls>Style>Graphs打开Graph Controls对话框。
12.在Y-Axis 标记域输入BASE DIMENSION。
13.单击OK关闭对话框。
14.选择菜单Main Menu>Design Opt>Graphs/Tables打开Graph/List Tables of Design Set Parameters 对话框。
15.在Y-Variable Params菜单单击WT不选它,然后单击B。
16.单击OK关闭对话框。在ANSYS图形窗口将显示Base Dimension和Iteration图形。
第二十四步:将最大应力和截面尺寸作为迭代数的函数显示选择菜单Utility Menu>PlotCtrls>Style>Graphs打开Graph Controls对话框。
在Y-Axis 标记域输入MAXIMUM STRESS。
单击OK关闭对话框。
选择菜单Main Menu>Design Opt>Graphs/Tables打开Graph/List Tables of Design Set Parameters对话框。
在Y-Variable Params菜单单击B不选它,然后单击SIG1,SIG2,SIG3。
单击OK关闭对话框。在ANSYS图形窗口将显示应力和迭代数的图形。
选择菜单Utility Menu>PlotCtrls>Style>Graphs打开Graph Controls对话框。
在Y-Axis 标记域输入CROSS-SECTIONAL AREA。
单击OK关闭对话框。
10.选择菜单Main Menu>Design Opt>Graphs/Tables打开Graph/List Tables of Design Set Parameters对话框。
11.在Y-Variable Params菜单单击 SIG1,SIG2,SIG3不选它,然后单击A1,A2,A3。
12.单击OK关闭对话框。在ANSYS图形窗口将显示截面面积和迭代数的图形。
第二十五步:退出ANSYS
在ANSYS工具栏单击Quit。
选择一个选项存盘,然后单击OK。
优化分析示例(命令和批处理方式)
也可以用命令行方式做以上的优化分析。以!开始的行为注释行。
/FILNAM,truss
/TITLE,Optimization of a three-bar truss
!初始化设计变量参数
B=1000 !基本尺寸
A1=1000 !第一个面积
A2=1000 !第二个面积
A3=1000 !第三个面积
!
!进入PREP7并建模
/PREP7
ET,1,LINK1 !二维杆单元
R,1,A1 !以参数形式的实参
R,2,A2
R,3,A3
MP,EX,1,2.1E6 !杨氏模量
N,1,-B,0,0 !定义结点
N,2,0,0,0
N,3,B,0,0
N,4,0,-1000,0
E,1,4 !定义单元
REAL,2
E,2,4
REAL,3
E,3,4
FINISH
!
!进入求解器,定义载荷和求解
/SOLU
D,1,ALL,0,,3 !结点UX=UY=0
F,4,FX,200000 !结点4上的X方向载荷分量
F,4,FY,-200000 !结点4上的Y方向载荷分量
SOLVE
FINISH
!
!进入POST1并读出状态变量数值
/POST1
SET,LAST
ETABLE,EVOL,VOLU !将每个单元的体积放入ETABLE
SSUM !将单元表格内数据求和
*GET,VTOT,SSUM,,ITEM,EVOL !VTOT=总体积
RHO=2.85E-4
WT=RHO*VTOT !计算总体积
ETABLE,SIG,LS,1 !将轴向应力放入ETABLE
!
*GET,SIG,ELEM,1,ETAB,SIG !SIG1=第一个单元的轴向应力
*GET,SIG,ELEM,2,ETAB,SIG !SIG2=第二个单元的轴向应力
*GET,SIG,ELEM,3,ETAB,SIG !SIG3=第三个单元的轴向应力
!
SIG1=ABS(SIG1) !计算轴向应力的绝对值
SIG2=ABS(SIG2)
SIG3=ABS(SIG3)
!
/ESHAPE,2 !以实体单元模式显示壳单元
/VIEW,1,1,1,1 !轴测视图
EPLOT !画单元
!
/OPT !进入优化处理器
OPANL,truss,lgw !指定分析文件(批处理方式中不用这个命令)
!
OPVAR,B,DV,400,2000 !定义设计变量
OPVAR,A1,DV,1,1000
OPVAR,A2,DV,1,1000
OPVAR,A3,DV,1,1000
OPVAR,SIG1,SV,,400 !定义状态变量
OPVAR,SIG2,SV,,400
OPVAR,SIG3,SV,,400
!
OPSAVE,trussvar,opt !存储数据
!
OPVAR,WT,OBJ,,,2,!定义目标函数
!
OPTYPE,FIRST !定义一阶方法
OPFRST,45 !最大45次迭代
OPEXE !开始优化分析
!
OPLIST,16 !列出最佳设计序列,号为16
OPLIST,ALL !列出所有设计序列
!
/VIEW,1,,,1 !前视图
!
/AXLAB,X,ITERATION NUMBER !画重量对迭代数图形
/AXLAB,Y STRUCTURE WEIGHT
PLVAROPT,WT
!
/AXLAB,Y,BASE DIMENSION !画B对迭代数图形
PLVAROPT,B
!
/AXLAB,Y,MAX STRESS !画最大应力对迭代数图形
PLVAROPT,SIG1,SIG2,SIG3
!
/AXLAB,Y,CROSS-SECTIONAL AREA ! 画面积对迭代数图形
PLVAROPT,A1,A2,A3
!
FINISH
/EXIT
《ANSYS Verification Manual》中的例题:
VM155 悬臂梁的形状优化
VM157 框架结构的优化