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

计算科学 Python 计算物理学 数字 scipy 龙格库塔
2021-11-27 22:49:29

我正在使用 Runge-Kutta 四阶方法以数值方式求解具有四次势的弯曲时空中背景标量场的通常运动方程:

ϕ=3(1+H3H)ϕλϕ3/H2,

表示对 e-folds 数的导数dN=Hdt并且,从弗里德曼方程:

H2=λϕ4413MPl2(1/2)ϕ2;

H=12MPl2Hϕ2.

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

我也附上代码:

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


def Fdet(v,t):
    phi, sigma = v
    H=(((lamb/4)*phi**4)/(3*mpl**2-(1/2)*sigma**2))**(1/2)
    HH=-((1/2)*(sigma/H)**2)*(1/mpl**2)
    return np.array([sigma,-3*(1+HH/3)*sigma-lamb*phi**3/(H**2)])

1个回答

根据我对您的问题的理解,我假设您正在寻找检查 ODE 的时间可逆性:

ϕ(t)=3(1+H(t)3H(t))ϕ(t)λϕ3(t)H2(t)=0

在哪里:

H(t)=λϕ4(t)4(3MPl20.5ϕ(t)2)

H(t)=12MPl2ϕ(t)2H(t)

您的初始 ODE 是具有粘性项的Langevin 方程的形式3(1+H(t)3H(t))ϕ(t). 您的朗之万方程不是时间可逆的,因为方程在 T 变换下不会保持不变。仅仅因为一阶导数ϕ(t)在 T 变换下将其符号变为负:

ϕ(t)=ϕ(t)