Runge Kutta常数对于Lorenz系统有分歧吗?

时间:2019-04-27 20:41:56

标签: python numerical-methods runge-kutta lorenz-system

我正在尝试使用四阶Runge Kutta方法求解Lorenz system,其中

dx/dt=a*(y-x)
dy/dt=x(b-z)-y
dx/dt=x*y-c*z

由于该系统不显式依赖时间,因此可能会忽略迭代中的该部分,所以我只需要 dX = F(x,y,z)

def func(x0):
    a=10
    b=38.63
    c=8/3
    fx=a*(x0[1]-x0[0])
    fy=x0[0]*(b-x0[2])-x0[1]
    fz=x0[0]*x0[1]-c*x0[2]
    return np.array([fx,fy,fz])

def kcontants(f,h,x0):
    k0=h*f(x0)
    k1=h*f(f(x0)+k0/2)
    k2=h*f(f(x0)+k1/2)
    k3=h*f(f(x0)+k2)
    #note returned K is a matrix
    return np.array([k0,k1,k2,k3])

x0=np.array([-8,8,27])
h=0.001

t=np.arange(0,50,h)
result=np.zeros([len(t),3])

for time in range(len(t)):
    if time==0:
        k=kcontants(func,h,x0)
        result[time]=func(x0)+(1/6)*(k[0]+2*k[1]+2*k[2]+k[3])
    else:
        k=kcontants(func,h,result[time-1])
        result[time]=result[time-1]+(1/6)*(k[0]+2*k[1]+2*k[2]+k[3])

结果应该是Lorenz atractors,但是我的代码在第五次迭代中出现了分歧,这是因为我在kconstants中创建的竞争对象确实存在,但是我检查了一下,并且我很确定runge kutta实现不是错...(至少我认为)

编辑:

发现了类似的post,但无法弄清楚我在做什么错

2 个答案:

答案 0 :(得分:1)

在计算f(x0)k1k2时,您有一个额外的呼叫k3。将功能kcontants更改为

def kcontants(f,h,x0):
    k0=h*f(x0)
    k1=h*f(x0 + k0/2)
    k2=h*f(x0 + k1/2)
    k3=h*f(x0 + k2)
    #note returned K is a matrix
    return np.array([k0,k1,k2,k3])

答案 1 :(得分:0)

您是否为计算使用了不同的初始值?您选择的那些有意义吗?即他们身体吗?根据rk的以往经验,如果选择了愚蠢的启动参数,有时会得到非常令人困惑的结果。