Я хочу анимировать несколько эволюций одной и той же системы с немного отличающимися начальными условиями, чтобы показать, как они влияют на результаты.
У меня есть система с тремя переменными, которые все эволюционируют во времени, поэтому я сделал подзаговор, в котором я оживляю их всех в отношении эволюции времени. Теперь я хочу добавить вторую анимацию развития той же системы, но с немного другими параметрами, чтобы мы могли реально увидеть, как они развиваются по-разному. Тем не менее, я могу только заставить их выглядеть как-то один за другим, удаляя другой перед этим в процессе.
Пока у меня есть
import numpy as np
from random import uniform
from scipy.integrate import odeint
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as anime
# Définit les constantes que Lorenz utilise
sigma = 10
b = 8 / 3
r = 28
delta_t = 0.01
temps = 100
nbIter = int(temps / delta_t)
t = np.linspace(0,temps, num=nbIter)
# Conditions initiales que Lorenz utilise
x_0 = 0
y_0 = 1
z_0 = 0
conditions_0 = [x_0, y_0, z_0]
x_1 = 0 + uniform(0, 0.1)
y_1 = 1 + uniform(0, 0.1)
z_1 = 0 + uniform(0, 0.1)
conditions_1 = [x_1, y_1, z_1]
def equations(variables, t):
x, y, z = variables
dxdt = sigma*(y - x)
dydt = (-x*z) + (r*x) - y
dzdt = (x*y) - (b*z)
systemeEDO = [dxdt, dydt, dzdt]
return systemeEDO
# Solve EDOs
solutions_0 = odeint(equations, conditions_0, t)
solutions_1 = odeint(equations, conditions_1, t)
# Plot les graphs x(t), y(t) et z(t) séparés
fig, (ax_x, ax_y, ax_z) = plt.subplots(3, 1)
line_x, = ax_x.plot([], [])
line_x1, = ax_x.plot([], [])
line_y, = ax_y.plot([], [])
line_y1, = ax_y.plot([], [])
line_z, = ax_z.plot([], [])
line_z1, = ax_z.plot([], [])
ax_x.set_xlim(0, temps)
ax_x.set_ylim(-30, 30)
ax_x.set_xlabel('t')
ax_x.set_ylabel('x')
ax_y.set_xlim(0, temps)
ax_y.set_ylim(-30, 30)
ax_y.set_xlabel('t')
ax_y.set_ylabel('y')
ax_z.set_xlim(0, temps)
ax_z.set_ylim(0, 50)
ax_z.set_xlabel('t')
ax_z.set_ylabel('z')
x_det = solutions_0[:, 0]
y_det = solutions_0[:, 1]
z_det = solutions_0[:, 2]
x_det1 = solutions_1[:, 0]
y_det1 = solutions_1[:, 1]
z_det1 = solutions_1[:, 2]
def init_x():
line_x.set_data([], [])
return line_x,
def animate_x(i):
y = x_det[:i]
val_t = t[:i]
line_x.set_data(val_t, y)
return line_x,
def init_x1():
line_x1.set_data([], [])
return line_x1,
def animate_x1(i):
y = x_det1[:i]
val_t = t[:i]
line_x1.set_data(val_t, y)
return line_x1,
def init_y():
line_y.set_data([], [])
return line_y,
def animate_y(i):
y = y_det[:i]
val_t = t[:i]
line_y.set_data(val_t, y)
return line_y,
def init_y1():
line_y1.set_data([], [])
return line_y1,
def animate_y1(i):
y = y_det1[:i]
val_t = t[:i]
line_y1.set_data(val_t, y)
return line_y1,
def init_z():
line_z.set_data([], [])
return line_z,
def animate_z(i):
y = z_det[:i]
val_t = t[:i]
line_z.set_data(val_t, y)
return line_z,
def init_z1():
line_z1.set_data([], [])
return line_z1,
def animate_z1(i):
y = z_det1[:i]
val_t = t[:i]
line_z1.set_data(val_t, y)
return line_z1,
anim_x = anime.FuncAnimation(fig, animate_x, init_func=init_x, frames=int(nbIter), interval=5, blit=True)
anim_x1 = anime.FuncAnimation(fig, animate_x1, init_func=init_x1, frames=int(nbIter), interval=5, blit=True)
anim_y = anime.FuncAnimation(fig, animate_y, init_func=init_y, frames=int(nbIter), interval=5, blit=True)
anim_y1 = anime.FuncAnimation(fig, animate_y1, init_func=init_y, frames=int(nbIter), interval=5, blit=True)
anim_z = anime.FuncAnimation(fig, animate_z, init_func=init_z, frames=int(nbIter), interval=5, blit=True)
anim_z1 = anime.FuncAnimation(fig, animate_z1, init_func=init_z, frames=int(nbIter), interval=5, blit=True)
figManager = plt.get_current_fig_manager()
figManager.window.showMaximized()
plt.show()
Я хочу видеть оранжевую и синюю линии одновременно на каждом участке, но могу заставить их странно колебаться вот так.