浅谈数值模拟的误差来源与解决方法
数值模拟(或叫做仿真)作为一种研究手段,受到大量研究人员的青睐。应用广泛,大到航空国防,小到手机中的电池热管理,众多邻域都能见到它的身影。既然叫做模拟,那么他就存在误差,带来误差因素也贯穿于仿真的全过程。对于引起这些误差的因素如果没有深刻的理解,很容易得到错误仿真的结果,进而得出错误的结论,那就对你正在进行的研究工作没有起到该有价值,从而就失去了数值模拟分析的意义。下面将浅析数值模拟的误差。
第一,模拟软件。数值模拟本质是对真实物理解的一种近似,我们仿真大多数用的都是商用模拟软件,使用者只需要点点鼠标就可以完成一个仿真任务,然而殊不知,你每点一下鼠标,每输入一个参数,这究竟意为着什么呢?其实这些仿真软件,本质上都是对迄今为止最先进数学、物理等理论模型,通过算法转化为一串串代码植入到了软件中,再通过可视化技术,变成了我们眼前看到的操作界面,再配合上植入了各种优秀数值算法的求解器,就可以完成各种仿真任务求解。那么就迎来了第一个误差,也是最原始的误差:理论模型误差,而且这对数值模拟来说这几乎不能避免。这是因为,这些学者在建立理论模型过程中,往往都是基于一些基本假设(例如流体力学、固体力学中的连续介质假设以及一些理想化假设如真空、无阻、完全弹性),但一般在使用过程中这个假设带来的误差可以忽略不计,但你要是钻牛角尖的话,误差还是有的。又如,很多理论模型都是学者基于特定的物理条件建立的(如CFD分析中的湍流模型,模型中的一些参数都是在特定的实验中获取的,还有一些经验参数),他们并不具有普适性,那么你要是错误的将该模型应用到实际物理情况相差很大的情况下,势必将引起不小的误差。那么这要如何避免呢?个人认为,各个理论模型本身的假设误差,作为应用者来说无法避免,但是我们要是能对研究的实际物理问题有深刻的认识,同时对可供选择的理论模型也有深刻的认识,进而选择最适合我们物理问题的理论模型,这样既避免了导致很大的误差来源,同时还能对我们的研究工作可以起到事半功倍的效果。数值算法,上面我们说到了求解器,求解器的本质就是,我们设置完各种边界条件后,等待求解时,此时软件底层已经针对你的物理问题建立好了庞大的代数方程,求解这些代数方程,就需要用到求解器,而求解器的作用就是用我们数值分析中学到了各种求解代数方程方法(如Jacobi与Gauss-Seidel迭代法)来计算这些方程,那么这个过程就会存在数值迭代误差,以及计算机在求解过程中还存在截断误差(舍入误差),这样结果就与方程的精确解有一定的偏差。我们作为仿真软件的应用者,理论模型误差和数值算法误差我们都无法避免,我们只能针对不同问题选择合适的模型和合适的求解器,以尽可能大的降低他们带来的误差影响。
第二,几何简化。对任何一个工程问题,要进行数值模拟时,我们都会针对实际物理情况对其进行计算域几何建模。然而,实际情况往往都非常复杂,因为细节太多。人的直线思维往往会这样处理:一比一还原实际的物理几何模型,这样得到的结果一定真实准确,理论上确实是这样,但实际却很难做到,因为今天无论是从理论上,还是从仿真软件的发展来讲,都还没有能力处理好每一个细节,有时候这些不必要细节还会导致计算失败。因此我们计算前,要对物理几何进行一些简化和省略,常见的简化有这些,三维简化为二维,轴对称几何简化为二人之一,以及忽略掉对我们结果不会产生影响的几何特征(这需要工程经验),但是注意,如果进行了一些不合理的简化,容易造成物理问题的改变,这样得到的结果就不是你原来想要研究问题的结果了。话说回来,既然简化了,当然误差就会产生了,但是,这是真的误差吗?其实不然,我称这种误差为伪误差,为什么这样说呢,第一,其实当我有了大量仿真经验和工程经验时会发现,有时候二维简化可能得到比三维更准确地结果,尽管有时候我们二维分析多数是为了减少计算量才这样做的。第二,我们进行数值模拟,都是带着为了得到某种目标结果去的,有些几何上的简化,并不会对我们想要得到的结果产生影响,可以忽略,因此这样产生的误差不算是真的误差,是一种伪误差。虽然几何简化是必要的,但是不合理的几何简化,就会产生巨大的误差,对于后面要说的这些因素中,它带来的误差往往是最大的。针对这一点,我们通常可以选取几种简化方案(同样需要丰富的工程经验或模仿),与实际情况进行对比,选取结果最佳的那个进行进一步分析。
第三,网格划分。划分网格带来的误差,一般称为离散误差。网格质量、精度、类型都会造成离散误差。这是网格划分所引起的,本质上讲,一个物理问题对应的是一组偏微分方程或积分方程(也就是控制方程,例如流体分析中的质量、动量守恒方程等),求解这些方程的方法就是把对应这个物理问题的偏微分方程,通过离散方法(有限元、有限差分、有限体积法),在一个个单元(网格)节点上进行离散,从而得到一组代数方程(也叫离散方程),而所有的网格节点上都有这些代数方程组,这构成了这个物理问题所组成的庞大代数方程组,再通过数值算法就能求解这些代数方程组。概括来说就是,把连续域上物理场的量,通过离散点的物理量的集合代替。所以对于网格精度,只要我们的网格无限小,那么要求解的代数方程组就越多,获得的解就会足够的精确,同时计算时间就会相应的增加,但是我们一般不会这么做,这会造成计算资源的巨大浪费。我们一般的解决办法是会在未知变量变化很大的地方划分更多更细的网格,以捕捉到变量变化梯度。但是到底划多少网格合适呢?这个没有标准答案,工程上的解决办法是,进行网格无关解验证,即由粗到细分别划分网格,直到结果之间的变化率小到可以忽略不计为止,此时的网格,在保证计算资源够用的情况下,就是精度最高,误差最小的网格。对于网格类型,总的来分有结构化网格和非结构化网格,二维结构化网格都由四边形组成,三维结构化网格都由六面体组成,视觉上的表现就是,那种看上去整齐规范的四边形或六面体组成的网格就是结构化网格,那种没有明显的规范性网格,就是非结构网格。不过,随着计算机技术的发展,今天非结构化网格被认为更有前景,因为划分结构化网格,是一个极其消耗体力和时间的过程。二维网格一般有,三角形、四边形,三维有四面体、六面体、棱柱、多面体等,对于同一物理问题,不同的网格类型,计算结果往往不同。但是,对于一般简单物理问题,在保证网格质量相差不大的情况下,这种误差很小,可以忽略不计。再来说说网格质量,一般造成误差很大的是网格质量,太差的网格质量会造成数值发散,有时直接导致计算失败,但对今天的求解器来说,只要质量不是太差,求解器对质量不好的网格鲁棒性还是很高的,依然能够完成求解。但是质量高的网格,总会带来更精确的结果,这是毋庸置疑的。网格质量又该如何保证呢?对于网格质量一般我们可以参考网格划分软件的各种指标(如正交比、纵横比、翘曲率等),但主要还是靠我们的经验。对于不同网格划分软件,网格生成技术也不同,针对不同的几何选择合适网格划分软件,可以大大提高我们的效率和减少网格对研究问题造成的影响。网格划分其实是一个系统性课题,很难一两句话说清楚,还需要多动手,多学习才能更好掌握其中奥秘,从而服务于我们要研究的问题。
第四,边界条件、初始条件。边界条件和初始条件是使我们控制方程有确定解的前提。也就是我们在操作软件过程点击的各种选项和输入的各种参数,从而建立起一个特定物理问题的求解模型(例如静力学分析中,不同地方加载的各种力和约束,以及像流体力学分析,进出口条件等),这要求我们没有打开软件之前就要知道怎么设置,通常这是由实际物理条件确定的,有些参数也需要我们从实验中获取。因此,若不能正确的设置边界条件就会导致错误结果,容易产生非物理解,有时甚至会导致求解中断。当然,这一点我们是可以完全避免的,正确认识我们的问题,做到还原实际边界条件,该获取的参数从实验获得。
第五,结果分析。当你完成仿真之后,会得到各种各样的结果(他们通过云图、折线图、等值线图等形式表现出来),如何正确且有效的利用这些结果,我们称之为后处理。是否能够通过仿真结果得出正确的结论,我称为分析误差,其实我认为这也是最难的。因为要通过这些结果得出对我们有指导意义的结论,对分析人员来说,不仅需要知道上面我提到的这些,还需要大量的知识储备和工程经验积累,也就是认知水平。例如在静力学分析中,在建立好模型之后,没有得出仿真结果之前,你就要对仿真结果有一个预判,哪些地方可能是应力大地方,是否会出现应力集中,应力大致分布是怎样,这对于我们得到仿真结果之后,对结果正确性进行判断非常重要,不然你自己都会对你得到的仿真结果存疑,那么仿真的意义又何在呢。其次,你要是没有必要的知识储备,还对仿真结果进行分析,那你就很难正确的解读结果,很容易得出错误的结论,这必然产生误差。对于这一点,只有分析人员不断学习专业知识,积累实际经验,勤于总结来提升我们的内功,这也对于提升我们的研究能力的帮助是具大的。
大家对于数值模拟的态度,容易存在两种极端,有人说数值模拟不可靠,全是假的,也有人笃信数值模拟的结果。但我想说的是,对于任何一个物理现象都一定存在一个物理真值,但想获得它,所消耗的人力、物力、财力是一般人负担不起的。数值模拟仅能作为一种研究手段,利用他得到的信息永远是有限的,优秀的研究,从来都是要通过实验分析和理论分析等研究手段进行相互补充的,这样我们的研究才有价值,有意义。