import numpy as np
import pylab as py
from matplotlib.widgets import Slider, Button, RadioButtons
from matplotlib import rc
# rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})


# rc('text', usetex=True)


def s_aperiodique(x,Q):
    z1=-(1/(2*Q)-np.sqrt(1/(4*Q**2) -1 ) )
    z2= -(1/(2*Q)+np.sqrt(1/(4*Q**2) -1 ) )
    tau1=-1/z1
    tau2=-1/z2
    
    return 1+tau1/(tau2-tau1)*np.exp(-x/tau1)-tau2/(tau2-tau1)*np.exp(-x/tau2)
    


def s_critique(x,Q):
    z=-(1/(2*Q))
    tau=-1/z
    return 1-( 1+ x/tau)*np.exp(-x/tau)


def s_pseudo_periodique(x,Q):
    z=-(1/(2*Q))
    tau=-1/z
    omega=np.sqrt(1-1/(4*Q**2))
    return 1-np.exp(-x/tau)*(  np.cos(omega*x) +  1/(omega*tau)*np.sin(omega*x) )

    
t=np.linspace(0,10,5000)

fig = py.figure('RLC série',figsize = (10,10))
ax = fig.add_subplot(1,1,1)

py.subplots_adjust(left=0.1, bottom=0.35)
py.axis([0.2,0.8,0.2,0.8])

# l1,l2,l3 =py.plot([],[],'-k',[],[],'-r', [],[], 'k')
l1,l2 =py.plot([],[],'-k',[],[],'-r')

def rebond (event):
	
    a1  = amplitude1.val
  
    t=np.linspace(0.01,100,1000)
    l1.set_xdata(t)
    y=0*t
    l1.set_ydata(y)
    l2.set_xdata(t)
    # l3.set_ydata(np.array([-1, 1]))
    
    if a1<0.5:
        l2.set_ydata(s_aperiodique(t,a1))
        # l3.set_xdata(5*np.array([1/(1*a1), 1/(1*a1)]))
    elif a1==0.5:
        l2.set_ydata(s_critique(t,a1))
        # l3.set_xdata(5*np.array([1/(1*a1), 1/(1*a1)]))
    else:
        l2.set_ydata(s_pseudo_periodique(t,a1))
        # l3.set_xdata(5*np.array([2*a1/(1), 2*a1/(1)]))
    
    ax.axes.axis([0,50,0,2])
    ax.set_ylabel('$U_c/E$', fontsize=16)
    ax.set_xlabel('$t$', fontsize=16)
    py.draw()
    
    

    

sld_amplitude1 = py.axes([0.1, 0.15, 0.8, 0.1], facecolor='grey')
# 
# 
amplitude1     = Slider(sld_amplitude1, r'Q', 0.001, 15.0, valinit=0.5)
# 
# 
# button_demarre = py.axes([0.4, 0.04, 0.2, 0.05])
# button = Button(button_demarre, 'animation', color='grey', hovercolor='white')
amplitude1.on_changed(rebond)

py.show()
