Лоренц Аттрактор
У меня есть вопрос, связанный с функцией numpy empty(). Я пытаюсь построить график хаоса, тем временем я использую функцию np.empty() для создания пустых массивов, состоящих из 20000 элементов. Код отлично работает, когда я использую функцию empty(), но когда я решаю попробовать другой подход и использую np.zeros(), график оказывается прямой линией, а не хаотичным графиком.
Я искал разницу между .empty() и .zeros(), но не могу найти причину. Когда я создаю dydt с помощью .zeros(), график становится линией, но все равно работает нормально, если dxdt и dzdt создаются с помощью .zeros(), а не .empty(). Что может быть причиной этого?
import numpy as np
import matplotlib.pyplot as plt
#chaotic solution
σ = 10
ρ = 28
β = 8/3
dt = 0.01 #is the sample rate in seconds.
x = 20000
dxdt = np.empty(x + 1)
dydt = np.empty(x + 1)
dzdt = np.empty(x + 1)
for i in range (0,x):
dxdt[i+1] = dxdt[i] + σ*(dydt[i] - dxdt[i])*dt
dydt[i+1] = dydt[i] + (dxdt[i] * (ρ - dzdt[i]) - dydt[i])*dt
dzdt[i+1] = dzdt[i] + (dxdt[i] * dydt[i] - β * dzdt[i\])*dt
# Initial values
dxdt[0], dydt[0], dzdt[0] = (0., 1., 1.05)
# Plot
fig = plt.figure(figsize=(16, 16),dpi=400)
ax = fig.gca(projection='3d')
ax.plot(dxdt, dydt, dzdt, lw=0.5)
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_zlabel("Z Axis")
ax.set_title("Lorenz Attractor")
plt.show()]
1 ответ
Я думаю, возможно, вы хотите установить начальные значения перед началом цикла? Вот изменение, а также небольшое форматирование (поскольку теперь мой интерпретатор не запускает его):
# chaotic solution
σ = 10
ρ = 28
β = 8 / 3
dt = 0.01 # is the sample rate in seconds.
x = 20000
dxdt = np.empty(x + 1)
dydt = np.empty(x + 1)
dzdt = np.empty(x + 1)
# Initial values
dxdt[0], dydt[0], dzdt[0] = (0.0, 1.0, 1.05)
for i in range(x):
dxdt[i + 1] = dxdt[i] + σ * (dydt[i] - dxdt[i]) * dt
dydt[i + 1] = dydt[i] + (dxdt[i] * (ρ - dzdt[i]) - dydt[i]) * dt
dzdt[i + 1] = dzdt[i] + (dxdt[i] * dydt[i] - β * dzdt[i]) * dt
fig = plt.figure(figsize=(16, 16),dpi=400)
ax = fig.add_subplot(projection='3d')
ax.plot(dxdt, dydt, dzdt, lw=0.5)
ax.set_xlabel("X Axis")
ax.set_ylabel("Y Axis")
ax.set_zlabel("Z Axis")
ax.set_title("Lorenz Attractor")
plt.show()
Обратите внимание, чтоempty
иzeros
немного отличаются, но не должны иметь значения для вашего контекста, это больше касается оптимизации распределения памяти в зависимости от того, сколько нулей вы ожидаете получить. Замена одного другим не имеет значения в моем решении. Я также заменил настройку проекции наgca()
, который устарел.