Лоренц Аттрактор

У меня есть вопрос, связанный с функцией 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(), который устарел.

Другие вопросы по тегам