额,双曲守恒律

双曲守恒律的ENO格式和WENO格式

问题描述

考虑下述Burgers方程的初值问题

ut+(u2/2)x=0u(x,0)=u0(x)=sin(πx)periodic  B.C.  for  x1x1,t>0 { u t + ( u 2 / 2 ) x = 0 − 1 ≤ x ≤ 1 , t > 0 u ( x , 0 ) = u 0 ( x ) = sin ( π x ) p e r i o d i c     B . C .     f o r     x

分别使用有限体积法4阶ENO格式,有限体积法3阶和5阶WENO方法求解。时间方向用三阶TVD
Runge-Kutta方法。研究格式在解光滑情况下和有间断的情况下的数值精度并作图。

关键算法和格式描述

精确解

为了计算数值精度,必须要有精确解。对于精确解的产生,我们采用两种方式。

当时间比较短,解还比较光滑时,特征线交错情况比较简单时,我们使用特征线方法求解精确解。
对于上述黎曼问题的精确解,我们用特征线方法来求解精确值。过某个初值点 (x0,0) ( x 0 , 0 ) 的特征线是一根直线,它的斜率为 u0(x) u 0 ( x ) ,那么给定一点 (x1,t1) ( x 1 , t 1 ) ,我们知道它满足,

x1x0t1=u0(x0)=sin(πx0). x 1 − x 0 t 1 = u 0 ( x 0 ) = sin ( π x 0 ) .

求得 x0 x 0 后,我们可以得到在 (x1,t1) ( x 1 , t 1 ) 点处的值为 u0(x0) u 0 ( x 0 )
需要注意的是,matlab的solve函数主要是用于多项式求根,对于非线性方程来说,也可以求,但是往往只给出一个最小解。在matlab里面solve命令主要是用来求解代数方程(即多项式)的解,但是也不是说其它方程一个也不能解,不过求解非代数方程的能力相当有限,通常只能给出很特殊的实数解。

第二种方法,精确解采用5阶WENO格式的小步长逼近作为相对近似精确解,这也只是相对而言的精确解。将精确解保存为mat 格式调用(不同步长取对应点)。

5阶WENO格式

空间上采用五阶WENO格式,时间上采用三阶Runge Kutta格式,具体操作描述如下:

空间离散

将空间定义域等分,取每个等分区间上中点的初值作为该区间的初值(不是计算等分节点的值)。那么,N等分就有N个值,对这N个值编号,不妨记为 ui u i ,使用WENO格式计算下一时间层的值。

Lax-Friedrichs通量分裂

使用Lax-Friedrichs,进行通量分裂,如下:

f^j+1/2=12(f(uj)+αuj)+12(f(uj+1)αuj+1) f ^ j + 1 / 2 = 1 2 ( f ( u j ) + α u j ) + 1 2 ( f ( u j + 1 ) − α u j + 1 )

其中, α=max(|f(ui)|) α = max ( | f ′ ( u i ) | ) ,这个值随着 ui u i 的变化而变化。定义左值 u+j+1/2=12(f(uj)+αuj) u j + 1 / 2 + = 1 2 ( f ( u j ) + α u j ) ,定义右值 uj+1/2=12(f(uj+1)αuj+1) u j + 1 / 2 − = 1 2 ( f ( u j + 1 ) − α u j + 1 ) ,下面要做的就是对这些左右值进行重构更新,再合成通量,求得空间算子。

原函数方法重构左值右值

下面以右值 uj+1/2 u j + 1 / 2 − 的重构更新为例(左值的重构与右值呈镜像对称(系数等),不再详述),来说明重构过程。为描述方便,用 vi v i 来表示右值集合 uj+1/2 u j + 1 / 2 −

  • 选择不同的模板,计算不同模板下的重构值,采用如图所示的模板,计算得的对应模板的三个重构值如下:

    v(0)iv(1)iv(2)i===(2vi27vi1+11vi)/6(vi1+5vi+2vi+1)/6(2vi+5vi+1vi+2)/6 v i ( 0 ) = ( 2 v i − 2 − 7 v i − 1 + 11 v i ) / 6 v i ( 1 ) = ( − v i − 1 + 5 v i + 2 v i + 1 ) / 6 v i ( 2 ) = ( 2 v i + 5 v i + 1 − v i + 2 ) / 6

    这里写图片描述

  • 计算三个模板得到的重构值对应的权重,逆向罗列公式如下( k=3 k = 3 ):

    wrαr==αrr=0k1αrdr(106+βr)2 w r = α r ∑ r = 0 k − 1 α r α r = d r ( 10 − 6 + β r ) 2

    对于五阶WENO格式,有: d0=0.3,d1=0.6,d2=0.1 d 0 = 0.3 , d 1 = 0.6 , d 2 = 0.1 ,且 βr β r 可表达为:

    β0β1β2===13(vi2vi1+vi2)212+(3vi4vi1+vi2)24(vi1vi+1)24+13(vi12vi+vi+1)21213(vi2vi+1+vi+2)212+(3vi4vi+1+vi+2)24 β 0 = 13 ( v i − 2 v i − 1 + v i − 2 ) 2 12 + ( 3 v i − 4 v i − 1 + v i − 2 ) 2 4 β 1 = ( v i − 1 − v i + 1 ) 2 4 + 13 ( v i − 1 − 2 v i + v i + 1 ) 2 12 β 2 = 13 ( v i − 2 v i + 1 + v i + 2 ) 2 12 + ( 3 v i − 4 v i + 1 + v i + 2 ) 2 4

  • 更新最后的左值为各个值的加权平均:即 u+i+1/2=v^i=r=0k1wrv(r)i u i + 1 / 2 + = v ^ i = ∑ r = 0 k − 1 w r v i ( r )

  • 同相同的方法重构左值。原来从左到右计算的,重构左值时从右到左。

空间算子和时间三阶Runge Kutta方法

通过如上方法,计算得到更新后的左值和右值,取左值和右值的和为通量函数近似,即:

fj+1/2=u+j+1/2+uj+1/2. f j + 1 / 2 = u j + 1 / 2 + + u j + 1 / 2 − .

那么,可以得到空间离散算子的作用结果,即:

L(ui)=df/dx=(fi+1/2fi1/2)/x L ( u i ) = − d f / d x = − ( f i + 1 / 2 − f i − 1 / 2 ) / △ x

有了空间离散算子,我们就在时间上使用三阶Runge-Kutta方法,求解下一时间层的值。

这里写图片描述

3阶WENO格式

三阶的WENO格式(k=2)和五阶的WENO格式(k=3)操作方法是类似的,所不同的是,在重构通量左右值时所用的模板和系数是不同的。一般来说,对于 2k1 2 k − 1 阶的WENO格式,所用的模板(具有对称性),共有 k k 个:

Sr(i)={xir,,xir+k1},r=0,,k1.

其上重构值的系数( u(r)i+1/2=j=0k1Crjuir+j u i + 1 / 2 ( r ) = ∑ j = 0 k − 1 C r j u i − r + j ),有人总结成了如下表格(右值)。

这里写图片描述

且对于k比较小时, dr,βr d r , β r 有如下结果:

这里写图片描述

这里写图片描述

4阶ENO格式

ENO格式和WENO格式的过程大部分是类似的,不同的是,ENO格式左右值的重构,不需要计算全部模板下的重构值后取加权平均,而只要选取其中的某一个模板作为计算左右值重构即可,选取的准则为使差商最小。具体的算法描述如下。

这里写图片描述

模板的重构系数 Crj C r j 同前表格(k = 4)。

计算结果展示和讨论

三种格式对于光滑解数值精度

五阶WENO格式

对于一个空间k阶格式,时间上是三阶龙格库塔格式,我们得保证, (Δt)3(Δx)k ( Δ t ) 3 ( Δ x ) k 是一个常值,或者让时间因素相比于空间因素,对结果造成的很小。换言之,若固定了空间步长,我们可以这样选取时间步长:

Δt=Constant(Δx)k/3. Δ t = Constant ∗ ( Δ x ) k / 3 .

这里,Constant是一个常数,它的选取应该使得时间空间步长满足CFL条件: Δt/Δxα=CFL,α=max|f(u)| Δ t / Δ x ∗ α = C F L , α = max | f ′ ( u ) |

选取终止时间为0.1,解依然是连续的。此时,空间上使用五阶WENO格式,时间上采用三阶Runge
Kutta格式,进行了数值实验,最后得到了如下结果,时间关系,程序上的相关的参数设定和细节处理就不再详述了,见程序。得到的结果如下表:
这里写图片描述

三阶WENO格式

仿照五阶WENO格式,依然选择终止时间为0.1,得到的结果如下表:
这里写图片描述

收敛阶好像不是太稳定,我也不知道为什么呀。

四阶ENO格式

四阶ENO格式,在解连续的情况下,得到的结果如下表:有些小问题。为了减小时间方向带来的影响,设置Courant系数尽量小。
这里写图片描述

三种格式对于间断解的数值精度

从数值格式中,并没有看到解随着时间的推移变得间断(lusongno1.cn),所以这个间断是什么意思,没明白。下面我假设在t足够大时,如 t=3 t = 3 ,解开始断开。我们来研究解在有间断的情况下的数值精度。这里的真解采用WENO5格式在空间步长为2000的情况下的解。

五阶WENO格式

这里写图片描述

三阶WENO格式

这里写图片描述

四阶ENO格式

不知道是否精确解求解有问题,以上三种格式在解间断时只能达到一阶精度。
这里写图片描述

程序源码和其他话

源代码见附件,使用的语言为MAMTLAB2014a(盗版),Windows 10环境。

一些小体会:

  • Matlab巧用shiftcirt函数,来处理周期边界问题是特别棒的事情。

  • 知道如何进行右值重构后,再进行计算左值重构,我们没必要考虑系数的镜像对称关系。一个简单的做法是,将左值反向排列,然后同样用计算右值的程序计算一遍,得到的结果最后再转个方向即可。

  • CFL迎风条件: dt/dx * alpha = CFL

  • 对于均匀网格,使用重构系数表 Crj C r j ,重构值直接用已有值使用系数表线性表出,而省去了插值的过程,提高计算速度,代价是泛化能力差。也就是说k变化时,你得重新写一遍系数。

  • 初值点的选取,选的不是等分节点处,而是选取单元中点处。使用单元中点值表示这个单元的值。

  • 对这些格式,在有些步长下能得到相应的收敛阶,而在有的步长下不能。应该考虑时间步长和空间步长谁是主导因素,主导因素是否会发生转移。

参考文献
Shu C W. Numerical methods for hyperbolic conservation
laws[J]. Lecture notes (AM257), 2006.
Shu C W. Essentially non-oscillatory and weighted essentially non-oscillatory schemes for hyperbolic conservation laws[M]//Advanced numerical approximation of nonlinear hyperbolic equations. Springer Berlin Heidelberg, 1998:
325-432.
Jiang G S, Shu C W. Efficient implementation of weighted ENO
schemes[J]. Journal of computational physics, 1996, 126(1): 202-228.


评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆嵩

有打赏才有动力,你懂的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值