# -*- coding: utf-8 -*-
"""
Created on Fri May 24 21:35:16 2024

@author: Jimmy
"""

import numpy as np


#Exercice 1

def p (n,x) :
    prod=1
    S=0
    for k in range(n+1):
        S+=prod
        prod*= x/(k+1)
    return S
    

import math
import matplotlib.pyplot as plt
import numpy as np


X=np.arange(-2,2,0.01)
for k in range(100) :
    Y=[p(k,x) for x in X]
    plt.plot(X,Y)
plt.show()
   

def q(c,n,x) :
    prod=1
    S=0
    for k in range(n+1):
        S+=c[n-1-k]*prod
        prod*= x/(k+1)
    return S

c=[1-2**(-n) for n in range(100)]
for k in range(100) :
    Y=[p(k,x)-q(c,k,x) for x in X]
    plt.plot(X,Y)
plt.show()


#Echauffement

import scipy.integrate as integr
def f(x):
    def g(t):
        return (np.exp(-x*t))/(1+t**2)
    return integr.quad(g,0,np.inf)

print(f(2))

X=np.arange(0,10,0.01)
Y=[f(x)[0] for x in X]
plt.plot(X,Y)
plt.show()


#Exercice 4

def f(t)  :
    if 0<=t<=np.pi :
        return t
    if np.pi<t<=2*np.pi :
        return 2*np.pi-t
    if t>2*np.pi :
        return f(t-2*np.pi)
    if t<0 :
        return f(t+2*np.pi)
        
X=np.arange(-4*np.pi,4*np.pi,0.01)
Y=[f(x) for x in X]
plt.plot(X,Y)
plt.show()

def coef(f,n) :
    return [(integr.quad(lambda t: f(t)*np.cos(k*t),0,2*np.pi))[0]/np.pi for k in range(n+1)],[(integr.quad(lambda t: f(t)*np.sin(k*t),0,2*np.pi))[0]/np.pi for k in range(n+1)]
    
def S(n,x):
    a,b=coef(f,n)
    S=a[0]/2
    for k in range(1,n+1) :
        S+=a[k]*np.cos(k*x)+b[k]*np.sin(k*x)
    return S
        
X=np.arange(0,2*np.pi,0.01)
Y=[f(x) for x in X]
plt.plot(X,Y)

Z3=[S(3,x) for x in X]
plt.plot(X,Z3)
Z10=[S(10,x) for x in X]
plt.plot(X,Z10)
Z30=[S(30,x) for x in X]
plt.plot(X,Z30)
plt.show()

#Exercice 3

def S(N) :
    L=[]
    s=0
    for k in range(1,N+1) :
        s+=np.abs(np.sin(k+1)/(k+1)-np.sin(k)/k)
        L.append(s)
    return L
    
print(S(500)[-1])

X=[k for k in range(1,501)]
Y=S(500)
plt.plot(X,Y)
Z=[Y[k-1]/(np.log(k+1)) for k in range(1,501)]
plt.plot(X,Z)
plt.show()

