Lorenz system pythonnolds:如何为Lorenz系统获得合适的值

Lorenz system pythonnolds:如何为Lorenz系统获得合适的值,lorenz-system,Lorenz System,目前,我使用以下代码生成lorenz系列 def generate(x, stop=10000, s=10, b=8/3, r=28): def lor(v): return np.array([s * (v[1] - v[0]), v[0] * (r - v[2]) - v[1], v[0] * v[1] - b * v[2]]) ret = [] step = 0.1 xtemp = x.copy() for i in range(st

目前,我使用以下代码生成lorenz系列

def generate(x, stop=10000, s=10, b=8/3, r=28):
    def lor(v):
        return np.array([s * (v[1] - v[0]), v[0] * (r - v[2]) - v[1], v[0] * v[1] - b * v[2]])
    ret = []
    step = 0.1
    xtemp = x.copy()
    for i in range(stop):
        k1 = lor(xtemp)
        k2 = lor(xtemp + step / 2 * k1)
        k3 = lor(xtemp + step /2 * k2)
        k4 = lor(xtemp + step * k3)
        xtemp += step/6 * (k1 + 2 * k2 + 2 * k3 + k4)
        ret.append(xtemp[0])
    return np.array(ret)
但会产生无效值(我假设valid为0.91)

导入nold
l=生成([1,0,0])
nolds.lyap_r(l,tau=0.1,emb_dim=5)
1.0030932070169234


知道我在哪里犯了错误吗?

错误在于你假设洛伦兹动力学的x坐标对应于第一个李雅普诺夫指数。注意你正在服用:

ret.append(xtemp[0])
然而,第一个李雅普诺夫指数量化了不稳定流形更不稳定方向上的发散率

正如我所看到的,你只是在估计x坐标的第一个Lyapunov指数。此外,在这种方法中,对于每个坐标{x,y,z},Lyapunov指数都是正的,因为这种“平凡”分解不能捕获稳定流形。然后,你永远不会用这种方法找到第三个李雅普诺夫指数(负)

解决方案是使用Gram-Schmidt过程来获得动力学的正确伸缩方向,从而计算所有的Lyapunov指数。最大值正好是您正在查看的李雅普诺夫指数(约0.9)。尽管如此,一些论文对定性结果(+,0,-)比量级更感兴趣,因此,也许你可以找到其他一些论文显示的最大Lyapunov指数值略有不同

值得注意的是,如果我们考虑每个变量的和,以建立一个新的信号,与这个新的信号相关,达到你所期望的值。我绘制了从8000点到10000点的信号图,并获得了附在这篇文章上的图