如何入门拓扑优化研究(转自知乎 周平章博士的文章 很有启发)
Posted 立志做码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何入门拓扑优化研究(转自知乎 周平章博士的文章 很有启发)相关的知识,希望对你有一定的参考价值。
最近有很多人私信我咨询如何入门拓扑优化的研究,为了避免重复劳动,我在这篇文章里做一个统一回复。
首先必须声明,我自己也是拓扑优化研究领域的新人,因此本文仅代表我作为一个新人的一些浅薄的看法,大家切记不可奉为圭臬。
一、内功心法:知识体系的构建
如果你仅仅是想“用”拓扑优化技术解决一个实际的工程问题,那么很显然你并不需要什么知识体系,简单地找一款商业软件(如Optistruct/TOSCA/ABAQUS/ANSYS etc.)然后读一下软件的manual,跟着做几个例子,你就可以出师去干活(搬砖)了。所以如果你是这种情形,那么下面的内容可以不用浪费时间去读了。
如果你是拓扑优化方向的研究生或者博士生,那夯实知识体系应该是非常重要的一件事情。我认为在学术研究中,内功心法要比招式重要得多。试想一下,一个连“形函数”、“Gauss积分”这种最基本的计算力学概念都不清楚的孩子怎么可能做出很优秀的research。
拓扑优化是计算力学下的一个分支,而计算力学是力学下的一个分支。所以,作为拓扑优化方向的researcher,大家应该首先把力学和计算力学的基础打好。我自己是直博生,所以有比较充足的时间修习相关的课程体系:
- 张量分析、弹塑性力学、固体力学;
- 有限元分析与应用、计算固体力学、计算动力学;
- 高等固体力学。
如果是硕士的话,可能没有那么多的时间去修完全部这些课程。作为保底的方案,至少得修《弹性力学》和《有限元分析》这两门课程。
二、武功招式:自己搭建一个有限元程序库
我自己的经验,在掌握了前述内功心法之后,应该有能力自己动手写一个完整的有限元软件包了。还是那句话,拓扑优化是计算力学的分支,计算力学就意味着你一定得会编程。因此,自己动手写一个完整的有限元工具箱是锻炼自己编程能力、同时检验自己力学基础的一个绝佳方法。
在写程序的时候,一般有两种方案:
- 以“基本语言”为编程工具,例如Fortran/C/C++ etc. 这种方案的好处是,写好的程序通用性很好,且很容易扩展到计算超大规模的问题,能够解决工程实际问题。缺点是,所花时间较长。
- 以“高级语言”为编程工具,如MATLAB。作为一个使用MATLAB多年的老PhD,我强烈推荐大家以MATLAB来入门计算力学。这种方案的好处是,你站在巨人的肩膀上,因此可以避免去写大量的底层程序(例如,Gauss消元法解线性方程组、Lanzcos法求大型稀疏矩阵的特征值,等等)的代码。你只需要专注于有限元计算的基本流程即可,所用到的底层程序MATLAB都已经为你准备好了。这种方案的缺点是,作为解释性语言,MATLAB有太多的trick。如果不掌握这些trick,你所写的程序很可能慢得一塌糊涂,根本算不了大规模问题。但即使是这样,通过MATLAB你也能够掌握一个有限元程序包的基本流程和编程方法。
三、登堂入室:正式学习拓扑优化相关技术
到这里,你就可以轻松入门拓扑优化了。总的说来,拓扑优化方法目前分为两大类:
第一类:变密度方法及其变形。
这一类方法发源于Bendsoe和Kikuchi的均一化方法,后来在Rozvany/Bendsoe/周明/Sigmund/Olhoff等一批人的一系列工作之下,现在意义下的变密度法得以成形。值得注意的是,目前所有商业软件中拓扑优化模块所用的技术都是基于变密度方法的。我在知乎上的另一个问题下的也曾说过,变密度法相对于其余方法的最大优势是:对于任意形状的可行设计域具有普适性。如果想了解变密度法的相关知识,Bendsoe和Sigmund写于2003年的经典教材《Topology Optimization: Theory and Applications》一定是不可错过的。不过就我个人的看法,这本教材的起点较高,不大适合新人入门,更适合于新人入门的是Sigmund大名鼎鼎的99行程序《A 99 line topology optimization code written in MATLAB》。当然,Sigmund的99行程序按照今天的观点来看,有很多地方可以改进。针对99行程序的改进后来又出现了88行程序、针对3D问题的程序、等等。
[1]. Sigmund O (2001) A 99 line topology optimization code written in Matlab. Structural and Multidisciplinary Optimization
[2]. Andreassen E, Clausen A, Schevenels M, Lazarov BS, Sigmund O (2010) Efficient topology optimization in MATLAB using 88 lines of code. Structural and Multidisciplinary Optimization doi: 10.1007/s00158-010-0594-7
[3]. Talischi C, Paulino GH, Pereira A, Menezes IFM (2012) PolyTop: A Matlab implementation of a general topology optimization framework using unstructured polygonal finite element meshes. Structural and Multidisciplinary Optimization 45(3):329-357 doi:
10.1007/s00158-011-0696-x
[4]. Liu K, Tovar AE (2014) An efficient 3D topology optimization code written inMatlab. Structural and Multidisciplinary Optimization:1175-1196 doi: 10.1007/s00158-014-1107-x
澳大利亚RMIT的谢亿民老师及其团队提出的ESO/BESO方法中保留了变密度法的一些痕迹,但加入了他们自己的一些新想法。ESO/BESO方法试图解决传统SIMP方法中的灰色单元问题。感兴趣的同学可以参考谢亿民老师的相关文献。特别指出,谢亿民老师出了一本教材专门用来介绍他们的ESO/BESO方法:
[5]. Huang X, Xie M (2010) Evolutionary topology optimization of continuum structures: Methods and applications: John Wiley & Sons.
第二类:边界演化方法。
变密度法认为拓扑优化问题是一个材料本构模型的插值问题,与之相反,边界演化方法试图通过显式地控制实边界的演化过程来实现拓扑优化。显然,这两种方法从一开始的出发点就不同,前者相信星星之火可以燎原,主张通过微观层次材料本构参数的变化最终实现宏观层次结构拓扑构形的变化;后者一开始就高屋建瓴抓住拓扑二字的本质,直面边界演化。据我所知,目前边界演化方法里较为成熟的方法包括:
(1)Level-set方法。这一方法由香港中文大学的Michael Yu Wang提出,认为实体的边界可由更高一维的函数的等高面来描述,在每次迭代时通过求解Jacobi扩散方程确定边界的演化过程。当然,现在level-set方法经过大量学者的改进跟王老师最开始提出来的level-set方法已经不太一样了,感兴趣的同学可以自行查阅相关的文献。
[6]. Wang MY, Wang X, Guo D (2003) A level set method for structural topology optimization. Comput. Methods Appl. Mech. Engrg. 192(1):227-246 doi: 10.1016/S0045-7825(02)00559-5
[7]. Wang SY, Lim KM, Khoo BC, Wang MY (2007) An extended level set method for shape and topology optimization. Journal of Computational Physics 221(1):395-421
[8]. van Dijk NP, Maute K, Langelaar M, van Keulen F (2013) Level-set methods for structural topology optimization: A review. Structural and Multidisciplinary Optimization 48(3):437-472
(2)MMC/MMV方法。这一方法由大连理工的郭旭老师的团队提出。该方法认为实体的边界可由显式的函数进行描述,从而将拓扑优化问题转化为拓扑描述函数的基本参数的参数优化问题。很显然,这种思路下,优化问题的计算规模大大缩减了,但随之而来的问题是如何寻找到普适的、能够描述任意复杂形状的拓扑描述函数。郭旭老师近年来十分活跃,有很多很不错的工作,感兴趣的同学可以关注他们的文章:
[9]. Zhang W, Yang W, Zhou J, Li D, Guo X (2017) Structural topology optimization through explicit boundary evolution. Journal of Applied Mechanics-Transactions of the ASME 84(0110111) doi: 10.1115/1.4034972
[10].Zhang W, Chen J, Zhu X, Zhou J, Xue D, Lei X, Guo X (2017) Explicit three dimensional
topology optimization via Moving Morphable Void (MMV) approach. Computer Methods in Applied Mechanics and Engineering 322(590-614 doi: 10.1016/j.cma.2017.05.002
[11].Zhang W, Zhou J, Zhu Y, Guo X (2017) Structural complexity control in topology
optimization via moving morphable component (MMC) approach. Structural and
Multidisciplinary Optimization 56(3):535-552 doi: 10.1007/s00158-017-1736-y
(3)相场(Phase-field)方法。这个方面我了解不多,不太清楚具体情形,感兴趣的同学可以自行查阅文献。
四、选一把好的装备:优化求解器(optimizer)
经评论区同学的提醒,我补充上关于数值优化方面的一些基本信息。
拓扑优化,从名字上就决定了我们本质上是在求解一个优化问题,因此对于数值优化方面的一些基本了解是必不可少的。事实上,能否选一个好的优化求解器将直接决定你在做research的时候的效率以及最终结果的美观性等等。
拓扑优化问题肯定是一个优化问题,但又不是那么简单的优化问题,拓扑优化本身的一些特点决定了必须十分谨慎小心地选择合适的optimizer:
- 问题规模超大。在变密度法中,一个三维问题动辄就是十万、百万规模的设计变量,对于绝大多数优化算法和优化求解器来说,面对如此大规模的问题很可能束手无策。
- 在大多数情况下,仅能够获得一阶导数(也就是所谓的灵敏度)信息。这决定了不大可能采用那些强烈依赖于二阶导数(Hessian矩阵)的方法。当然,BFGS提够了另一种思路。
- 每次迭代的计算成本很大。每计算一次目标函数/约束条件,就需要完整地执行一次有限元分析,这种计算量是很多只搞数值优化的人所不了解的。
上述特点反映在拓扑优化研究领域的一个直接后果就是,长期以来,拓扑优化领域的学者不信任通用的数值优化算法。一个在本领域内流行的观点是,通用数值优化算法由于对精度要求过高,在用于求解拓扑优化问题时的迭代次数以及随之而来的计算量是无法接受的。在这种观点的指导下,从上世纪七、八十年代开始,拓扑优化领域的学者就致力于发展适用于本领域的数值优化算法,这其中的佼佼者包括:优化准则法、MMA、CONLIN等等。
我们现在所处的时代跟我们的老前辈们很不一样,老前辈们当年的一些困难(如内存、CPU计算速度等)在今天很可能已经不是困难了。因此当前的拓扑优化领域内也出现了一种声音,认为现在已经能够将通用数值优化算法直接应用于拓扑优化问题了。在SAMO上最近有越来越多的年轻学者(我也是其中之一)更愿意使用通用优化算法。
关于通用数值优化算法(如现在比较流行的内点法、SQP方法等等)与拓扑优化领域内长期使用的传统方法之间的对比,在这儿不便展开,我(强烈)推荐下面的文献:
[12]. Rojas-Labanda S, Stolpe M (2015) Benchmarking optimization solvers for structural topology optimization. Structural and Multidisciplinary Optimization 52(3):527-547
关于通用数值优化方面的知识,肯定是越多越好,我推荐下面的两本鸿篇巨著,如能通读肯定会浑身通畅,但读的过程可能不会太舒服。
[13]. Nocedal J, Wright SJ (2006) Numerical optimization: Springer.
[14]. Boyd S, Vandenberghe L (2004) Convex optimization. Stanford: Cambridge University Press.
关于本领域内的经典算法MMA,做一些必要的了解是你在这个领域内交流所必不可少的(你的审稿意见中总会出现MMA这个词,所以,你懂的)。MMA在历史上经过了多次改进,大家不妨直接学习最新版:
[15]. Svanberg K (2007) MMA and GCMMA, versions September 2007
在做一个拓扑优化的research时,首先是研究问题本身,然后提出数学模型(mathematical formulation)。此后最重要也是最复杂的部分就是推导目标函数和约束条件的灵敏度信息。其实说白了,推导灵敏度就是求一个函数 的一阶导数。如果大家的微积分基础还可以的话,这块应该不是问题。很可能需要补充的是关于矩阵函数求导的知识,这块内容说白了也很简单,就是每个分量分别关于自变量求导。但这一块有很多初学者不知道的黑科技,我推荐以下资源作为参考:
[16]. Matrix calculus - Wikipedia
[17]. The Matrix Cookbook
在读拓扑优化的文献时,大家肯定会遇到一个词叫做“伴随灵敏度分析”(adjoint method),我当时被这个词吓了一大跳,以为是多么高明、高深的东西。其实理解了之后就会发现,本质上和传统的直接微分法(direct differential method)是完全等价的。如果想详细了解这两种分析方法,我推荐杜建镔老师的教材,其中有一章专门讲这个问题:
[18]. 杜建镔. 结构优化及其在振动和声学设计中的应用[M]. 清华大学出版社, 2015.
以上是关于如何入门拓扑优化研究(转自知乎 周平章博士的文章 很有启发)的主要内容,如果未能解决你的问题,请参考以下文章