# -*- coding: utf-8 -*-
# Created on Wed May 21 08:08:08 2025
# @author: mhebding
# DM3py - Integrales



from math import sqrt, sin, pi, log
from scipy.integrate import quad
import sympy as sp

## I - La methode des rectangles sur la periode d un pendule

# 1.
g = 9.81
l = 1
theta0 = 50*pi/180
k = sin(theta0/2)

def approx(x):
    return 1.0/(sqrt(1-k**2*sin(x)**2))

def test1():
    periode1 = 4*sqrt(g/l)*quad(lambda x: approx(x),0,pi/2)[0]
    periode1 = round(periode1, 2)
    print("La période du pendule calculée avec la méthode quad est {resultat} s".format(resultat=periode1))

# 2. 
# la fonction quad calcule une integrale, on y passe une fonction lambda et on defini un intervalle

#>>> test1()

# grace a la fonction test1 on trouve une periode de l ordre de 20 s

# 3.
def rectangles(f,a,b,n):
    h = (b-a)/float(n) # pas
    s = 0 # initialisation de la somme
    for k in range(n):
        s = s + f(a+k*h)
    return h*s # aire totale

# 4.
n = 1000
periode2 = 4*sqrt(g/l)*rectangles(lambda x: approx(x),0,pi/2,n)
print("Période pour n= {nombre} : {resultat} s".format(nombre=n, resultat=periode2))

# 5.
def test2():
    for n in [10,100,1000,10000,100000,1000000]:
        periode2 = 4*sqrt(g/l)*rectangles(lambda x: approx(x),0,pi/2,n)
        print("Période pour n= {nombre} : {resultat} s".format(nombre=n, resultat=periode2))
    print("L'approximation du calcul de l'intégrale par la méthode des rectangles est d'autant plus précise que n augmente")

#>>> test2()



## II - La methode des trapezes sur le travail d une isotherme

# 6.
n0 = 1
R = 8.314
T = 298
Vi = 10**-3
Vf = 2*10**-3

V = sp.Symbol('V') 
P = n0*R*T*1/V

fonction = sp.lambdify(V, P) # conversion en fonction

# 7.
def trapezes(f,a,b,n):
    h = (b-a)/float(n)
    s = 0.5*(f(a)+f(b))
    for k in range(n):
        s = s + f(a+k*h)
    return h*s

# 8.
n = 10000
W = -trapezes(lambda x: fonction(x),Vi,Vf,n)

def test3():
    print("")
    print("II - Calcul de W")
    print("n=" +str(n))
    solution1 = round(-n0*R*T*log(Vf/Vi),2)
    print("Par la theorie : " + str(round(solution1,2)) + " J")
    solution2 = W
    print("Par les trapezes : " + str(round(solution2,2)) + " J")
    solution3 = -rectangles(lambda x: fonction(x),Vi,Vf,n)
    print("Par les rectangles : " + str(round(solution2,2)) + " J")

# la methode des trapezes semble fidele et l est d autant plus que n augmente
# Rq : la methode des trapezes est plus fidele que la methode des rectangles

test3()
#>>> test3()

# 9.
# la methode de Simpson calcule une integrale de maniere encore plus fidele