Simulation fréquentielle

Fonctions nécessaires

CODE

FONCTION

import matplotlib.pyplot as plt

Importe la bibliothèque pyplot de matplotlib (nécessaire pour utiliser les fonctions permettant de tracer des courbes ci-dessous).

plt.clf()

plt.draw()

...

plt.show()

Tant que la figure n’est pas fermée, les courbes s'ajouteront sur la figure. Il est donc utile de commencer chaque tracé par les 2 première lignes ci-contre.

clf effacera la figure avant de recommencer le tracé.

draw forcera à redessiner sur la figure.

Enfin, le code se terminera par show afin d’afficher le graphe. NB : Si le graphe n'apparaît pas, cliquer sur l'icône Pyzo en bas de votre écran afin de visualiser la 2ème fenêtre qui est cachée...

control.bode_plot(H, dB=True, wrap_phase=True)

Trace le bode de H.

control.bode_plot([H1,H2], dB=True, wrap_phase=True)

fig = plt.gcf()

for ax in fig.axes:

ax.legend(["Fonc.H1","Fonc.H2"],fontsize=15)

ax.grid(True, which='both')

Si 2 courbes sont tracées sur le même graphe, il est nécessaire de légender ces courbes.

legend précise la légende.

fontsize précise la taille de la légende.

ax.grid affiche les grilles.

control.bode_plot(FTBO, dB=True, display_margins='overlay', wrap_phase=True)

Trace le bode et les marges de la FTBO

fig.suptitle("Bode de H1 et H2",FontSize=20)

Affiche le titre du graphe « Bode de H1 et H2 ».

fontsize précise la taille du titre.

Fonctions pour peaufiner si besoin (mais pas nécessaire)

CODE

FONCTION

for ax in fig.axes:

lines = ax.get_lines()

main_lines = [line for line in lines if len(line.get_xdata()) > 10]

# H1 :

main_lines[0].set_linewidth(1)

main_lines[0].set_color('b')

main_lines[0].set_linestyle('-')

main_lines[0].set_marker('+')

# H2 :

main_lines[1].set_linewidth(2)

main_lines[1].set_color('r')

main_lines[1].set_linestyle('--')

main_lines[1].set_marker('+')

ax.legend(["Fonc.H1","Fonc.H2"],fontsize=15)

ax.get_lines récupère toutes les lignes sur la figure.

main_lines = [line for line in lines if len(line.get_xdata())>10] garde seulement les vraies courbes (celles avec beaucoup de points)

linewidth précise l'épaisseur de la courbe.

b précise la couleur : b=blue, g=green, k=black, m=magenta, r=red, y=yellow.

-- précise le style de la ligne : -=ligne continue, --=ligne discontinue, :=ligne pointillée, -.=ligne mixte.

+ précise le tracé de chaque point : +=plus, ^=triangle, v=triangle dans l'autre sens, s=carré, o=rond.

Il est important de saisir ax.legend après avoir affecté les nouveaux styles et couleurs, sinon la légende affichée est celle avant les modifications...

fig.suptitle("Bode de \n H1 et H2", fontsize=20)

\n effectue un saut à la ligne afin d’afficher le titre sur 2 lignes (idem pour xlabel et ylabel).

fig.suptitle("Bode de "+str(a))

Affiche dans le titre la valeur de la variable a (idem pour xlabel et ylabel).

plt.xlim(10**-1,10**2)

Zoom l'intervalle d'affichage des abscisses entre 10-1 et 102 (idem pour ylim) (utile uniquement si les valeurs automatiques affichées sur l'axe des abscisses ne conviennent pas...).

Calcul du gain et de la phase pour plusieurs valeurs de pulsations données

CODE

FONCTION

frequences = np.array([0.5, 8])

G, phi, w = control.frequency_response(H1, frequences)

for wi, Gi, phii in zip(w, G, phi):

print(f"Pour w = {wi:.3f} rad/s")

print(f"Gain : {Gi:.6f}")

print(f"Gain en décibel : {20*np.log10(Gi):.3f} dB")

print(f"Phase en degré : {np.degrees(phii):.3f} °")

print()

Calcul le gain et la phase pour des valeurs de pulsations données. Ici, dans l'exemple : 0,5 et 8 rad/s

NB : La phase est calculée à 2π près.