Runge-Kutta四阶方法。向后整合

时间:2019-10-14 13:12:07

标签: python physics runge-kutta

我正在使用Runge-Kutta四阶方法来数值解曲率时空中具有四次电势的背景标量场的运动方程:

    csv_df = pd.read_csv(csv_name)

使用我向前积分后得到的最终值作为初始条件进行向后积分时出现问题。向前积分时,结果爆裂而没有匹配之前获得的值。我根本不明白问题出在哪里,因为方程式和代码都不是未知的。首先,我整合了0到64个e-fold。然后,我简单地反转集成方向。

我也附上了代码:

$\phi^{''}=-3\left(1+\frac{H^{'}}{3H}\right)\phi^{'}-\lambda\phi^3/H^2$,

$'$ denoting the derivative w.r.t. the e-folds number $\textrm{d}N=H\textrm{d}t$ and, from the Friedmann equation:

$H^2=\frac{\lambda \phi^4}{4}\frac{1}{3M_{Pl}^2-(1/2)\phi^{'2}}$;

$H^{'}=-\frac{1}{2M_{Pl}^2}H\phi^{'2}$.

PS:这个问题也已经发布在这里:https://scicomp.stackexchange.com/questions/33583/runge-kutta-fourth-order-method-integrating-backwards,其中详细显示了方程式。

编辑:删除了代码中不必要的部分。

编辑:响应@LutzL,我通过做点什么(s)来附加\ phi / M_ {Pl}和\ phi ^ {'}的图,然后积分前向(实线)和后向(虚线)。 )他说。如您所见,正向集成的结果突然偏离了,我无法解释。

|\phi^{'}| vs N

\phi/M_{Pl} vs N

1 个答案:

答案 0 :(得分:1)

我将RK4方法更改为最低限度。不需要v数组部分复制V数组的内容,所以

def rk4trial(f,v0,t0,tf,n,V):  
    t=np.linspace(t0,tf,n)
    h=t[1]-t[0]
    v=v0
    for j in range(n):  
        V.append(v)
        k1=f(v,t[j])*h
        k2=f(v+0.5*k1,t[j]+0.5*h)*h
        k3=f(v+0.5*k2,t[j]+0.5*h)*h
        k4=f(v+k3,t[j]+h)*h
        v=v+(k1+2*k2+2*k3+k4)/6
    return V, t, h

这里没有复制问题,因为v的每一步都是新构造的,因此附加到返回数组的对象都是单独的。

后向集成应该和前向集成一样简单,

V1, t1, h1 = rk4trial(Fdet,v0,t0,tf,n,[])
V2, t2, h2 = rk4trial(Fdet,V1[-1],tf,t0,n,[])
在方法错误的范围内,

V2[k]应该与V1[-k-1]相同。仅在硬ODE中会出现较大差异。