Python Lorenz系统的Runge-Kutta常数发散?

Python Lorenz系统的Runge-Kutta常数发散?,python,numerical-methods,runge-kutta,lorenz-system,Python,Numerical Methods,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) 结果应该是Lorenz atractors,但是我的代码在第五次迭代时会出现分歧,这是因为我在kconstants中创建的contants会出现分歧,但是我检查了一下,我非常确定runge kutta的实现不会出错。。。(至少我认为) 编辑: 找到了一个类似的,

我试图用四阶龙格-库塔方法来解决这个问题,其中

dx/dt=a*(y-x)
dy/dt=x(b-z)-y
dx/dt=x*y-c*z
因为这个系统不依赖于时间的明确性,所以在迭代中可能忽略这一部分,所以我只需要 dX=F(x,y,z)

结果应该是Lorenz atractors,但是我的代码在第五次迭代时会出现分歧,这是因为我在
kconstants
中创建的contants会出现分歧,但是我检查了一下,我非常确定runge kutta的实现不会出错。。。(至少我认为)

编辑:
找到了一个类似的,但无法理解我做错了什么的计算初始值不同吗?你选择的那些有意义吗?也就是说,他们是身体上的吗?根据以往使用rk的经验,如果选择愚蠢的起始参数,有时会得到非常混乱的结果。

在计算
k1
k2
k3
时,会额外调用
f(x0)
。将功能
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])

Python 2还是Python 3?在Python2中,
8/3
2
1/6
0
。我在Python3中,所以这应该是正确的。为什么要将
k
的计算与新状态的计算分开?如果您正在计算密集输出,但您没有存储它们,这是有意义的。同样,在
时间==0
func(x0)
应替换为
x0
。或者更好,初始化
result[0]=x0
并在
time=1
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])