# -*- coding: utf-8 -*-
"""
Created on Sat Aug 27 09:26:06 2022

@author: pbert

Simule la réponse temporelle d'un oscillateur d'ordre 2
obéissant à d²x/dt²+om0/Q dx/dt + om0² x =om0² smembre 
"""

# =============================================================================
# Imports utiles
# =============================================================================
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# =============================================================================
# Paramètres de la simulation
# =============================================================================
om0=100 #pulsation propre de l'oscillateur
Q=10 #facteur de qualité
smembre=2 #solution particulière (ie solution en RP si l'oscillateur est stable)
X0=[0,0] #condition initiale, sous forme [x(0),dx/dt(0)]
tmax=1 #la réponse sera calculée sur [0,tmax]

# =============================================================================
# Fonction de résolution
# =============================================================================
def deriv(t,X):
    """renvoie la dérivée d'un vecteur d'état X"""
    return np.array([X[1], -om0/Q*X[1]-om0**2*X[0] + om0**2*smembre])
       
res=solve_ivp(deriv,[0,tmax],X0,t_eval=np.linspace(0,tmax,1000))

# =============================================================================
# Tracé de la solution
# =============================================================================
plt.plot(res.t,res.y[0])
plt.xlabel("t(s)")
plt.ylabel("x(t)")
plt.grid()
plt.show()