偏微分方程和常微分方程的区别主要就是体现在待求解函数是一元函数还是多元函数。
多元函数存在对不同自变量的偏导数,因此这种带有多元函数偏导数的方程就是偏微分方程。而对于只有一个自变量的一元函数,由它的各阶导数组成的方程就是常微分方程。
描述带阻尼的简谐振动的方程
m d 2 x d t 2 + ν d x d t + k x = 0 m\frac{d^2x}{dt^2}+\nu\frac{dx}{dt}+kx=0 mdt2d2x+νdtdx+kx=0
就是常微分方程
拉普拉斯方程
∂ 2 φ ∂ x 2 + ∂ 2 φ ∂ y 2 = 0 \frac{\partial^2\varphi}{\partial{x^2}}+\frac{\partial^2\varphi}{\partial{y^2}}=0 ∂x2∂2φ+∂y2∂2φ=0
就是偏微分方程
计算流体力学通常求解的是偏微分方程。
计算流体力学控制方程基本就是欧拉方程和NS方程,其中NS方程去掉粘性项就可以得到欧拉方程。
原始的NS方程可以写成如下形式
∂ u ⃗ ∂ t + ∂ E ⃗ ∂ x + ∂ F ⃗ ∂ y + ∂ G ⃗ ∂ z = P ⃗ + ∂ E ⃗ ν ∂ x + ∂ F ⃗ ν ∂ y + ∂ G ⃗ ν ∂ z \frac {\partial \vec u}{\partial t}+\frac {\partial \vec E}{\partial x}+\frac {\partial \vec F}{\partial y}+\frac {\partial \vec G}{\partial z}=\vec P+\frac {\partial \vec E_\nu}{\partial x}+\frac {\partial \vec F_\nu}{\partial y}+\frac {\partial \vec G_\nu}{\partial z} ∂t∂u+∂x∂E+∂y∂F+∂z∂G=P+∂x∂Eν+∂y∂Fν+∂z∂Gν
u ⃗ = [ ρ ρ u ρ v ρ w e ] , E ⃗ = [ ρ u ρ u 2 + p ρ u v ρ u w ( e + p ) u ] , F ⃗ = [ ρ v ρ u v ρ v 2 + p ρ v w ( e + p ) v ] , G ⃗ = [ ρ w ρ u w ρ v w ρ w 2 + p ( e + p ) w ] \vec u=\left[ \begin{matrix} \rho\\ \rho u\\ \rho v\\ \rho w\\ e \end{matrix}\right],\vec E=\left[ \begin{matrix} \rho u\\ \rho u^2+p\\ \rho uv\\ \rho uw\\ (e+p)u \end{matrix}\right],\vec F=\left[ \begin{matrix} \rho v\\ \rho uv\\ \rho v^2+p\\ \rho vw\\ (e+p)v \end{matrix}\right],\vec G=\left[ \begin{matrix} \rho w\\ \rho uw\\ \rho vw\\ \rho w^2+p\\ (e+p)w \end{matrix}\right] u=⎣⎢⎢⎢⎢⎡ρρuρvρwe⎦⎥⎥⎥⎥⎤,E=⎣⎢⎢⎢⎢⎡ρuρu2+pρuvρuw(e+p)u⎦⎥⎥⎥⎥⎤,F=⎣⎢⎢⎢⎢⎡ρvρuvρv2+pρvw(e+p)v⎦⎥⎥⎥⎥⎤,G=⎣⎢⎢⎢⎢⎡ρwρuwρvwρw2+p(e+p)w⎦⎥⎥⎥⎥⎤
P ⃗ = [ 0 ρ f x ρ f y ρ f z ρ ( u f x + v f y + w f z ) ] , E ⃗ ν = [ 0 τ x x τ x y τ x z u τ x x + v τ x y + w τ x z + k ∂ T ∂ x ] , F ⃗ ν = [ 0 τ y x τ y y τ y z u τ y x + v τ y y + w τ y z + k ∂ T ∂ x ] , G ⃗ ν = [ 0 τ z x τ z y τ z z u τ z x + v τ z y + w τ z z + k ∂ T ∂ x ] \vec P=\left[ \begin{matrix} 0\\ \rho f_x\\ \rho f_y\\ \rho f_z\\ \rho(uf_x+vf_y+wf_z) \end{matrix}\right],\vec E_\nu=\left[ \begin{matrix} 0\\ \tau_{xx}\\ \tau_{xy}\\ \tau_{xz}\\ u\tau_{xx}+v\tau_{xy}+w\tau_{xz}+k\frac{\partial T}{\partial x} \end{matrix}\right],\vec F_\nu=\left[ \begin{matrix} 0\\ \tau_{yx}\\ \tau_{yy}\\ \tau_{yz}\\ u\tau_{yx}+v\tau_{yy}+w\tau_{yz}+k\frac{\partial T}{\partial x} \end{matrix}\right],\vec G_\nu=\left[ \begin{matrix} 0\\ \tau_{zx}\\ \tau_{zy}\\ \tau_{zz}\\ u\tau_{zx}+v\tau_{zy}+w\tau_{zz}+k\frac{\partial T}{\partial x} \end{matrix}\right] P=⎣⎢⎢⎢⎢⎡0ρfxρfyρfzρ(ufx+vfy+wfz)⎦⎥⎥⎥⎥⎤,Eν=⎣⎢⎢⎢⎢⎡0τxxτxyτxzuτxx+vτxy+wτxz+k∂x∂T⎦⎥⎥⎥⎥⎤,Fν=⎣⎢⎢⎢⎢⎡0τyxτyyτyzuτyx+vτyy+wτyz+k∂x∂T⎦⎥⎥⎥⎥⎤,Gν=⎣⎢⎢⎢⎢⎡0τzxτzyτzzuτzx+vτzy+wτzz+k∂x∂T⎦⎥⎥⎥⎥⎤
其中 p p p满足
p = ρ R T = ρ ( 1 − γ ) ( e − 1 2 ( u 2 + v 2 + w 2 ) ) p=\rho RT=\rho(1-\gamma)(e-\frac{1}{2}(u^2+v^2+w^2)) p=ρRT=ρ(1−γ)(e−21(u2+v2+w2))
这方程适用于可压缩的牛顿流体,是计算流体力学求解的基本方程。
从这个方程出发在低速条件下忽略压缩性( ρ = 1 \rho=1 ρ=1)可以得到不可压的NS方程。
对于不可压流体形式的NS方程由于 ρ \rho ρ是常数,方程的第一个分量将没有时间导数项,第一个分量将作为一个约束 ∂ u ∂ x + ∂ v ∂ y + ∂ w ∂ z = 0 \frac{\partial u}{\partial x}+\frac{\partial v}{\partial y}+\frac{\partial w}{\partial z}=0 ∂x∂u+∂y∂v+∂z∂w=0加入方程中。这就使得不可压流动和可压流动的计算产生了一些比较大的区别。
可以看到流体的控制方程十分复杂,因此通过控制方程直接研究数值格式的性质通常较为困难,于是我们使用一些简单的模型方程来对数值格式进行分析。最常用的模型方程主要是两个一个是一维对流方程 ∂ u ∂ t + ∂ u ∂ x = 0 \frac{\partial u}{\partial t}+\frac{\partial u}{\partial x}=0 ∂t∂u+∂x∂u=0和一维Burgers方程 ∂ u ∂ t + u ∂ u ∂ x = 0 \frac{\partial u}{\partial t}+u\frac{\partial u}{\partial x}=0 ∂t∂u+u∂x∂u=0这两个方程也是有解析解的,因此可以和数值解比对,从而了解数值格式的不同特性。另外,这两个方程都是没有粘性项的,在两个方程右端添加粘性项 ν ∂ 2 u ∂ x 2 \nu\frac{\partial^2u}{\partial x^2} ν∂x2∂2u,即可得到带粘性的方程。通常我们也会比较关心格式的耗散性能,因此求解不带粘性的方程时所有耗散效应都是由格式带来的,能更好的显示格式粘性的影响。
{ ∂ u ∂ t + ∂ u ∂ x = 0 u = u 0 ( x ) ( t = 0 ) \left\{ \begin{matrix} \frac{\partial u}{\partial t}+\frac{\partial u}{\partial x}=0\\ u=u_0(x)\quad(t=0) \end{matrix}\right. {∂t∂u+∂x∂u=0u=u0(x)(t=0)
其解析解为
u = u 0 ( x − t ) u=u_0(x-t) u=u0(x−t)
通过验证数值格式求解这个方程的结果,可以分析格式的稳定性和耗散性能。
{ ∂ u ∂ t + u ∂ u ∂ x = 0 u = u 0 ( x ) ( t = 0 ) \left\{ \begin{matrix} \frac{\partial u}{\partial t}+u\frac{\partial u}{\partial x}=0\\ u=u_0(x)\quad(t=0) \end{matrix}\right. {∂t∂u+u∂x∂u=0u=u0(x)(t=0)
其解析解为
u = u 0 ( x − u t ) u=u_0(x-ut) u=u0(x−ut)
这个方程是隐式方程,并且随着时间的推进可能会出现多值解的情况,这时需要利用能量守恒,在多值区域确定一个间断(激波)。利用这个方程可以很好的检验数值格式的激波捕捉能力。
偏微分方程的解可以写成若干通解加和的形式,但是并不是所有偏微分方程都能得到所有的通解,从而给出一个完整的解析表达式。因此我们很多时候是利用数值方法求解在特定情况下一个特解,而用于确定特解的条件就是定解条件。由于这个定解条件通常是在边界上给出的,因此叫做边界条件。对于非定常问题,在时间轴t=0这个边界上的边界条件又称为初始条件或者初值。
定解问题的解存在且唯一,并且当原方程或者边界条件发生微小改变时解的变化也是微小的(稳定)则称定解问题是适定的。大多有实际物理背景的偏微分方程在数学上仍然没有很透彻的研究,因此对于其解的适定性仍然没有足够的理论支持。但是对于做数值计算的人来讲,通常我们相信我们想要模拟的物理问题是确定的,并且现有的偏微分方程确实可以描述它,因此我们求解的前提都是当前求解的定解问题的真解是适定的。
在真解适定的前提下我们认为所有的误差和不稳定都来自于数值方法。因此我们要考虑数值方法是否稳定、是否能够收敛到真解。这就涉及到数值方法的相容性、收敛性和稳定性了。
如果数值近似方法在空间和时间步长上足够小时可以逼近原微分方程,那么我们就认为采用的数值方法和原微分方程是相容的。
如果数值近似方法在空间和时间步长上越小数值解就和真解越接近,那么我们就认为数值方法是收敛的。
由于数值方法得到的是真解的近似,因此必然存在误差,这个误差随着数值计算的不断推进累积最终会达到有限值而不是趋于无穷,则称数值方法是稳定的。
在流体力学中,流场不随时间变化则称流场是定常的,反之则是非定常的。从方程的角度来说,方程(包括边界条件)中含有对时间的偏导项则称问题是是非定常的;方程和边界都不含有时间偏导项则称问题是定常的。以拉普拉斯方程为例
∂ 2 φ ∂ x 2 + ∂ 2 φ ∂ y 2 = 0 \frac{\partial^2\varphi}{\partial{x^2}}+\frac{\partial^2\varphi}{\partial{y^2}}=0 ∂x2∂2φ+∂y2∂2φ=0
这个形式的拉普拉斯方程可以看作是求解的二维平面上 φ \varphi φ的分布,这个问题是一个定常问题。
∂ 2 u ∂ t 2 + ∂ 2 u ∂ x 2 = 0 \frac{\partial^2u}{\partial{t^2}}+\frac{\partial^2u}{\partial{x^2}}=0 ∂t2∂2u+∂x2∂2u=0
这个方程就变成了一维波动方程,尽管这个方程看起来只是上面的 φ \varphi φ换成了u,y换成了t但是我们不会再叫它拉普拉斯方程了。二者的意义已经完全不同了。它们的边界条件也不同。
定常问题描述的是在空间边界(值或导数)给定条件下待求解变量的空间分布。
非定常问题则是描述在给定初值(t=0)空间分布(值)和空间边界(值或导数)时待求解变量空间分布随时间的演化过程。
在流体力学中定常问题主要是势流问题和湍流的雷诺平均方程求解。势流问题本身就容易求解,而雷诺平均方程较为依赖封闭模型,因此其精度有限,对于高精度要求的计算不太适合。所以主要还是讨论非定常问题求解。
数值方法只能得到近似解,因此数值解必然有误差。从泰勒展开的角度看,用差分近似微分,被截断的高阶项根据阶数的奇偶分成两部分,奇数阶截断称为色散(弥散)误差,偶数阶截断项称为耗散误差。其中耗散误差是会使得数值解随着时间推进变长相比于真解在空间中分布更加均匀,表现为一种扩散作用。而色散误差则会使空间中不同波数的信号的传播速度与偏微分方程描述的真实速度产生差距,从而使得经过一定时间后不同波数的信息分离。这种现象和三棱镜分离不同频率的可见光非常像,因此叫色散误差。
对于如下方程
∂ u ∂ t + ∂ f ∂ x = 0 \frac{\partial u}{\partial t}+\frac{\partial f}{\partial x}=0 ∂t∂u+∂x∂f=0
我们称为守恒形式我们称f为通量,上式我们可以改写为
∂ u ∂ t + a ( u ) ∂ u ∂ x = 0 \frac{\partial u}{\partial t}+a(u)\frac{\partial u}{\partial x}=0 ∂t∂u+a(u)∂x∂u=0,其中 a ( u ) = d f d u a(u)=\frac{df}{du} a(u)=dudf
这个方程就称为非守恒形式。
对方程在比计算域更大的区域内积分
∫ L R ∂ u ∂ t + ∂ f ∂ x d x = 0 \int_{L}^{R}\frac{\partial u}{\partial t}+\frac{\partial f}{\partial x}dx=0 ∫LR∂t∂u+∂x∂fdx=0
得到
∂ ∂ t ∫ L R u d x + f R − f L = 0 \frac{\partial}{\partial t}\int_{L}^{R} udx+f_{R}-f_{L}=0 ∂t∂∫LRudx+fR−fL=0计算域外的值并非我们关心的,因此通量都取0,于是有 ∂ ∂ t ∫ L R u d x = 0 \frac{\partial}{\partial t}\int_{L}^{R} udx=0 ∂t∂∫LRudx=0,所以得到 ∫ L R u d x \int_{L}^{R} udx ∫LRudx不随时间变化,这称为守恒律,也是守恒型方程的由来。
对于非守恒形式并不能最终得到这个结果,其 ∂ ∂ t ∫ L R u d x \frac{\partial}{\partial t}\int_{L}^{R} udx ∂t∂∫LRudx是一个与 a ( u ) a(u) a(u)有关的值,尽管对于 a ( u ) = d f d u a(u)=\frac{df}{du} a(u)=dudf仍然能够得到守恒律,但是这一形式的方程而言,对任意 a ( u ) a(u) a(u)未必能保证其一定可积。在构造数值格式时由于方程中各变量的分布函数都是人为假定的,这时非守恒形式中 a ( u ) a(u) a(u)的数值分布是否可积,积分后是否和通量相容,对于格式是否稳定是否收敛就变得重要。
CFD中常用的方法:有限差分法、有限元法、谱方法等。
对于连续方程
L ( u ) = ∂ u ∂ t + ∂ f ( u ) ∂ x L(u)=\frac{\partial u}{\partial t}+\frac{\partial f(u)}{\partial x} L(u)=∂t∂u+∂x∂f(u)=0
以 u ^ = ∑ a i ( t ) φ i ( x ) \hat {u}=\sum{a_i(t)\varphi_i(x)} u^=∑ai(t)φi(x)去近似真解u必然有
L ( u ^ ) ≠ 0 L(\hat u) \neq{0} L(u^)=0
为了保证近似的 u ^ \hat u u^能够收敛到真解 u u u,我们需要做一些约束。
另外,通常情况下我们所说的各种方法虽然指的是整个计算的方法,但是在求解非定常问题时,我们是将时间项作为待定系数,先进行空间离散,构造空间离散格式。利用构造好的空间离散格式,就可以得到关于时间的常微分方程,然后利用R-K方法等直接进行时间推进。也就是说通常情况下时间推进的方法是固定的或者说相似的,而不同的CFD方法的差别主要体现在空间离散上。
在整个计算域内将 φ i \varphi_i φi直接取为正交基函数,如三角函数、切比雪夫多项式、勒让德多项式等,构造 u ^ \hat u u^。这时得到的 u ^ \hat u u^是在计算域内的连续函数,只是系数 a i ( t ) a_i(t) ai(t)待定。只需要将 u ^ \hat u u^代入原微分方程,便可得到一个关于t的常微分方程,根据初值和步长,利用R-K方法等即可求解出待定系数。
在前面的分析中我们有近似解 u ^ , L ( u ^ ) ≠ 0 \hat u,L(\hat u)\neq0 u^,L(u^)=0,但是我们想让近似解尽可能接近真解u,也就是说尽可能有 L ( u ^ ) = 0 L(\hat u)=0 L(u^)=0。那么我么考虑近似解 u ^ \hat u u^是无穷维空间中的真解在截断后的有限维空间中的投影,并且其投影在有限维空间中满足 L ( u ^ ) = 0 L(\hat u)=0 L(u^)=0。根据线性代数的知识我们知道,如果在n维空间中某向量 v ⃗ = 0 ⃗ \vec v=\vec 0 v=0,应有对于空间的任意基向量 b ⃗ i \vec b_i bi都有 v ⃗ ⋅ b ⃗ i = 0 {\vec v} \cdot {\vec b_i}=0 v⋅bi=0。相应的我们的 < L ( u ^ ) , ψ i > = 0
∫ − ∞ + ∞ ( ∂ u ∂ t + ∂ f ( u ) ∂ x ) ψ i d x = 0 \int_{-\infty}^{+\infty}(\frac{\partial u}{\partial t}+\frac{\partial f(u)}{\partial x})\psi_idx=0 ∫−∞+∞(∂t∂u+∂x∂f(u))ψidx=0
将积分号内部的两项分开得
∫ − ∞ + ∞ ∂ u ∂ t ψ i d x + ∫ − ∞ + ∞ ∂ f ( u ) ∂ x ψ i d x = 0 \int_{-\infty}^{+\infty}{\frac{\partial u}{\partial t}\psi_idx}+\int_{-\infty}^{+\infty}{\frac{\partial f(u)}{\partial x}}\psi_idx=0 ∫−∞+∞∂t∂uψidx+∫−∞+∞∂x∂f(u)ψidx=0
第一项中的 u u u展开,第二项利用分步积分先积一次得到。
∑ ∂ a i ( t ) ∂ t ∫ − ∞ + ∞ φ i ψ j d x − ∫ − ∞ + ∞ f ∂ ψ j ∂ x d x + f ψ j ∣ − ∞ + ∞ = 0 \sum\frac{\partial a_i(t)}{\partial t}\int_{-\infty}^{+\infty}{\varphi_i\psi_jdx}-\int_{-\infty}^{+\infty}{f \frac{\partial \psi_j}{\partial x}}dx+f\psi_j|_{-\infty}^{+\infty}=0 ∑∂t∂ai(t)∫−∞+∞φiψjdx−∫−∞+∞f∂x∂ψjdx+fψj∣−∞+∞=0
其中第二项中的f同样可以展开,第三项则由基函数和边界条件即可确定,从而得到一个关于 a i ( t ) a_i(t) ai(t)的常微分方程,于是可以推进求解 a i ( t ) a_i(t) ai(t)。如果考虑所有基函数均取为三角函数,这个方法等价于直接将初值做傅里叶展开,然后代入原微分方程推进求解。
通常我们会选择上述的 φ i 、 ψ i \varphi_i、\psi_i φi、ψi是同一组基,这样计算会简单一些,但是我们同样可以让二者不同。为了区别,我们称 ψ i \psi_i ψi为权函数, φ i \varphi_i φi为基函数。
伪谱法和谱方法的基本原理完全相同。在谱方法中我们实际上是利用真解 u u u的级数截断近似,从而推进计算,这一过程中的所有计算都是对连续函数进行的,其中有些连续积分是不容易计算的,比如通量的积分项。考虑谱方法是否能利用空间上离散的点上的值来代替连续函数计算。答案是当然可以,比如我们的快速傅里叶变换。通过在连续函数上等间距取样,我们可以很容易得到连续函数的三角级数的系数,而且可以快速的求导和积分。像这样在谱方法的基础上选取离散点上的值进行计算的方法就称为拟谱法或者伪谱法,也叫配置点法。
有限元法是一种和谱方法相似的方法,其本质上也是加权余量法。与谱方法不同的是,谱方法的基函数是在整个计算域内都有值且连续的函数。而有限元的一个基函数只在某一个单元内部有值,而在单元外则没有值,这时对于基函数的积分 ∫ φ i φ j d x \int\varphi_i\varphi_jdx ∫φiφjdx一项仅在基函数都属于同一个单元时才有值。从而使得计算可以分块进行,更加灵活。对于谱方法难以处理的复杂边界外形,有限元就更加合适,它可以通过把复杂边界计算域分割为规则子区域来计算。
这个方法不构造具体的 u ^ \hat u u^,而是利用一个新的算子 L h L_h Lh来代替 L L L。由于对于偏微分方程而言,很多时候我们的解 u u u是没有可以通过初等函数显式表达的结果的,这时我们没有办法得到其导数或者不定积分,这样就无法进行计算。如果利用差分代替空间的微分,可以把原本连续的导数通过离散的点上的值计算得到,这时计算便可以进行下去。并且随着网格加密差分点的间距减小,近似微分的误差也越小,最终收敛到真实的空间微分。这就是有限差分法的基本思想。通过这种方式还可以构造相应的有限体积法和通量差分法的格式。
一维方程 L ( u ) = ∂ u ∂ t + ∂ f ( u ) ∂ x = 0 L(u)=\frac{\partial u}{\partial t}+\frac{\partial f(u)}{\partial x}=0 L(u)=∂t∂u+∂x∂f(u)=0中我们考虑在直线上利用从左至右点A0、A、A1划分两个网格
A0------------A------------A1
网格点我们称为求解点,计算中其每一时间步结果用于描述真解 u u u。而我们在两个网格点的中间设置一个虚拟的边界点,我们记为l,r。
A0------l------A-------r-----A1
这两个点作为网格单元的边界,而求解点代表网格单元的内部信息。于是我们对方程在网格单元内积分。
∫ l r ∂ u ∂ t + ∂ f ( u ) ∂ x d x = 0 \int_l^r\frac{\partial u}{\partial t}+\frac{\partial f(u)}{\partial x}dx=0 ∫lr∂t∂u+∂x∂f(u)dx=0变形后得到
∂ ∂ t ∫ l r u d x + f ( u ) ∣ l r = 0 \frac{\partial }{\partial t}\int_l^r udx+f(u)|_l^r=0 ∂t∂∫lrudx+f(u)∣lr=0
以 u u u在A点的值近似代替网格内部的分布,得到
∂ u A ∂ t ( r − l ) + f ( u r ) − f ( u l ) = 0 \frac{\partial u_A}{\partial t}(r-l)+f(u_r)-f(u_l)=0 ∂t∂uA(r−l)+f(ur)−f(ul)=0
利用 u A 0 、 u A 、 u A 1 u_{A0}、u_{A}、u_{A1} uA0、uA、uA1插值得到 u r 、 u l u_r、u_l ur、ul即可得到一个 u A u_A uA的常微分方程,其它点以同样的方式处理于是便可推进求解。
同样考虑有限体积法相同的网格划分
A0------l------A-------r-----A1
这里我们称点l和r为通量点,而A0,A,A1为求解点,直接利用通量的一阶差分代替微分得到离散化方程
∂ u A ∂ t + f ( u l ) − f ( u r ) r − l = 0 \frac {\partial u_A}{\partial t}+\frac{f(u_l)-f(u_r)}{r-l}=0 ∂t∂uA+r−lf(ul)−f(ur)=0到这一步为止其实与上面的有限体积法并没有很大的区别,二者的主要差别在于通量点上通量值的求解。有限体积法在通量点上是通过相邻网格单元内求解点插值得到通量点上的 u u u然后代入通量表达式求出通量。而通量差分则忽略掉了通量点上 u u u的构造,转而直接构造 f l f_l fl和 f r f_r fr,对任意函数 g ( u i − j , . . . , u i − 1 , u i , u i + 1 , . . . , u i + j ) g(u_{i-j},...,u_{i-1},u_{i},u_{i+1},...,u_{i+j}) g(ui−j,...,ui−1,ui,ui+1,...,ui+j)( u i u_i ui表示第 i i i个求节点上的 u u u值),只要当网格单元足够密时, g g g可以收敛到真实的 f ( u i ) f(u_i) f(ui)即 g ( u i , . . . u i , . . . u i ) = f ( u i ) g(u_i,...u_i,...u_i)=f(u_i) g(ui,...ui,...ui)=f(ui),即可使用 g g g来代替通量点上通量的计算。从这个角度看有限体积法可以认为是一种特殊的通量差分方法。
通量差分和有限体积法保证了网格单元交界的通量点(面)两侧上的通量值连续,从而保证了守恒律。这在间断捕捉中很有意义,研究表明流场中存在间断时,数值通量的误差明显大于没有间断的情况,如果网格交界处的左右通量因为误差原因不能抵消,就会引起错误。因此这个算法在超音速可压缩流动中经常使用。而由于通量差分构造通量函数 g g g相对较为自由,因此不断有研究人员提出新的通量构造方式,并发展出来了一系列高阶算法。
考察线性的一维对流方程 ∂ u ∂ t + ∂ u ∂ x = 0 \frac{\partial u}{\partial t}+\frac{\partial u}{\partial x}=0 ∂t∂u+∂x∂u=0
可以在 t − x t-x t−x平面上寻找一条曲线,使得 u u u的值沿该曲线不发生改变。设曲线为 x = x ( t ) x=x(t) x=x(t),于是 u ( x , t ) u(x,t) u(x,t)可以写成 u ( x ( t ) , t ) u(x(t),t) u(x(t),t),可以得到
d u d t = ∂ u ∂ t + ∂ u ∂ x d x d t \frac{du}{dt}=\frac{\partial u}{\partial t}+\frac{\partial u}{\partial x}\frac{dx}{dt} dtdu=∂t∂u+∂x∂udtdx
代入原方程得
d u d t − ∂ u ∂ x d x d t + ∂ u ∂ x = 0 \frac{du}{dt}-\frac{\partial u}{\partial x}\frac{dx}{dt}+\frac{\partial u}{\partial x}=0 dtdu−∂x∂udtdx+∂x∂u=0
当 d x d t = 1 \frac{dx}{dt}=1 dtdx=1时得到
d u d t = 0 \frac{du}{dt}=0 dtdu=0
因此在 x = C + t x=C+t x=C+t这族曲线上, u u u的值不随时间变化。从任意初始位置 C C C出发,这表明初场任意一点的信息 u i u_i ui随着时间的推进,会逐渐向x轴的正方向运动,因此这个方程的信息是从x轴负方向传向正方向,不存在反向传播的情况。
从上面的方法介绍上可以看到,除了谱方法外,其它方法在构造数值格式时,我们需要利用不同网格单元的值更新单元上的值从而使得计算不断推进下去。当微分方程本身描述了信息的传播方向时,使用单元左侧(x轴负方向)还是右侧(x轴正方向)的值更新就变得重要起来。如果方向不对,计算结果必然是非物理的,通常对应的就是计算发散(例如信息从上游来,而每次都用下游值更新当前点的值,显然与真实的信息传播方向相反,得到的结果必然是错误的)。因此为了保证计算信息传播方向正确,于是就有了所谓迎风格式,即保证数值推进采用的值总是信息传播方向的上游点的值,这就叫迎风(风从上游刮来,用上游的值,就是迎着风去取值)。
CFL是Courant,Friedrichs,Lewy三个人的首字母。其定义如下:
对于线性的一维对流方程 ∂ u ∂ t + c ∂ u ∂ x = 0 \frac{\partial u}{\partial t}+c\frac{\partial u}{\partial x}=0 ∂t∂u+c∂x∂u=0利用有限差分法求解,空间步长 Δ x \Delta x Δx,时间步长 Δ t \Delta t Δt,CFL定义为 c Δ t Δ x c\frac{\Delta t}{\Delta x} cΔxΔt
这个参数用于表示有限差分格式的稳定性,当CFL数大于1时差分法不稳定,小于1时差分法稳定。利用冯诺依曼稳定性分析的方法,通过对离散格式做傅里叶-拉普拉斯变换,在谱空间里求得的谱系数的衰减条件。具体分析就不写了,主要说一下其物理或者说是数值意义。 Δ x Δ t \frac{\Delta x}{\Delta t} ΔtΔx表示了网格所能捕捉的信息传播的最快速度,如果微分方程描述的信息的传播速度快于网格捕捉到的速度,那么网格就无法分辨信息传播的完整过程,因此就会出现非物理的解(发散)。对于一维对流方程来讲其信息传播速度为 c c c,因此需要有 Δ x Δ t > c \frac{\Delta x}{\Delta t}>c ΔtΔx>c,对其变形即得到CFL条件。