# -*- coding: utf-8 -*-
"""
Created on Thu Feb 13 01:38:28 2014

@author: dconduche
"""

from time import time
from math import cos,pi
from scipy.integrate import quad

################# Non terminé ##################


################# Ex 1 ##################
"""La fonction MethodePointMilieu calcule une approximation de l'intégrale de f sur le segment [a,b]
    Arguments :
    f : la fonction à intégrer
    a : début de l'intervalle
    b : fin de l'intervalle
    n : nombre de points de la subdivision de [a,b]
"""

def methode_pt_milieu(f, a, b, n):
    pas=(b-a)/float(n)
    return pas*sum([f(a+pas/2+k*pas) for k in range(n)])

################# Ex 2 ##################

def methode_rect(f,a,b,n):
    I=0
    pas=(b-a)/float(n)
    for k in range(n):
        I=I+f(a+k*pas)
    return pas*I

def methode_rect_alternatif(f,a,b,n):
    pas=(b-a)/float(n)
    return pas*sum([f(a+k*pas) for k in range(n)])

# Vous pouvez aussi le code avec des tableaux numpy, ou sans mémoriser le pas : l'essentiel, c'est la formule. 

def methode_trap(f,a,b,n):
    I=(f(a)+f(b))/float(2)
    pas=(b-a)/float(n)
    for k in range(1,n):
        I=I+f(a+k*pas)
    return pas*I

def methode_trap_alternatif(f,a,b,n):
    pas=(b-a)/float(n)
    return pas*((f(a)+f(b))/float(2)+sum([f(a+k*pas) for k in range(1,n)]))

    
def MesureTemps(n,methode): 
    """Exercice 2 : """
    t_debut=time()
    I=methode(cos,0,pi/2.,n)
    t_fin=time()
    return (t_fin-t_debut,I-1)


################# Ex 2 ##################
for n in [10**2,10**4,10**6]:
    print('Pour n ='+str(n))
    for meth in [methode_rect, methode_trap]:
        print(meth)
        print(MesureTemps(n,meth))

################# Ex 3 ##################
print(quad(lambda x:x**2,0,1))
resultat=quad(cos, 0, pi/2)
print('Calcul de l\'intégrale: '+str(resultat[0])+' avec une précision de '+str(resultat[1]))
print(resultat)
