from sympy import *
import matplotlib.pyplot as plt

# Je reprends le sujet suivant :
# u(t) fonction paire de période 20
#         | 6 si   0 <= t <= 2
#  u(t) = | 8-t si 2 <  t <= 8
#         | 0   si 8 <  t <= 10

T = 20
t = symbols('t', real=True)
omega = 2*pi/T
print("Valeur de omega :")
pprint(omega) # la fonction pprint est un print avec affichage math

# définition de la fonction u
u = Piecewise((6,t<=2), (8-t,t<=8), (0,t<=10))

# calcul de a0
a0 = 2/T*integrate(u,(t,0,T/2))

print("Valeur de a0 :")
pprint(a0)

# Il faut créer le symbole n et
# pour forcer les simplifications
# on peut préciser qu'il est entier positif non nul
n = symbols('n', nonnegative=True, integer=True, zero=False)

an = 4/T*integrate(u*cos(n*omega*t),(t,0,T/2))
print("expression de a(n) :")
pprint(an)

# Calcul des valeurs de a(n)
# quelques précisions :
#     . remarquez déjà la notation f"blabla {calcul}"
#     il faut conmprendre que {calcul} sera remplacé par la valeur
#     . subs(n,i) permet de substituer au symbole n la valeur de i
#     . round(3)  permet d'obtenir une approximation à 3 chiffres après la virgule
for i in range(1,8): # de 1 à 7 compris
    print(f"a({i}) = {an.subs(n,i).round(3)}")

# calcul de la puissance
P = 2/T*integrate(u**2,(t,0,T/2))
print("valeur de P :")
pprint(P)
print("99.9% de P =",.999*P)

# on cherche la valeur de N tel que « a0² + somme a(n)²/2 pour n allant de 1 à N » dépasse 99.9% de P
# je tente une valeur de N et j'y j'exécute jusqu'à trouver la bonne.
# je commence avec N = 1... c'est à partir de N=5 que S dépasse 99.9% de P
for N in range(1,8):
    S = a0**2 + Sum(an**2/2, (n,1,N))
    print(f"Pour N={N} on obtient {S.evalf()}")
