目前,我使用以下代码生成劳伦兹级数
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)
但是nolds.lyap_r产生无效值(我假设有效值为0.91)
import nolds
l = generate([1, 0, 0])
nolds.lyap_r(l, tau=0.1, emb_dim=5)
1.0030932070169234
我在哪里弄错了?
答案 0 :(得分:0)
错误是您假设Lorenz动力学的x坐标对应于第一个Lyapunov指数。观察您正在服用:
ret.append(xtemp[0])
但是,第一个Lyapunov指数量化了在不稳定流形的更不稳定方向上的发散率。
正如我所看到的,您只是在估计x坐标的第一个Lyapunov指数。此外,在这种方法中,对于每个坐标{x,y,z},Lyapunov指数将为正,因为这种“简单”分解无法捕获稳定流形。然后,您将永远不会以这种方式找到第三李雅普诺夫指数(负数)。
解决方案是使用Gram-Schmidt过程获取动力学扩展和收缩的正确方向,从而计算所有Lyapunov指数。最大值恰好是您正在寻找的Lyapunov指数(约0.9)。但是,有些论文对定性结果(+,0,-)的兴趣比其幅度大,因此,也许您可以找到其他一些论文,这些论文的最大Lyapunov指数值略有不同。
值得注意的是,如果我们考虑每个变量的总和,以建立一个新信号,则与此新信号关联的Largest Lyapunov Exponent已达到您期望的值。我绘制了从8000点到10000点的信号,并获得了此帖子所附的图。