matlab和Python常微分方程的非标准有限差分法

标准有限差分方案

遇到标准有限差分法的主要问题是数值不稳定性。如果存在有限差分方程的解与微分方程的任何可能解都不对应,则称微分方程的离散模型具有数值不稳定性。 Mickens指出了一些数值不稳定原因。这些原因是:

  1. 用不同阶数的离散导数表示微分方程中的导数。 这种情况的一个例子是在表示逻辑模型时

    d P d t = P ( 1 − P ) , P ( 0 ) = P 0 \frac{\boldsymbol{dP}}{\boldsymbol{dt}}=\boldsymbol{P}\left( 1-\boldsymbol{P} \right) ,\boldsymbol{P}\left( 0 \right) =\boldsymbol{P}_0 dtdP=P(1P),P(0)=P0

    使用中心差分方案:

    P j + 1 − P j − 1 2 h = P j ( 1 − P j ) ⇒ P j + 1 = P j − 1 + 2 h P j ( 1 − P j ) \frac{\boldsymbol{P}^{\boldsymbol{j}+1}-\boldsymbol{P}^{\boldsymbol{j}-1}}{2\boldsymbol{h}}=\boldsymbol{P}^{\boldsymbol{j}}\left( 1-\boldsymbol{P}^{\boldsymbol{j}} \right) \Rightarrow \boldsymbol{P}^{\boldsymbol{j}+1}=\boldsymbol{P}^{\boldsymbol{j}-1}+2\boldsymbol{hP}^{\boldsymbol{j}}\left( 1-\boldsymbol{P}^{\boldsymbol{j}} \right) 2hPj+1Pj1=Pj(1Pj)Pj+1=Pj1+2hPj(1Pj)

    下图1显示了使用中心,前向和后向差分方案的逻辑模型 P ˙ ( t ) = P ( t ) ( 1 − P ( t ) ) , P ( 0 ) = 0.5 \boldsymbol{\dot{P}}\left( \boldsymbol{t} \right) =\boldsymbol{P}\left( \boldsymbol{t} \right) \left( 1-\boldsymbol{P}\left( \boldsymbol{t} \right) \right) ,\boldsymbol{P}\left( 0 \right) =0.5 P˙(t)=P(t)(1P(t)),P(0)=0.5的解。 该图显示,通过前向和后向差分方案获得的解与原始模型具有相同的行为,而中心有限差分方案与精确解无关。

    图1

  2. 使用标准分母函数 h \boldsymbol{h} h。 在点 t j \boldsymbol{t}_{\boldsymbol{j}} tj的一阶和二阶导数近似为:

    d u d t ( t i ) ≈ u ( t i + 1 ) − u ( t i ) h 或 d u d t ( t i ) ≈ u ( t i ) − u ( t i − 1 ) h d 2 u d t 2 ( t i ) ≈ u ( t i + 1 ) − 2 u ( t i ) + u ( t i + 1 ) h 2 \frac{\boldsymbol{du}}{\boldsymbol{dt}}\left( \boldsymbol{t}_{\boldsymbol{i}} \right) \approx \frac{\boldsymbol{u}\left( \boldsymbol{t}_{\boldsymbol{i}+1} \right) -\boldsymbol{u}\left( \boldsymbol{t}_{\boldsymbol{i}} \right)}{\boldsymbol{h}}或\frac{\boldsymbol{du}}{\boldsymbol{dt}}\left( \boldsymbol{t}_{\boldsymbol{i}} \right) \approx \frac{\boldsymbol{u}\left( \boldsymbol{t}_{\boldsymbol{i}} \right) -\boldsymbol{u}\left( \boldsymbol{t}_{\boldsymbol{i}-1} \right)}{\boldsymbol{h}}\\\frac{\boldsymbol{d}^2\boldsymbol{u}}{\boldsymbol{dt}^2}\left( \boldsymbol{t}_{\boldsymbol{i}} \right) \approx \frac{\boldsymbol{u}\left( \boldsymbol{t}_{\boldsymbol{i}+1} \right) -2\boldsymbol{u}\left( \boldsymbol{t}_{\boldsymbol{i}} \right) +\boldsymbol{u}\left( \boldsymbol{t}_{\boldsymbol{i}+1} \right)}{\boldsymbol{h}^2} dtdu(ti)hu(ti+1)u(ti)dtdu(ti)hu(ti)u(ti1)dt2d2u(ti)h2u(ti+1)2u(ti)+u(ti+1)

    在许多情况下,经典分母函数的选择不合适,并且可能导致数值不稳定。 请考虑下面的示例,一阶IVP:

    d y ( t ) d t = A y ( t ) + t , y ( 0 ) = 0 \frac{\boldsymbol{dy}\left( \boldsymbol{t} \right)}{\boldsymbol{dt}}=\boldsymbol{Ay}\left( \boldsymbol{t} \right) +\boldsymbol{t},\boldsymbol{y}\left( 0 \right) =0 dtdy(t)=Ay(t)+t,y(0)=0

    这个IVP确切解是

    y ( t ) = 1 A 2 ( e A t − ( A t + 1 ) ) \boldsymbol{y}\left( \boldsymbol{t} \right) =\frac{1}{\boldsymbol{A}^2}\left( \boldsymbol{e}^{\boldsymbol{At}}-\left( \boldsymbol{At}+1 \right) \right) y(t)=A21(eAt(At+1))

    间隔 [ 0 , 1 ] \left[ 0,1 \right] [0,1] 将被划分为1000个子间隔,按照点 0 = t 0 < t 1 < ⋯ < t 1000 = 1 0=\boldsymbol{t}_0<\boldsymbol{t}_1<\cdots <\boldsymbol{t}_{1000}=1 0=t0<t1<<t1000=1,每个子间隔的长度 h = 0.001 \boldsymbol{h}=0.001 h=0.001。 前向欧拉方法,隐式梯形法则和经典四阶龙格库塔法将用于在离散点处针对参数A的不同值解决给定问题。从理论上讲,欧拉方法的误差应为 O ( h ) = O ( 1 0 − 3 ) \mathcal{O}\left( \boldsymbol{h} \right) =\mathcal{O}\left( 10^{-3} \right) O(h)=O(103) ,隐式梯形规则的误差应为 O ( h 2 ) = O ( 1 0 − 6 ) \mathcal{O}\left( \boldsymbol{h}^2 \right) =\mathcal{O}\left( 10^{-6} \right) O(h2)=O(106) ,而四阶龙格库塔法误差应为 O ( h 4 ) = O ( 1 0 − 12 ) \mathcal{O}\left( \boldsymbol{h}^4 \right) =\mathcal{O}\left( 10^{-12} \right) O(h4)=O(1012)

    分别计算三种方法的不同A值误差的Python代码是:

    运行代码可获得以下结果:

    runfile(/media/WindowsData1/PyFiles/
    numinstduetotrivstepfun.py’,
    wdir=/media/WindowsData1/PyFiles’)
    --------------------------------------------------------
    A Euler Error Imp. Trapz Err RK4 Error
    --------------------------------------------------------
    1 1.35789622e-03 3.56321584e-07 2.30926389e-14
    3 1.00002555e-02 5.19127795e-06 4.50417481e-12
    5 7.35013397e-02 4.52531609e-05 1.53952406e-10
    7 5.39170234e-01 3.52721966e-04 3.11633030e-09
    9 3.94740396e+00 2.65343074e-03 4.88584107e-08
    11 2.88444591e+01 1.97153658e-02 6.58044428e-07
    13 2.10373074e+02 1.45836606e-01 8.01259330e-06
    15 1.53146894e+03 1.07702617e+00 9.07992144e-05
    17 1.11283670e+04 7.94936660e+00 9.75035611e-04
    19 8.07191089e+04 5.86610000e+01 1.00415309e-02
    21 5.84468245e+05 4.32849955e+02 1.00014394e-01
    23 4.22478467e+06 3.19388027e+03 9.69289817e-01
    25 3.04879507e+07 2.35668600e+04 9.18238944e+00
    27 2.19661624e+08 1.73896191e+05 8.53281952e+01
    29 1.58017839e+09 1.28317310e+06 7.79939406e+02
    --------------------------------------------------------
    

    可以看出,尽管步长 h \boldsymbol{h} h保持恒定,但是三种方法的误差都随着 A \boldsymbol{A} A的增加而增加。

  3. 使用非线性项的局部逼近:标准有限差分方案使用诸如 x j 2 或 x j + 1 2 \boldsymbol{x}^{\boldsymbol{j}^2}或\boldsymbol{x}^{\boldsymbol{j}+1^2} xj2xj+12的局部逼近来表示诸如 x 2 ( t j ) \boldsymbol{x}^2\left( \boldsymbol{t}_{\boldsymbol{j}} \right) x2(tj) 的非线性项。 Mickens表明,非线性项的这种局部逼近可能导致数值不稳定。 Mickens给出的一个例子是指数衰减模型的解:

    d P ( t ) d t = − P ( t ) , P ( 0 ) = 0.5 \frac{\boldsymbol{dP}\left( \boldsymbol{t} \right)}{\boldsymbol{dt}}=-\boldsymbol{P}\left( \boldsymbol{t} \right) ,\boldsymbol{P}\left( 0 \right) =0.5 dtdP(t)=P(t),P(0)=0.5

    指数衰减模型的前向欧拉离散化由下式给出:

    P n + 1 = P n − h P n = ( 1.0 − h ) P n = ( 1 − h ) n P 0 \boldsymbol{P}^{\boldsymbol{n}+1}=\boldsymbol{P}^{\boldsymbol{n}}-\boldsymbol{hP}^{\boldsymbol{n}}=\left( 1.0-\boldsymbol{h} \right) \boldsymbol{P}^{\boldsymbol{n}}=\left( 1-\boldsymbol{h} \right) ^{\boldsymbol{n}}\boldsymbol{P}^0 Pn+1=PnhPn=(1.0h)Pn=(1h)nP0

    对于步长 h h h的不同值,所得结果如下图2所示。

    图2

    为指数衰减模型获得的解包括具有渐近稳定,周期性和不稳定动力学的解曲线,其中周期性和不稳定解不对应于指数衰减模型的任何真实解。 仅人口图衰减为零的第一个图就与微分方程的真实解一致。

    另一个例子是使用亨恩的方法来求解逻辑模型,

    d x ( t ) d t = x ( t ) ( 1 − x ( t ) ) , x ( 0 ) = 0.5 \frac{\boldsymbol{dx}\left( \boldsymbol{t} \right)}{\boldsymbol{dt}}=\boldsymbol{x}\left( \boldsymbol{t} \right) \left( 1-\boldsymbol{x}\left( \boldsymbol{t} \right) \right) ,\boldsymbol{x}\left( 0 \right) =0.5 dtdx(t)=x(t)(1x(t)),x(0)=0.5

    Python代码如下,

    下图3显示了针对亨恩的方法对 h \boldsymbol{h} h的不同值进行逻辑模型的求解。

    图3

    从上图3可以看出,与步长 h \boldsymbol{h} h的某些值相对应,逻辑模型的数值解可能具有周期性和混沌行为,这与模型的任何解都不对应。

非标准有限差分格式的构造规则

与标准有限差分方案一起设计的数值稳定性表明,由于标准模型中的某些固有误差,检索真实信息变得非常昂贵,导致这些标准方案无法准确显示。

考虑到导致标准有限差分方案中数值不稳定的原因,Micken为这种数值方案的设计建立了四个非标准构造规则。 这些规则为:

  1. 因为使用与微分方程的阶不同的离散导数会导致数值不稳定,所以离散模型的阶应与微分方程的阶相同。 在此规则下,中心有限差分方案不能用作一阶微分方程离散模型中一阶导数的近似值。 可以使用前向或后向差分方案。

  2. 非标准分母函数必须用于连续导数的离散表示。 d y d t \frac{\boldsymbol{dy}}{\boldsymbol{dt}} dtdy t = t j \boldsymbol{t}=\boldsymbol{t}_{\boldsymbol{j}} t=tj的非标准离散表示形式为:

    d y d t ≈ y ( t j + 1 ) − ψ ( λ , h ) y ( t j ) ϕ ( λ , h ) \frac{\boldsymbol{dy}}{\boldsymbol{dt}}\approx \frac{\boldsymbol{y}\left( \boldsymbol{t}_{\boldsymbol{j}+1} \right) -\boldsymbol{\psi }\left( \boldsymbol{\lambda },\boldsymbol{h} \right) \boldsymbol{y}\left( \boldsymbol{t}_{\boldsymbol{j}} \right)}{\boldsymbol{\phi }\left( \boldsymbol{\lambda },\boldsymbol{h} \right)} dtdyϕ(λ,h)y(tj+1)ψ(λ,h)y(tj)

    其中 λ \boldsymbol{\lambda } λ是模型参数的向量, h = t j + 1 − t j \boldsymbol{h}=\boldsymbol{t}_{\boldsymbol{j}+1}-\boldsymbol{t}_{\boldsymbol{j}} h=tj+1tj。 分子和分母函数 ψ ( λ , h ) \boldsymbol{\psi }\left( \boldsymbol{\lambda },\boldsymbol{h} \right) ψ(λ,h) ϕ ( λ , h ) \boldsymbol{\phi }\left( \boldsymbol{\lambda },\boldsymbol{h} \right) ϕ(λ,h) 应满足以下特性:

    当 h → 0 , ψ ( λ , h ) → 1 与 ϕ ( λ , h ) → h 当\boldsymbol{h}\rightarrow 0,\boldsymbol{\psi }\left( \boldsymbol{\lambda },\boldsymbol{h} \right) \rightarrow 1与\boldsymbol{\phi }\left( \boldsymbol{\lambda },\boldsymbol{h} \right) \rightarrow \boldsymbol{h} h0,ψ(λ,h)1ϕ(λ,h)h

    举例说明使用非平凡分母如何导致数值不稳定,请考虑指数衰减模型

    d P ( t ) d t = − P ( t ) , P ( 0 ) = 0.5 \frac{\boldsymbol{dP}\left( \boldsymbol{t} \right)}{\boldsymbol{dt}}=-\boldsymbol{P}\left( \boldsymbol{t} \right) ,\boldsymbol{P}\left( 0 \right) =0.5 dtdP(t)=P(t),P(0)=0.5

    在欧拉方法中,假设平凡的分母函数 h \boldsymbol{h} h被分母函数代替

    ϕ ( h ) = 1 − e − h h \boldsymbol{\phi }\left( \boldsymbol{h} \right) =\frac{1-\boldsymbol{e}^{-\boldsymbol{h}}}{\boldsymbol{h}} ϕ(h)=h1eh

    因此,所得离散模型为

    P j + 1 = ( 1 − ϕ ) P j , P 0 = 0.5 \boldsymbol{P}^{\boldsymbol{j}+1}=\left( 1-\boldsymbol{\phi } \right) \boldsymbol{P}^{\boldsymbol{j}},\boldsymbol{P}^0=0.5 Pj+1=(1ϕ)Pj,P0=0.5

    Python代码expdecnsden.py用于求解步长 h \boldsymbol{h} h的不同值的指数衰减模型:

    执行该代码的结果如下图4所示,其中对于不同步长 h \boldsymbol{h} h的值,使用非标准分母函数求解了指数衰减模型。

  3. 非线性项应使用非局部近似来近似:像 y 2 ( t ) \boldsymbol{y}^2\left( \boldsymbol{t} \right) y2(t) 的项应由 y j y j + 1 \boldsymbol{y}^{\boldsymbol{j}}\boldsymbol{y}^{\boldsymbol{j}+1} yjyj+1 y j − 1 y j + 1 \boldsymbol{y}^{\boldsymbol{j}-1}\boldsymbol{y}^{\boldsymbol{j}+1} yj1yj+1代替 ( y j ) 2 \left( \boldsymbol{y}^{\boldsymbol{j}} \right) ^2 (yj)2来表示,其中 ( y j ) 2 \left( \boldsymbol{y}^{\boldsymbol{j}} \right) ^2 (yj)2。 例如,对应于逻辑模型的离散模型

    d y d t = y ( t ) ( 1 − y ( t ) ) , y ( 0 ) = 0.5 \frac{\boldsymbol{dy}}{\boldsymbol{dt}}=\boldsymbol{y}\left( \boldsymbol{t} \right) \left( 1-\boldsymbol{y}\left( \boldsymbol{t} \right) \right) ,\boldsymbol{y}\left( 0 \right) =0.5 dtdy=y(t)(1y(t)),y(0)=0.5

    可能是

    y j + 1 − y j h = y j ( 1 − y j + 1 ) ⇒ y j + 1 = y j ( 1 + h ) 1 + h y j , y 0 = 0.5 \frac{\boldsymbol{y}^{\boldsymbol{j}+1}-\boldsymbol{y}^{\boldsymbol{j}}}{\boldsymbol{h}}=\boldsymbol{y}^{\boldsymbol{j}}\left( 1-\boldsymbol{y}^{\boldsymbol{j}+1} \right) \Rightarrow \boldsymbol{y}^{\boldsymbol{j}+1}=\frac{\boldsymbol{y}^{\boldsymbol{j}}\left( 1+\boldsymbol{h} \right)}{1+\boldsymbol{hy}^{\boldsymbol{j}}},\boldsymbol{y}^0=0.5 hyj+1yj=yj(1yj+1)yj+1=1+hyjyj(1+h),y0=0.5

    Python代码nonlocapplog.py用于使用非局部逼近法求解逻辑模型。 该代码是

    下图5是通过执行python代码获得的。 它显示了使用不同步长值的逻辑模型的解决方案。 所有这些解都对应于微分方程模型的真实解。 因此,对于步长的所有值,离散模型不会遭受数值不稳定。

    图5

    上图5是通过执行python代码获得的。 它显示了使用不同步长值的逻辑模型的解决方案。 所有这些解都对应于微分方程模型的真实解。 因此,对于步长的所有值,离散模型不会遭受数值上的不稳定性。

  4. 离散模型和微分方程的解之间的动态一致性。 这意味着微分方程解所具有的所有性质都必须由离散模型的解所具有。 特殊属性包括正性,单调性,有界性,极限环和其他周期解等。

非标准有限差分方案是基于非标准规则构造的微分方程的离散表示。

精确有限差分法

齐次线性常微分方程的精确有限差分

非线性方程的精确差分

具有线性和幂项的微分方程的精确有限差分

其他非标准有限差分法

详情参阅 - 亚图跨际

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值