【小白的CFD之旅】26 何为收敛
小白最近对流体计算的收敛产生了困惑。以前在学习高等数学的时候,小白接触过了级数的收敛,由于当时贪玩,并未将其放在心上,因此大学结束了小白也只是记住有这么一个名词罢了。现如今在利用CFD的过程中,小白又一次碰到了“收敛”这一名词。小白找了很多的资料,然而资料中关于收敛的介绍,无一不是一大堆的数学公式,小白觉得头很疼。
“出来混,总是要还的。”小白的心情很复杂。
“流体计算为什么要收敛?收敛是什么意思?不收敛又有什么后果?如何判断是会否收敛?如果不收敛该采取何种措施使其收敛?”小白带着满腔的疑惑,找到了小牛师兄。
“师兄,最近在看资料的时候,老是碰到收敛这个名词,我想问一下,什么叫收敛呢?我最近看了很多的资料,都是用一堆数学公式来表达,看了很久概念也很模糊。”小白问道。
“也好,既然你注意到了收敛,今天我们就来聊一聊这个话题。”小牛师兄说。
计算机解决工程问题
“在谈收敛之前,我们还是先来谈一谈数值方法。关于数值计算,我想你也了解了不少。你说计算机解决这些工程问题到底是如何实现的呢?”小牛师兄问道。
“我看了一些资料。利用计算机来解决工程问题,其核心是利用计算机求解物理模型,或者说是利用计算机求解数学方程。”小白说。
“基本上是这样。我们知道描述现实世界物理现象的数学模型大部分都是微分方程,利用计算机并不能直接求解微分方程,计算机通常需要利用数学方法将这些微分方程转化为代数方程,通过求解代数方程获取原微分方程的解。那么问题来了,计算机是如何将微分方程转化为代数方程的呢?”小牛师兄说。
“转化的方法其实有很多种,比如我们常说的有限差分法、有限元法、有限体积法等都是用来干这种工作的。为了实现这种软件,引入了网格。采用网格的目的是将连续的空间和时间转化为离散的空间与时间,从而在每一个网格单元或网格节点上获得代数方程。所有网格上的代数方程集合在一起,就构成了整个计算域上的代数方程组,求解方程组就可以得到每一个网格单元或网格节点上的物理量。”
“当然,求解方程组得到的物理量还是离散的,为了得到节点之间或单元之间的物理量分布,采用了一种称之为插值的数学方法。利用插值可以得到近似连续的物理量分布。当计算网格或计算时间间隔足够小的时候,通过插值可以得到相当精确的计算结果。”小牛师兄说。
“因此我们可以说,利用计算机求解工程问题,实际上归根结底是利用计算机求解工程问题所涉及的物理模型转化而成的代数方程。那么问题来了,利用计算机求解代数方程是怎么实现的呢?”小牛师兄说。
“我记得线
性代数里面有讲到,可以采用矩阵求逆、高斯消去法、三角分解法、克拉默法则等。”小白说。
“嗯,这些方法的确可以用于计算机求解线性方程组,这些方法可以统称为直接求解法。然而在工程应用上是存在很大问题的。我们知道,为了得到比较精确的计算结果,网格数量常常非常多,直接后果就是最终的代数方程组包含的方程数量非常非常多。打个比方,如果网格数量是100万个,那么最终求解的代数方程组就有100万个方程,在利用直接法求解的过程中,需要采用100万维的矩阵进行存储,如此庞大的矩阵,消耗的内存是非常巨大的,而且其求逆计算或三角分解计算都是非常困难的,计算效率是极其低下的。因此,工程上求解这类数量庞大的方程组通常采用迭代法。”小牛师兄说。
“迭代法其实也有很多种,比较常见的如雅克比迭代、高斯-赛德尔迭代、超松弛迭代等等。关于迭代法求解线性方程组的具体方法,可以找一本数值计算的数看看。收敛就是迭代法求解线性方程组中的一个概念。”小牛师兄最后说。
关于迭代残差
为了更好的说明收敛的问题,这里先举个例子来说明什么叫残差。
比如说要求解下面的线性方程组:
可将(1)式改写为迭代计算的形式:
给定一个初值,如x(0)=(0,0,0)T,代入到式(2)中,可以得到x(1)=(2.5,3,3)T
反复迭代,
可以得到一系列x1,x2及x3的值。
迭代次数 | x1 | x2 | x3 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 2.5 | 3 | 3 |
2 | 2.875 | 2.363636364 | 1 |
3 | 3.136363636 | 2.045454545 | 0.971590909 |
4 | 3.024147727 | 1.947830579 | 0.920454545 |
5 | 3.000322831 | 1.983987603 | 1.000968492 |
6 | 2.993753228 | 1.999970652 | 1.003841684 |
7 | 2.999028573 | 2.002620797 | 1.003130723 |
8 | 3.000200118 | 2.000637857 | 0.999830514 |
9 | 3.000281568 | 1.999911822 | 0.999740477 |
10 | 3.000031814 | 1.999874019 | 0.999881261 |
11 | 2.999982442 | 1.999977637 | 1.000015588 |
12 | 2.999987717 | 2.000007802 | 1.00001437 |
13 | 2.999999333 | 2.000005773 | 1.000004191 |
14 | 3.000001117 | 2.000000623 | 0.99999889 |
15 | 3.000000511 | 1.999999493 | 0.999999286 |
16 | 2.999999988 | 1.999999749 | 0.999999871 |
17 | 2.999999938 | 1.999999992 | 1.000000068 |
18 | 2.99999998 | 2.000000029 | 1.000000033 |
19 | 3.000000003 | 2.00000001 | 1.000000003 |
20 | 3.000000003 | 1.999999999 | 0.999999996 |
可以看出,随着迭代计算的进行,计算结果越来越接近解析解[3,2,1]。
我们可以将某一物理量两次迭代计算值的差值称之为该物理量的迭代残差。比如上面的迭代计算x1的第一次迭代计算残差为2.5,第二次迭代计算后残差变为0.375。
当然上面提到的残差为绝对残差,在实际计算过程中,有时也常常采用相对残差,即物理量随迭代进行的变化量。可以看到,当残差非常小时,可以认为不用再往下计算了,或者说再往下算已经没有太大意义了。
CFD计算中的残差
在CFD计算中,每一个网格上都会存储众多物理量,因此每一个网格上的任一个物理量在计算迭代过程中都会存在一个残差,这意味着在一次迭代过程中,同一物理量在不同的计算网格上有不同的计算残差,而实际上我们在进行CFD计算时,每一个迭代步只对应着一个残差值。
CFD中残差分为几种:
最大残差:在一次迭代中,取所有网格中的残差值的最大值作为本次计算的残差。
平均残差:在一次迭代中,计算所有网格中的算术平均值作为本次迭代的残差
均方根残差:在一次计算,计算所有网格中残差值的均方根作为本次迭代计算的残差
在CFD计算中,常常采用均方根残差(RMS)作为残差值。
CFD中的收敛
所谓迭代收敛,简单来说,就是在迭代计算过程中,物理量趋于某一值的情况。CFD计算中判断收敛通常有三种方法。
收敛判断规则之一:残差达到某一设定标准时可以认为迭代计算达到收敛。
这条规则最简单,在实际工程应用中也最常用。通常设定某一标准,当迭代计算过程中残差值低于此标准时则认为计算收敛。这也是几乎所有CFD软件用于判断收敛的基本方法。
然而此规则在实际工程应用中常常无法使用,有些复杂的问题,无论你怎么计算,其残差也不会下降,甚至有时候残差会出现周期性震荡。
残差稳定在某一位置不下降的原因有很多,常见的原因包括:
- 计算区域中存在低质量的网格。低质量的网格会造成计算残差增大及残差震荡
- 边界条件设置有误。错误的边界条件或边界类型搭配都会导致计算残差震荡。
- 利用稳态求解器计算瞬态问题也会造成残差的震荡。
在残差无法达到设定标准的时候该如何判断收敛呢?需要注意的是,此时的收敛并非数学意义上的收敛了,而只是意味着我们可以停止计算。
收敛判断规则之二:进出口物理量通量达到平衡
最常用的是判断进出口质量是否相等,这实际上是判断连续性条件是否达到满足的。实际上还有很多,如计算域中包含化学反应时,判断进出口组分是否守恒;如计算域中包含多相流时,判断进出口各相质量是否守恒等。此规则是一种非常弱的规则,实际上只是收敛的一个必要条件而已。但是在第一条判断规则无法达到时,也常常采用此规则来判断。
收敛判断规则三:计算域中的物理量随迭代进行不再发生变化
这条规则在实际应用中也很常用,甚至比第二条规则更常用。在实际工程中,经常监测某些敏感位置的物理量,当随着迭代进行,监测的量不再发生变化时,基本可以认为计算达到收敛。
注意后两种方法只是在残差无法达到标准时才采用的判断方法,并不意味着计算就收敛了。
稳态及瞬态计算的收敛
在CFD迭代计算过程中,稳态残差曲线与瞬态残差曲线的形态有很大的不同。
如下图所示为稳态计算残差,每一个物理量都有一条残差曲线,当残差曲线低于设定的标准时认为计算收敛,当所有的残差曲线低于设定的标准时,计算结束。
下图所示为典型的瞬态计算残差。可以看到其形状特征与稳态残差曲线有很大的不同。瞬态计算要求在每一个计算时间步内达到收敛。若不能达到收敛,则迭代次数达到所设定的内迭代次数后进入下一个时间步,重新开启迭代计算。因此书台计算残差呈现出下图所示的锯齿状。
注意:瞬态计算要求每一个时间步内均达到收敛。
【小白的CFD之旅】26 何为收敛的更多相关文章
- 【小白的CFD之旅】小结及预告
这是小白系列的索引,后续会继续更新. 已更新的部分 01 引子02 江小白03 老蓝04 任务05 补充基础06 流体力学基础07 CFD常识08 CFD速成之道09 初识FLUENT10 敲门实例1 ...
- 【小白的CFD之旅】13 敲门实例【续3】
接上文[小白的CFD之旅]12 敲门实例[续2] 4 Results4.1 计算监测图形4.2 Graphics4.2.1 壁面温度分布4.2.2 创建截面4.2.3 显示截面物理量4.2.4 Pat ...
- 【小白的CFD之旅】12 敲门实例【续2】
接上文[小白的CFD之旅]敲门实例[续] 主要内容 3 Solution3.1 Solution Methods3.2 Solution Controls3.3 Monitors3.4 Report ...
- 《小白的CFD之旅》招募写手
<小白的CFD之旅>系列招募写手. 由于工作繁忙,<小白的CFD之旅>系列更新缓慢,现招募志愿者写手.这是一个分享平台,欢迎各位愿意分享自己CFD学习经历的朋友们. <小 ...
- 【小白的CFD之旅】11 敲门实例【续】
主要内容: 接上文[小白的CFD之旅]10 敲门实例 2.4 Materials设置2.5 Cell Zone Conditions2.6 Boundary Conditons2.7 Dynamic ...
- 【小白的CFD之旅】01 引子
小白的CFD之旅 写在前面 CFD是计算流体力学的英文简称,是计算机辅助工程(CAE)的主要分支,目前广泛应用与科学研究.工程设计中.这是一门综合了数学.计算机及流体力学的综合学科,涉及到众多的专业理 ...
- 【小白的CFD之旅】16 流程
那天听了小牛师兄关于CFD应用的四种境界的说法后,小白发现自己连第一种境界都算不上,自己对于CFD还只是停留在做了少数几个案例的基础上,可以说是对其一无所知.不过小白不是那种遇到挫折就退缩的人,他决定 ...
- 【小白的CFD之旅】05 补充基础
黄师姐是一个很干脆果敢的人,从她的日常装扮就能显露出来.卡帕运动装,白色运动鞋,马尾辫,这是小白对黄师姐的第一印象.“明天早上九点钟来实验室,我给你安排这阵子的任务.”黄师姐对小白说.说话语气和老蓝一 ...
- 【小白的CFD之旅】19 来自计算网格的困惑
经过一年的忙碌,终于又到了寒假时间,小白又满状态复活了. 这一年小白学了很多的课程,但是一年下来,小白却感觉脑袋里没留下什么东西,貌似什么东西都在考完试的那一刹那全还回给老师了.这一年学习之余,小白仍 ...
随机推荐
- 1388:Lake Counting
题目链接: NOI题库http://noi.openjudge.cn/ch0205/1388/ POJ 2386 http://poj.org/problem?id=2386 总时间限制: 1000m ...
- oracle11g-R2静默安装报错[INS-32013]解决方案
问题描述: oracle静默安装很强大...,参数搞不对.安装就扯dan了....这个报错搞了一个下午.终于搞定了如释负重.... 如果当初选择仅仅安装oracle软件就没多事情.想一步完成(数据库软 ...
- 在CLion项目中指定不同版本的链接库
在项目中, 需要使用到libevent-2.1.x, 但是Ubuntu16.04自带的libevent版本为2.0.5, 需要另外编译安装新版的libevent, 安装过程很简单 -stable.ta ...
- 转:CMake快速入门教程-实战
CMake快速入门教程:实战 收藏人:londonKu 2012-05-07 | 阅:10128 转:34 | 来源 | 分享 0. 前言一个多月 ...
- CSS中position:fixed的相关用法
CSS中的三大重点知识: 1.float,浮动 2.盒子模型 3.position绝对定位 今天主要写下position中fixed相关知识: position:static,relative,abs ...
- timerTask任务定时器
简单的一个定时器,异步任务 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void ru ...
- ASP.NET 对类进行XML序列化和反序列化
1 序列化方法 public void SerializeObject<T>(string Xmlname,T t) { XmlSerializer ser = new XmlSerial ...
- Linux init进程学习 转
http://oss.org.cn/kernel-book/ch13/13.6.1.htm init进程的建立 Linux将要建立的第一个进程是init进程,建立该进程是以调用kernel_threa ...
- 什么是分表和分区 MySql数据库分区和分表方法
1.为什么要分表和分区 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性 ...
- vim学习笔记(一)—— vim安装方法
一.完全卸载vim的方法 sudo apt-get remove --purge vim (--purge 是完全删除,会连配置文件一起删除) 二.Vim前言——————“世界上只有三种编辑器,EMA ...