0

我正在研究洛伦兹系统。我使用 'scipy.integrate.odeint' 内置函数按照 Wikipedia 1的建议进行集成。Lorenz 系统具有三个变量:x、y、z。当我比较具有相同初始条件、相同时间差(dt)但不同时间设定点的两个洛伦兹系统的 x 演化时,我得到了不同的集合。这两个系统在一段时间内发展相似,但后来出现了分歧2。是什么原因?唯一的区别是它们具有不同的时间集(但具有相同的时差)。时间点设置如何影响集成?

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from mpl_toolkits.mplot3d import Axes3D

rho = 28.0
sigma = 10.0
beta = 8.0 / 3.0

def f(state, t):
    x, y, z = state  # Unpack the state vector
    return sigma * (y - x), x * (rho - z) - y, x * y - beta * z  # Derivatives
##Evolution_1
state0 = [3.0, 1.0, 1.0]
t = np.arange(0.0, 40.0, 0.01)

states = odeint(f, state0, t)

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot(states[:, 0], states[:, 1], states[:, 2])
plt.show()

#Evolution_2
state0 = [3.0, 1.0, 1.0]
t2 = np.arange(1.0, 41.0, 0.01)

states2 = odeint(f, state0, t2)

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot(states2[:, 0], states2[:, 1], states2[:, 2])
plt.show()

plt.plot(states2[:, 0],range(len(states2[:, 0])),states[:, 0],range(len(states2[:, 0])),np.absolute(np.subtract(states2[:, 0],states[:, 0])),range(len(states2[:, 0])))`

我还附上了我为上述代码获得的图表:x 在这两个系统中的演变。

4

1 回答 1

0

你观察到的完全正常。

原则上,正如您所猜测的那样,应该没有区别。这里的技巧是,通过将时间点存储为浮点值(当然你别无选择),间隔并不完全相等。为了观察这一点,考虑一个额外的时间数组t2_shifted,其原点设置为零:

t = np.arange(0.0, 40.0, 0.01)
t2 = np.arange(1.0, 41.0, 0.01)
t2_shifted = t2 - t2[0]

现在,绘制差异:

plt.plot(t - t2_shifted)

机器精度的顺序存在细微差异(在我的计算机上,x86_64 架构的差异最大约为 3 10^{-14})。这种时间步长的差异会在轨迹上产生微小的差异。

由于洛伦兹系统是混沌的,系统演化的微小差异会导致轨迹的发散。

要观察这种发散现象,您可以绘制两个解的 x 坐标(当然也可以是 y 或 z)。它们一开始是相同的,然后有点发散,然后完全断开,正如混沌系统所预期的那样。然而,在这两种情况下,吸引子都是相同的。

plot(states[:,0])
plot(states2[:,0])
于 2019-12-12T12:40:57.037 回答