## exo 1

import math as m
def approx(f,n):
    somme = 0
    for k in range(1,n+1): # si on somme de 1 à n
        somme+= f(k/n)
    return  somme / n

def g(x):
    return m.exp(-x**2/2)

for k in [10,100,1000]:
    print(k,approx(g,k),sep=',')

def approxJ(eps=0.001):
    n=1
    while 1/n > eps:
        n+=1
    return n,approx(g,n)

## exo 2

def trapeze(f,a,b,n):
    somme = 0
    h = (b - a) / n
    for k in range(n):
        somme +=(f(a + k * h) + f(a + (k+1) * h)) / 2
    return h * somme


print(trapeze(g,0,1,10))
print(trapeze(g,0,1,100))
print(trapeze(g,0,1,1000))

## Comparaison des deux méthodes

import sympy as sp
sp.var('x')
a=float(sp.integrate(sp.exp(-x**2 / 2), (x,0,1)))

print('l'' intégrale ', a)


for n in [10,100,1000]:
    print('n= ',n,' rectangle vaut', approx(g,n))
    print('n= ',n,'l''erreur rectangle vaut', abs(a-approx(g,n)))
    print('n= ',n , 'trapeze vaut', trapeze(g,0,1,n))
    print('n= ',n , 'l''erreur trapeze vaut', abs(a-trapeze(g,0,1,n)))


