from math import*
import matplotlib.pyplot as plt
import numpy as np
T0,U0=1E-03,0.5
w0=2*pi/T0
def F(t):# Fonction rectangle impaire
    if t<T0/2:
        return U0
    else:
        return(-U0)
def G(t):# Fonction Dents de scie paire
    if t<T0/2:
        return U0-4*U0*t/T0
    else:
        return -3*U0+4*U0*t/T0
def f(t):# Choix de F(t) ou G(t)
    return F(t)
def a(n,t):
    return f(t)*cos(n*w0*t)
def b(n,t):
    return f(t)*sin(n*w0*t)
def integrale(f,a,b):
    S,t,N=0,a,500
    dx=(b-a)/N
    while t<b:
        S+=f(t)*dx
        t+=dx
    return S

#Coefficients
a0=integrale(f,0,T0)*1/T0
A,B=[a0],[0]
Nmax=15# Nombre d'harmoniques dans la série
for n in range(Nmax):
    def AN(t):
        return a(n+1,t)
    def BN(t):
        return b(n+1,t)
    an=integrale(AN,0,T0)*2/T0
    bn=integrale(BN,0,T0)*2/T0
    A.append(an)
    B.append(bn)

def coeff(N):# Liste des N premiers coefficents an et bn
    for n in range(N+1):
        print("a{} = {:.2f} et b{} = {:.2f}\n".format(n,A[n],n,B[n]))

def s(t):# Addition des Nmax premiers harmoniques = s(t)
    s=0
    for n in range(Nmax+1):
        s=s+A[n]*cos(n*w0*t)+B[n]*sin(n*w0*t)
    return s
def courbe():# Représentation graphique de s(t)
    plt.close()
    X=[(t-500)*T0/1000 for t in range(1200)]
    Y=[s(t) for t in X]
    plt.plot(X,Y)
    plt.title("Addition des {:.0f} premiers             harmoniques".format(Nmax+1))
    plt.grid()
    plt.show()

def spectre(N):#Spectre des N premiers harmoniques
    plt.close()
    c=[]
    for n in range(N+1):
        c.append(sqrt(A[n]**2+B[n]**2))
        plt.plot((n,n),(0,c[n]),linewidth=3,color="red")
    plt.grid()
    plt.xlim([-0.5,N+1])
    plt.ylim([0,1])
    plt.show()