经常有朋友问“仿真计算精度达到多少才算是合格的?如何提高计算精度呢?”,还有人问“仿真计算结果与实际结果偏差很大,到底是什么原因造成的?”,这些问题无非是计算者对自己的计算结果没有信心,迫切地想找个黑锅侠顶缸而已。今天来尬聊这个问题。
这问题看似简单,然而想要回答出来却并不容易。
首先说计算精度的问题,谈到计算精度,通常指的是计算结果与真实值之间进行比较。那么问题来了,真实值是多少?有人说实验值,那还是有问题啊,实验值是否等于真实值?如果将实验值当做真实值,那仿真条件是否做到了和实验条件完全一致?注意是完全一致,这是比较的前提。否则比较两个不确定的值是毫无意义的。这个比较对象如果无法明确的话,谈精度毫无意义。
再来谈计算偏差。其实就算构建了与实验条件完全一致的仿真模型,依然得不到与实验值完全一致的仿真计算结果。为何?下面来探讨数值计算误差问题。
数值仿真计算是将现实世界的复杂问题抽象成能够用数学模型表达的物理问题,进而利用计算机求解数学模型得到想要的物理量的值。这其实有两个阶段:
-
阶段1:对现实世界进行抽象建模,得到数学模型。由于现实世界及其复杂,在进行抽象建模的过程中,不可避免的会引入各种各样的假设。比如说我们常用的NS方程就是建立在连续介质假定的基础之上,这些人为假设是造成计算误差的重要来源,然而也更容易被忽略。这部分误差与仿真者的理论基础密切相关,与仿真者对自己问题的理解深度密切相关。所以造成这部分仿真误差的黑锅,仿真者还真赖不掉。
-
阶段2:从数学模型到数值模型。从现实世界抽象得到的数学模型是连续的模型,计算机并不擅长处理这类连续模型,所以在这一阶段,需要将连续的数学模型转化为计算机擅长处理的离散的代数方程。然而遗憾的是,要将连续的方程转化为离散的方程,一定会丢失一些信息,这些丢失的信息构成了误差的来源。还有计算过程中发生的各种稀奇古怪的事情(如计算发散、浮点溢出等)通常都是这一阶段搞出来的毛病。这阶段的黑锅该谁来背呢?如果你使用商业软件,那么软件公司来背;如果你自己编程序计算,那么黑锅你来背。
-
阶段3:从数值模型到结果数据。当数值模型确定完毕后,下一步应该是用计算机将模型计算出来。要将数值模型求解出来也不太容易,因为在阶段2将连续模型转化为离散模型的过程中,是做了微元假设的,意思是空间也好时间也罢,间距越小离散模型越接近连续模型,最好是间距无限趋近与零。但是计算机不干了,内存就这么大,CPU计算能力就这样,你还能小到哪里去?间距太小干不动。所以没办法,量力而为,不得不用大的离散间距(网格尺寸和时间步长)来进行求解。这用大的尺度来求解,自然分辨率就低了,误差自然就来了。这部分的黑锅,你可以推给计算机,谁让计算机不给力呢。还有部分黑锅,比如计算机中每一个内存单元存储的浮点数是有位数上限的,比如8位、16位等等,那多余的有效数字怎么办?计算机可不讲情面,它会直接把后面存不下的有效数字统统丢掉,这也会造成一些误差,这黑锅也可以计算机来背。
-
阶段4:实验验证。真正扯皮的时候来了,现在工程应用常常要对仿真结果进行实验验证。如果不幸两者的数据对不上,就涉及到扯皮的事情了。仿真的人说实验测量有问题,实验的人说仿真计算有偏差,这时候黑锅该谁来背?你们使劲吵,黑锅领导来背。仿真和实验数据完全吻合?不存在的,你们肯定作弊了的。
事情到这里就很尴尬了,仿真误差到底怎么界定?多少才靠谱儿呢?事实上更好的做法是用实验来验证仿真计算趋势,用优化式的仿真来进行工程应用,只使用仿真计算得到的结果的相对值而非绝对值。
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册