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

$\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}$.

问题是,当我将前向积分后得到的最终值作为初始条件进行后向积分时。当向前积分时,结果在不匹配之前获得的值的情况下爆炸。我只是不明白问题在哪里,因为方程和代码都不是未知的。首先,我整合了从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):
        V.append(v[j])
        V[j]=copy.deepcopy(V[j])
        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**2)*(1/mpl**2)
    return np.array([sigma,-3*(1+HH/3)*sigma-lamb*phi**3/(H**2)])


注:这个问题也贴在这里:https://scicomp.stackexchange.com/questions/33583/runge-kutta-fourth-order-method-integrating-backwards,方程在这里有详细的显示。
编辑:删除代码中不必要的部分。
编辑:作为对@LutzL的响应,我将前向(实线)和后向(虚线)积分后,通过执行他所说的操作,附加\phi/M{Pl}和\phi^{}的图。如你所见,有一个突然的偏离,我无法解释的向前整合的结果。
python - Runge-Kutta四阶方法。向后整合-LMLPHP
python - Runge-Kutta四阶方法。向后整合-LMLPHP

最佳答案

我会将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]相同。只有在僵硬的颂歌中才能看到巨大的差异。

关于python - Runge-Kutta四阶方法。向后整合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58377592/

10-11 06:27