python scipy 内置函数 ODEINT 使用不同的时间点集(参数 t)
Using different time point sets (parameter t) for python scipy builtin function ODEINT
我正在研究洛伦兹系统。我使用 'scipy.integrate.odeint' 内置函数按照 Wikipedia1. Lorenz system has three variables: x, y, z. When I compared the evolution of x for two Lorenz systems with same initial conditions, same time differential(dt), but different time set points, I obtained different sets. Both the systems evolved similarly for some time, but later on, diverged 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在这两个系统中的演化。
您观察到的是完全正常的。
原则上和你猜的一样,应该是没有区别的。这里的技巧是通过将时间点存储为浮点值(当然你别无选择),间隔并不完全相等。为了观察这一点,考虑一个额外的时间数组 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)
机器精度的顺序存在细微差异(在我的计算机上,差异最大为 3 10^{-14},x86_64 架构)。这种时间步长的差异将在轨迹中产生微小的差异。
由于洛伦兹系统是混沌的,系统演化的微小差异都会导致轨迹的发散。
要观察这种发散现象,您可以绘制两个解的 x 坐标(当然也可以是 y 或 z)。它们一开始是相同的,然后有点不同,然后完全断开,正如混沌系统所预期的那样。然而,两种情况下的吸引子都是相同的。
plot(states[:,0])
plot(states2[:,0])
我正在研究洛伦兹系统。我使用 'scipy.integrate.odeint' 内置函数按照 Wikipedia1. Lorenz system has three variables: x, y, z. When I compared the evolution of x for two Lorenz systems with same initial conditions, same time differential(dt), but different time set points, I obtained different sets. Both the systems evolved similarly for some time, but later on, diverged 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在这两个系统中的演化。
您观察到的是完全正常的。
原则上和你猜的一样,应该是没有区别的。这里的技巧是通过将时间点存储为浮点值(当然你别无选择),间隔并不完全相等。为了观察这一点,考虑一个额外的时间数组 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)
机器精度的顺序存在细微差异(在我的计算机上,差异最大为 3 10^{-14},x86_64 架构)。这种时间步长的差异将在轨迹中产生微小的差异。
由于洛伦兹系统是混沌的,系统演化的微小差异都会导致轨迹的发散。
要观察这种发散现象,您可以绘制两个解的 x 坐标(当然也可以是 y 或 z)。它们一开始是相同的,然后有点不同,然后完全断开,正如混沌系统所预期的那样。然而,两种情况下的吸引子都是相同的。
plot(states[:,0])
plot(states2[:,0])