Problème de subplots avec matplotlib

a marqué ce sujet comme résolu.
Auteur du sujet

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()

Édité par artragis

+0 -0

Il est mis à jour. En modifiant phi, je vois bien les courbes bouger. Le truc, c’est que la plage de valeurs des courbes bleue et orange est de [-0,1 ; 0,1], tandis que la courbe verte atteint facilement -100 mais ne varie pas avec les curseurs. Donc on ne voit la modification.

Ce n’est peut-être pas normal, mais ce n’est pas un problème d’affichage. ;)

Il y a bien des façons de passer à l’acte. Se taire en est une. Attribué à Jean-Bertrand Pontalis

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte