一个程序中的两个 RK4 方法

计算科学 正则 龙格库塔 一体化 微分方程
2021-12-10 15:06:15

我想通过在 Fortran 中编码来使用 RK4 解决这个积分:

R=1/a(t)dtdR/dt=1/a(t)=f(t)

初始点:t=0(或a=0.001)且R=0

我必须通过求解另一个微分方程得到 a(t):

da/dt=1/a+1/a2=g(a)

初始点:t=0 和 a=0.001

我写了这段代码来得到一个(t):

    PROGRAM RK4
      implicit none
      real h,t
      integer n
      read*,h,n
      call Scale_Factor(h,n,t,a)
    END PROGRAM

    !---------------------------------------------

    SUBROUTINE Scale_Factor(h,n,t,a)
      implicit none
      real t,a,k1,k2,k3,k4,h,g
      integer i,n

      t=0
      a=0.001


    Do i=1,n

       k1=h*g(a)

       k2=h*g(a+k1/2.0)

       k3=h*g(a+k2/2.0)

       k4=h*g(a+k3)

       t=t+h

       a=a+(k1+2*k2+2*k3+k4)*(1/6.0)

       write(*,*)t,a

    END DO
    END SUBROUTINE

    !-------------------------
    FUNCTION g(a)
      implicit none
      real a,g
      g=sqrt((1.0/a)+(1.0/a**2)) 
    END FUNCTION

我还有另一个类似的程序来解决第一个积分。但是我需要使用这个程序产生的 a(t) 来求解积分,我不知道如何将它们组合在一个程序中。

我写的把它们结合起来是这样的:

    Program RK4
    implicit none

    real k1,k2,k3,k4,h,t,R
    integer i,n
    real a
    read*,n,h 


    t=0
    R=0

    Do i=1,n

      k1=h*(1/a(t))

      k2=h*(1/a(t+h/2.0))

      k3=h*(1/a(t+h/2.0))

      k4=h*(1/a(t+h))

      t=t+h

      R=R+(k1+2*k2+2*k3+k4)*(1/6.0)

      write(*,*)t,R

    End Do

    end program

    !-----------------------------------------

    SUBROUTINE Scale_Factor(h,n,t,a)
      implicit none
      real t,a,k1,k2,k3,k4,h,g
      integer i,n

      t=0
      a=0.001


    Do i=1,n

       k1=h*g(a)

       k2=h*g(a+k1/2.0)

       k3=h*g(a+k2/2.0)

       k4=h*g(a+k3)

       t=t+h

       a=a+(k1+2*k2+2*k3+k4)*(1/6.0)

       write(*,*)t,a

    END DO
    END SUBROUTINE

    !-------------------------
    FUNCTION g(a)
      implicit none
      real a,g
      g=sqrt((1.0/a)+(1.0/a**2)) 
    END FUNCTION

但我知道这是不正确的。

1个回答

第一个应该验证数值解a(t)反对解析解。

dta=1/a+1/a2=a+1a2

采用b=a+1,则 ODE 变为

(b1)2bdb=dt,

我们从中找到解决方案

b2/22bln(b)=t

这种关系(定义为常数以满足初始条件)是不可逆的,但足以验证数值解a(t)=b(t)1.

一次a(t)是可用的,用数值求解另一个 ODE 是微不足道的,

dtR=1/a

核实R(t)也可以通过分析找到它,

dRdt=dRdadadt=1a

使用b=a+1这可以重写为

dR=b1bdb,

这导致了解决方案(达到一个附加常数以满足初始条件)

R=bln(b)