我正在研究一个围绕混沌振荡器的项目。现在,我刚刚使用四阶 Runge-Kutta 在 Python 中编写了 Lorenz Attractor:
'''
Created on 19 feb. 2018
@author: judvuyst
'''
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.animation as animation
#Differential equations of a Lorenz System
def X(x, y, s):
return s * (y - x)
def Y(x, y, z, r):
return (-x) * z + r * x - y
def Z(x, y, z, b):
return x * y - b * z
#RK4 for the differential equations
def RK4(x, y, z, s, r, b, h):
k_1 = X(x, y, s)
l_1 = Y(x, y, z, r)
m_1 = Z(x, y, z, b)
k_2 = X((x + k_1 * h * 0.5), (y + l_1 * h * 0.5), s)
l_2 = Y((x + k_1 * h * 0.5), (y + l_1 * h * 0.5), (z + m_1 * h * 0.5), r)
m_2 = Z((x + k_1 * h * 0.5), (y + l_1 * h * 0.5), (z + m_1 * h * 0.5), b)
k_3 = X((x + k_2 * h * 0.5), (y + l_2 * h * 0.5), s)
l_3 = Y((x + k_2 * h * 0.5), (y + l_2 * h * 0.5), (z + m_2 * h * 0.5), r)
m_3 = Z((x + k_2 * h * 0.5), (y + l_2 * h * 0.5), (z + m_2 * h * 0.5), b)
k_4 = X((x + k_3 * h), (y + l_3 * h), s)
l_4 = Y((x + k_3 * h), (y + l_3 * h), (z + m_3 * h), r)
m_4 = Z((x + k_3 * h), (y + l_3 * h), (z + m_3 * h), b)
x += (k_1 + 2 * k_2 + 2 * k_3 + k_4) * h * (1/6)
y += (l_1 + 2 * l_2 + 2 * l_3 + l_4) * h * (1/6)
z += (m_1 + 2 * m_2 + 2 * m_3 + m_4) * h * (1/6)
return (x, y, z)
#Initial values and Parameters
x_0, y_0, z_0 = 1, 1, 1
s, r, b = 10, 28, 8/3
#RK4 iteration
x_list = [x_0]
y_list = [y_0]
z_list = [z_0]
h = 0
i = 0
while h < 0.15:
x = x_list[i]
y = y_list[i]
z = z_list[i]
position = RK4(x, y, z, s, r, b, h)
x_list.append(position[0])
y_list.append(position[1])
z_list.append(position[2])
h += 0.0000005
i += 1
#plotten
fig = plt.figure()
ax = fig.gca(projection = '3d')
x_array = np.array(x_list)
y_array = np.array(y_list)
z_array = np.array(z_list)
ax.plot(x_array, y_array, z_array, ',')
plt.show()
我的问题是:我可以使用这段代码来模拟吸引子吗?遵循这些方程的某种点和线并留下一条轨迹,最后是完整的吸引子图像。我对matplotlib的动画模块不是很熟悉。
提前谢谢!
亲切的问候
朱利安