#%% Résonance en tension

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider

#%% Fonctions
def Zm(omega,omega0,Q,Zam):
    return Zam/np.sqrt((1-(omega/omega0)**2)**2+(omega/(omega0*Q))**2)

def phi(omega,omega0,Q,Zam):
    return -90+np.arctan((omega**2-omega0**2)/(omega/(omega0*Q)))*180/np.pi


#%% Pulsations
omega = np.linspace(0.1,40,10000)



#%% Tracés pour Q<4

omega0 = 15
Q = 1/np.sqrt(2)
Zam = 1


fig = plt.figure(1)

axis_color = 'lightgoldenrodyellow'

fig.subplots_adjust(left=0.25, bottom=0.25)

ax1 = fig.add_subplot(211)

[line1] = ax1.plot(omega,Zm(omega,omega0,Q,Zam), linewidth=2, color='red')


def update_Zm(val):
    line1.set_ydata(Zm(omega, omega0_slider.val, Q_slider.val,Zam))
    fig.canvas.draw_idle()


ax1.grid()
ax1.set_ylim([0,4.1])
ax1.set_ylabel("$Z_m/Z_{am}$")
ax1.set_xlabel("$\omega$ (rad/s)")

ax2 = plt.subplot(212)

[line2] = ax2.plot(omega,phi(omega,omega0,Q,Zam), linewidth=2, color='red')

def update_phi(val):
    line2.set_ydata(phi(omega, omega0_slider.val, Q_slider.val,Zam))
    fig.canvas.draw_idle()


omega0_slider_ax  = fig.add_axes([0.25, 0.15, 0.65, 0.03], facecolor=axis_color)
omega0_slider = Slider(omega0_slider_ax , '$\omega_0$', 5, 25, valinit=omega0)


Q_slider_ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], facecolor=axis_color)
Q_slider = Slider(Q_slider_ax, '$Q$', 0.1, 4, valinit=Q)


# axamp = fig.add_axes([0.1, 0.25, 0.0225, 0.63])
# amp_slider = Slider(
#     ax=axamp,
#     label="$Z_{am}$",
#     valmin=1,
#     valmax=10,
#     valinit=Zam,
#     orientation="vertical"
# )

omega0_slider.on_changed(update_Zm)
Q_slider.on_changed(update_Zm)


omega0_slider.on_changed(update_phi)
Q_slider.on_changed(update_phi)


ax2.set_ylabel("$\phi$ (°)")
ax2.set_xlabel("$\omega$ (rad/s)")
ax2.grid()



plt.show()


#%% Tracés pour Q>4


fig = plt.figure(2)

omega0 = 15
Q = 3
Zam = 1

axis_color = 'lightgoldenrodyellow'

fig.subplots_adjust(left=0.25, bottom=0.25)

ax1 = fig.add_subplot(211)

[line1] = ax1.plot(omega,Zm(omega,omega0,Q,Zam), linewidth=2, color='red')


def update_Zm(val):
    line1.set_ydata(Zm(omega, omega0_slider.val, Q_slider.val,Zam))
    fig.canvas.draw_idle()


ax1.grid()
ax1.set_ylim([0,10])
ax1.set_ylabel("$Z_m/Z_{am}$")
ax1.set_xlabel("$\omega$ (rad/s)")


# Phase

ax2 = plt.subplot(212)

[line2] = ax2.plot(omega,phi(omega,omega0,Q,Zam), linewidth=2, color='red')

def update_phi(val):
    line2.set_ydata(phi(omega, omega0_slider.val, Q_slider.val,Zam))
    fig.canvas.draw_idle()


omega0_slider_ax  = fig.add_axes([0.25, 0.15, 0.65, 0.03], facecolor=axis_color)
omega0_slider = Slider(omega0_slider_ax , '$\omega_0$', 5, 25, valinit=omega0)


Q_slider_ax = fig.add_axes([0.25, 0.1, 0.65, 0.03], facecolor=axis_color)
Q_slider = Slider(Q_slider_ax, '$Q$', 3, 10.0, valinit=Q)


# axamp = fig.add_axes([0.1, 0.25, 0.0225, 0.63])
# amp_slider = Slider(
#     ax=axamp,
#     label="$Z_{am}$",
#     valmin=1,
#     valmax=10,
#     valinit=Zam,
#     orientation="vertical"
# )

omega0_slider.on_changed(update_Zm)
Q_slider.on_changed(update_Zm)


omega0_slider.on_changed(update_phi)
Q_slider.on_changed(update_phi)


ax2.set_ylabel("$\phi$ (°)")
ax2.set_xlabel("$\omega$ (rad/s)")
ax2.grid()


plt.show()