Bonjour, je rencontre un problème avec le module matplotlib.
J’ai 6 équations différentielles dont je trouve la solution avec le module odeint. Pour faire varier certains paramètres de ces équations, j’utilise des curseurs. J’attends alors que les graphes de mes solutions s’actualisent.
Mais là, problème : un seul sur les deux s’actualisent. Est-ce que quelqu’un pourrait m’aider ? Merci.
Ci-joint le code:
import matplotlib.pyplot as plt
from scipy.integrate import odeint
import numpy as np
from math import sin,cos
from matplotlib.widgets import Slider, Button
#### DEFINITION DES CONSTANTES DU PROBLEME ####
#Masse du drone (kg)
m=0.486
#Coefficients de trainée de translation (N/m/s)
K_ft_x,K_ft_y,K_ft_z=5.5670*10**(-3),5.5670*10**(-3),6.3540*10**(-4)
#Coefficients de frottements aérodynamiques (N/m/s)+
K_fa_x,K_fa_y,K_fa_z=5.5670*10**(-3),5.5670*10**(-3),6.3540*10**(-4)
#Inertie (kg.m²)
Ix,Iy,Iz=3.8278*10**(-3),3.8288*10**(-3),7.6566*10**(-3)
#Inertie des rotors (kg.m²)
Jr=2.8385*10**(-5)
#Coefficent de drag (N.m/rad/s)
d= 3.2320*10**(-7)
#Coefficients de portance (N/rad/s)
b=2.984*10**(-5)
#Distance rotor-centre de gravité (m)
l=0.25
#Constante de gravitation (m/s²)
g=9.806
a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3=-K_fa_x/Ix,(Iy-Iz)/Ix,l*b/Ix,-Jr/Ix,-K_fa_y/Iy,(Iz-Ix)/Iy,l*b/Iy,-Jr/Iy,-K_fa_z/Iz,(Ix-Iy)/Iz,d/Iz
#Temps,pas
T,h=10,0.01
#### CONDITIONS INTIALES ####
v_th_0,v_ph_0,v_ps_0=0,0,0
W=[0,0,0,0]
v_x_0,v_y_0,v_z_0 = 0,0,0
A=[pi/4,pi/4]
#### DEFINITION DU SYSTEME DIFFERENTIEL ####
def v_theta(vth,vph,vps,W):
return(a1*vth**2+b1*vth*vps+c1*(W[3]**2-W[1]**2)+d1*vph*(W[0]-W[1]+W[2]-W[3]))
def v_phi(vth,vph,vps,W):
return(a2*vph**2+b2*vth*vps+c2*(W[2]**2-W[0]**2)+d2*vth*(W[0]-W[1]+W[2]-W[3]))
def v_psi(vth,vph,vps,W):
return(a3*vps**2+b3*vth*vph+c3*(W[0]**2-W[1]**2+W[2]**2-W[3]**2))
def v_x(x,t,W,A):
return(b/m*sin(A[1])*(W[0]+W[1]+W[2]+W[3])-K_ft_x/m*x**2)
def v_y(y,t,W,A):
return(b/m*sin(A[0])*cos(A[1])*(W[0]+W[1]+W[2]+W[3])-K_ft_y/m*y**2)
def v_z(z,t,W,A):
return(b/m*cos(A[0])*cos(A[1])*(W[0]+W[1]+W[2]+W[3])-K_ft_z/m*z**2-g)
def F(X,t):
return(v_theta(X[0],X[1],X[2],W),v_phi(X[0],X[1],X[2],W),v_psi(X[0],X[1],X[2],W))
## RESOLUTION DES EQUATIONS DIFFERENTIELLES ANGULAIRES AVEC ODEINT ##
TPS = np.linspace(0,T,1000)
solution = odeint(F,[v_th_0,v_ph_0,v_ps_0],TPS)
TH=solution[:,0]
PH=solution[:,1]
PS=solution[:,2]
V_X=odeint(v_x,v_x_0,TPS,(W,A))
V_Y=odeint(v_y,v_y_0,TPS,(W,A))
V_Z=odeint(v_z,v_z_0,TPS,(W,A))
## TRACE DES SOLUTIONS ##
fig, (ax1,ax2) = plt.subplots(nrows = 1, ncols = 2)
ax1.set_ymargin(25)
p1, = ax1.plot(TPS,TH)
p2, = ax1.plot(TPS,PH)
p3, = ax1.plot(TPS,PS)
p4, = ax2.plot(TPS,V_X)
p5, = ax2.plot(TPS,V_Y)
p6, = ax2.plot(TPS,V_Z)
plt.subplots_adjust(bottom = 0.25, right = 0.89, left = 0.16 , wspace = 0.31, top = 0.96)
## REGLAGE DES MOTEURS ##
axe_slider1 = plt.axes([0.15, 0.151, 0.25, 0.03])
axe_slider2 = plt.axes([0.15, 0.100, 0.25, 0.03])
axe_slider3 = plt.axes([0.15, 0.051, 0.25, 0.03])
axe_slider4 = plt.axes([0.15, 0.001, 0.25, 0.03])
axe_slider5 = plt.axes([0.60,0.151,0.25,0.03])
axe_slider6 = plt.axes([0.60,0.051,0.25,0.03])
moteurs1 = Slider(axe_slider1, 'Vitesse de rotation moteur 1',0,100,0)
moteurs2 = Slider(axe_slider2, 'Vitesse de rotation moteur 2',0,100,0)
moteurs3 = Slider(axe_slider3, 'Vitesse de rotation moteur 3',0,100,0)
moteurs4 = Slider(axe_slider4, 'Vitesse de rotation moteur 4',0,100,0)
angle_theta = Slider(axe_slider5, 'Angle theta', -pi/2, pi/2,0)
angle_phi = Slider(axe_slider6, 'Angle phi', -pi/2, pi/2,0)
def val_update(val) :
val1 = moteurs1.val
val2 = moteurs2.val
val3 = moteurs3.val
val4 = moteurs4.val
W[0]=val1
W[2]=val2
W[1]=val3
W[3]=val4
nouvelle_solution = odeint(F,[v_th_0,v_ph_0,v_ps_0],TPS)
TH = nouvelle_solution[:,0]
PH = nouvelle_solution[:,1]
PS = nouvelle_solution[:,2]
p1.set_ydata(TH)
p2.set_ydata(PH)
p3.set_ydata(PS)
val5 = angle_theta.val
val6 = angle_phi.val
V_X = odeint(v_x,v_x_0,TPS,(W,[val5,val6]))
V_Y = odeint(v_y,v_y_0,TPS,(W,[val5,val6]))
V_Z = odeint(v_z,v_z_0,TPS,(W,[val5,val6]))
p4.set_ydata(V_X)
p5.set_ydata(V_Y)
p6.set_ydata(V_Z)
fig.canvas.draw_idle()
angle_theta.on_changed(val_update)
angle_phi.on_changed(val_update)
moteurs1.on_changed(val_update)
moteurs2.on_changed(val_update)
moteurs3.on_changed(val_update)
moteurs4.on_changed(val_update)
## AFFICHAGE DE LA SOLUTION ##
plt.show()
+0
-0