布拉休斯数值解

布拉休斯方程如下:

f f^{''}+2f^{'''}=0 \\ f(0)=f^{'}(0)=0;f^{''}(0)=1
假设二阶导数作为一阶导数的斜率,做1阶插值法迭代计算一阶导数的值,叫做一阶

这是一个非线性常微分方程,下面我们利用四阶龙格库塔方法来求解该方程,相当于找了3个值去插入斜率乘以微元量。

我们引入新的变量:

y_1=f \\ y_2=f^{'} \\ y_3=f^{''}

则四阶布拉休斯方程可以等价的表示如下:

\begin{equation} \left\{ \begin{aligned} &y_1^{'} = y_2 \\ &y_2^{'} = y_3 \\ &y_3^{'} = -\frac{1}{2}y_1 y_3 \end{aligned} \right . \end{equation}

具有五阶精度
利用四阶龙格库塔有:

\begin{equation} \left\{ \begin{aligned} &y_{n+1}=y_n+\frac{h}{6}(K_1+2K_2+2K_3+K_4) \\ &K_1 = f(x_n, y_n) \\ &K_2 = f(x_n+\frac{h}{2}, y_n+\frac{h}{2}K_1) \\ &K_3 = f(x_n+\frac{h}{2}, y_n+\frac{h}{2}K_2) \\ &K_4 = f(x_n+h, y_n+h K_3) \\ \end{aligned} \right . \end{equation}

对于(3)式中的第一式利用龙哥库塔方法,有:

\begin{equation} \left\{ \begin{aligned} &y_1^{n+1}=y_1^{n}+\frac{h}{6}(K_{11}+2K_{12}+2K_{13}+K_{14}) \\ &K_{11} = y_2^{n} \\ &K_{12} = y_2^{n} + \frac{h}{2}K_{11} \\ &K_{13} = y_2^{n} + \frac{h}{2}K_{12} \\ &K_{14} = y_2^{n} + h K_{13} \\ \end{aligned} \right . \end{equation}

同理,对于(3)中的第二式:

\begin{equation} \left\{ \begin{aligned} &y_2^{n+1}=y_2^{n}+\frac{h}{6}(K_{21}+2K_{22}+2K_{23}+K_{24}) \\ &K_{21} = y_3^{n} \\ &K_{22} = y_3^{n} + \frac{h}{2}K_{21} \\ &K_{23} = y_3^{n} + \frac{h}{2}K_{22} \\ &K_{24} = y_3^{n} + h K_{23} \\ \end{aligned} \right . \end{equation}

对于(3)中的第三式:

\begin{equation} \left\{ \begin{aligned} &y_3^{n+1}=y_3^{n}+\frac{h}{6}(K_{31}+2K_{32}+2K_{33}+K_{34}) \\ &K_{31} = -\frac{1}{2}y_1^{n}y_3^{n} \\ &K_{32} = -\frac{1}{2}(y_1^{n} + \frac{h}{2}K_{31})(y_3^{n} + \frac{h}{2}K_{31}) \\ &K_{33} = -\frac{1}{2}(y_1^{n} + \frac{h}{2}K_{32})(y_3^{n} + \frac{h}{2}K_{32}) \\ &K_{34} = -\frac{1}{2}(y_1^{n} + hK_{33})(y_3^{n} + hK_{33}) \\ \end{aligned} \right . \end{equation}
可执行代码

import numpy

from matplotlib import pyplot

def GetEtaFun( eta, f1, f2, alpha ):
    eeta = []
    ff1  = []
    ff2  = []
    vv   = []
    n = len( eta )
    a13 = alpha **( 1.0/ 3.0 )
    a23 = alpha **( 2.0/ 3.0 )
    oa13 = 1.0 / a13
    for i in range( n ):
        my_eta = eta[ i ] * oa13
        my_f1 = a13 * f1[ i ]
        my_f2 = a23 * f2[ i ]
        
        v = 0.5 * ( my_eta * my_f2 - my_f1 )

        ff1.append( my_f1 )
        ff2.append( my_f2 )
        eeta.append( my_eta )
        vv.append( v )
    return eeta, ff1, ff2, vv

def RungeKutta():
    deta = 0.01
    eta  = 0

    etaN = 10.0
    n = int( etaN/deta )
    print("n=",n)
    
    f1 = 0.0
    f2 = 0.0
    f3 = 1.0
    ff1 =[f1]
    ff2 =[f2]
    ff3 =[f3]
    eeta=[eta]
    
    half = 0.5
    h = deta;
    y1 = [f1, f2, f3 ]
    y2 = [0, 0, 0]
    y3 = [0, 0, 0]
    y4 = [0, 0, 0]
    k1 = [0, 0, 0]
    k2 = [0, 0, 0]
    k3 = [0, 0, 0]
    k4 = [0, 0, 0]
    
    for i in range( n ):
        k1[0] = y1[1]
        k1[1] = y1[2]
        k1[2] = - half * y1[0] * y1[2]
       
        y2[0] = y1[0] + half * h * k1[0]
        y2[1] = y1[1] + half * h * k1[1]
        y2[2] = y1[2] + half * h * k1[2]
        
        k2[0] = y2[1]
        k2[1] = y2[2]
        k2[2] = - half * y2[0] * y2[2]
        
        y3[0] = y1[0] + half * h * k2[0]
        y3[1] = y1[1] + half * h * k2[1]
        y3[2] = y1[2] + half * h * k2[2]
        
        k3[0] = y3[1]
        k3[1] = y3[2]
        k3[2] = - half * y3[0] * y3[2]
        
        y4[0] = y1[0] + h * k3[0]
        y4[1] = y1[1] + h * k3[1]
        y4[2] = y1[2] + h * k3[2]
        
        k4[0] = y4[1]
        k4[1] = y4[2]
        k4[2] = - half * y4[0] * y4[2]        
        
        coef = 1.0 / 6.0 * h
       
        y1[0] = y1[0] + coef * ( k1[0] + 2 * k2[0] + 2 * k3[0] + k4[0] )
        y1[1] = y1[1] + coef * ( k1[1] + 2 * k2[1] + 2 * k3[1] + k4[1] )
        y1[2] = y1[2] + coef * ( k1[2] + 2 * k2[2] + 2 * k3[2] + k4[2] )
        
        
        eta += h
        
        print( eta, y1[0], y1[1], y1[2] )
        ff1.append(y1[0])
        ff2.append(y1[1])
        ff3.append(y1[2])
        eeta.append(eta)
    alpha = y1[1]**(-3/2.0)
    print( "alpha=", alpha, "nstep=", n )
    
    etaList, f1List, f2List, vList = GetEtaFun( eeta, ff1, ff2, alpha )
    
    #pyplot.plot( eeta, ff1 )
    #pyplot.plot( eeta, ff2 )
    #pyplot.plot( eeta, ff3 )
    pyplot.figure(1)
    pyplot.plot( etaList, f2List )
    pyplot.figure(2)
    pyplot.plot( etaList, vList )
    pyplot.figure(3)
    pyplot.plot( f2List, etaList )
    pyplot.figure(4)
    pyplot.plot( vList, etaList )
    pyplot.show()


def main():
    RungeKutta()
    
if __name__ == "__main__":
    main()

执行发现结果接近0.332

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容