# ======================================== #
# TD CALCUL NUMERIQUE                      #
# INTEGRATION PAR LA METHODE DES TRAPEZES. #
# Version de janvier 2018                  #
# ======================================== #

## Importations
import numpy as np
from math import pi, atan, log

## Fonction principale
def IntTrap(f,a,b,n):
    A = (f(a) + f(b)) / 2
    h = (b - a) / n
    for i in range(1,n):
        a += h
        A += f(a)
    A *= h
    return(A)

## Pour tester...
def f1(t):
    return(t**3)

def f2(t):
    return(atan(t))

a,b,n = 1,4,10000
pas = (b - a) / n
print("Valeur APPROCHEE (méthode des trapèzes) de l'intégrale de la fonction cube sur le segment [",a,",",b,"]  :",trapezes(f1,a,b,n))
X = np.linspace(a,b,n+1)
Y = []
for e in X:
    Y.append(f1(e))
print("Valeur APPROCHEE (méthode des trapèzes, version de numpy) de l'intégrale de la fonction cube sur le segment [",a,",",b,"]  :",np.trapz(Y,X,pas))
print("Valeur EXACTE de l'intégrale de la fonction cube sur le segment [1,4] : 63.75")
print("La fonction est convexe sur l'intervalle considéré et il est donc normal d'en obtenir une surestimation.")

print("\n")

a,b,n = 0,1,10000
pas = (b - a) / n
print("Valeur APPROCHEE (méthode des trapèzes) de l'intégrale de la fonction arctan sur le segment [",a,",",b,"]  :",trapezes(f2,a,b,n))
X = np.linspace(a,b,n+1)
Y = []
for e in X:
    Y.append(f2(e))
print("Valeur APPROCHEE (méthode des trapèzes, version de numpy) de l'intégrale de la fonction arctan sur le segment [",a,",",b,"]  :",np.trapz(Y,X,pas))
print("Valeur EXACTE de l'intégrale de la fonction arctan sur le segment [1,4] :",(pi-2*log(2))/4)
print("La fonction est concave sur l'intervalle considéré et il est donc normal d'en obtenir une sous-estimation.")