# import de math pour exp, fabs, pi, sqrt
import math as m
# import pour le tracé
import matplotlib.pyplot as plt




# on considère un second ordre avec pulsation propre = 1rad/s


##################
# Cas pseudo-périodiques
##################

# initialisation du facteur d'amortissement
z=0.1
#incrément de facteur d'amortissement
dz=0.01

# calcul du premier temps de reponse pour la valeur initiale de z

# initialisation de la date
t=0
y=0
C=m.sqrt(1-z*z)

# tant que le dépassement est significatif supérieur à 5%
while m.fabs(y-1)>0.05:
#  incrémentation de la date par demi pseudo périodes
 t = t+m.pi/C
# calcul de l'ordonnée
 y = 1-m.exp(-z*t)*m.sin(C*t+m.atan(C/z))/C

# "retour arrière" depuis le premier dépassement sous les 5% jusqu'à tr5% estimé
while m.fabs(y-1)<0.05:
#  décrémentation du temps
 t = t-0.01*m.pi/C
# calcul de l'ordonnée
 y = 1-m.exp(-z*t)*m.sin(C*t+m.atan(C/z))/C

# initialisation de la liste des facteur d'amortissement
Z=[z]
# initialisation liste des tr5%
T=[t]

z=z+dz

# pour z<1 régime pseudopériodique
while z<1:
 C=m.sqrt(1-z*z)
 # initialisation de la date
 t=m.pi/C
 y=0

 # tant que le dépassement est significatif supérieur à 5%
 while m.fabs(y-1)>0.05:
  #  incrémentation de la date par demi pseudo périodes
  t = t+m.pi/C
  # calcul de l'ordonnée
  y = 1-m.exp(-z*t)*m.sin(C*t+m.atan(C/z))/C

  # "retour arrière" depuis le premier dépassement sous les 5% jusqu'à tr5% estimé
 while m.fabs(y-1)<0.05:
  # décrémentation du temps
  t = t-0.01*m.pi/C
  # calcul de l'ordonnée
  y = 1-m.exp(-z*t)*m.sin(C*t+m.atan(C/z))/C
 Z=Z+[z]
 T=T+[t]
 z=z+dz


#####################
# pour z>1 régime apériodique
#####################


while z<5:
 T1=1/(z+m.sqrt(z**2-1))
 T2=1/(z-m.sqrt(z**2-1))
 t=0
 dt=0.01
 while m.fabs(T2/(T2-T1)*m.exp(-t/T2)-T1/(T2-T1)*m.exp(-t/T1))>0.05:
  t+=dt
 Z=Z+[z]
 T=T+[t]
 z=z+dz


###################
# tracé de l'abaque
###################

plt.title('abaque du temps de réponse réduit')
plt.close()
plt.loglog(Z,T,'+')
plt.xlabel("facteur d'amortissement")
plt.ylabel('temps de réponse réduit')
plt.autoscale()
plt.show()




