Intégration numérique, Simpson, python

J'essaye d'approximer l'intégrale d'une fonction avec la méthode des trapèzes et de tracer le graphe mais mon code ne fonctionne pas et je ne comprends pas pourquoi.

Simspon : j'ai fait une interpolation pour pouvoir tracer les coordonnées du graphe.
import numpy as np
import matplotlib.pyplot as plt
from pylab import *

x[0] = 0
x[:] = np.pi/2
nbx = 10
nbi = nbx - 1 # nombre d'intervalles
x = np.linspace(x[0], x[:], nbx)

def f(x):
    return np.cos(x)

def P(f,x):
    a = x[0]
    b = x[:]
    m = (x[0]+x[:])/2
    l0 = (x-m)/(a-m)*(x-b)/(a-b)
    l1 = (x-a)/(m-a)*(x-b)/(m-b)
    l2 = (x-a)/(b-a)*(x-m)/(b-m)   
    p = f(a)*l0 + f(m)*l1 + f(b)*l2
    return p

plt.plot(x,y,"p-.", label="f(x)",linewidth=4)

plt.title("Fonction cos(x)")
plt.xlabel("abscisses")
plt.ylabel("ordonnees")
plt.legend()

integrale = 0
for i in range(nbi):
    integrale = integrale +      f(x[i+0]) + 4*f( (x[i+0] + x[i+1])/2 ) + f(x[i+1]) * (x[i+1]-x[i+0])/6      

    # dessin Simpson
    x_simp = [x[i+0], np.linspace(x[i+0],x[i+1],11)           , x[i+1], x[i+0] ]         # abscisses des sommets
    y_simp = [0   , P(f,np.linspace(x[i+0],x[i+1],11))        ,     0   ,       0 ]         # ordonnees des sommets
    plt.plot(x_simp, y_simp,"r")
    
print("integrale =", integrale)
plt.show()
Si quelqu'un peut me dire ce qui ne va pas ?

[Pour afficher du code python, IL FAUT utiliser le bouton "Code" (5ème par la droite au dessus de la fenêtre d'édition. AD]

Merci AD
[À ton service :-) AD]

Réponses

  • Bonsoir,

    Dès le début, $x[0]=0$ utilise $x$ qui n'est pas défini.

    Cordialement,

    Rescassol
  • Et je suis sûr que Python te l’a dit.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • nicolas.patrois
    Non aucune mention de ça. Inutile ton commentaire.

    [Inutile de reproduire le message précédent. AD]
  • Rescassol écrivait : http://www.les-mathematiques.net/phorum/read.php?15,2212420,2212662#msg-2212662
    [Inutile de recopier l'avant-dernier message. Un lien suffit. AD]
    Ok merci, j'évite d'utiliser $x[0]$ et $x[:]$

    Mais j'ai l'impression qu'il y a un problème au niveau de la lecture de l'interpolation de $P(f,x)$ et également pour le traçage du graphe au niveau des coordonnées y_simp.
    import numpy as np
    import matplotlib.pyplot as plt
    from pylab import *
    
    a = 0
    b = np.pi/2
    nbx = 10
    nbi = nbx - 1 # nombre d'intervalles
    x = np.linspace(a ,b , nbx)
    
    def f(x):
        return np.cos(x)
    
    def P(f,x):
        m = (a+b)/2
        l0 = (x-m)/(a-m)*(x-b)/(a-b)
        l1 = (x-a)/(m-a)*(x-b)/(m-b)
        l2 = (x-a)/(b-a)*(x-m)/(b-m)  
        return f(a)*l0 + f(m)*l1 + f(b)*l2
        
    plt.plot(x,y,"p-.", label="f(x)",linewidth=4)
    
    plt.title("Fonction cos(x)")
    plt.xlabel("abscisses")
    plt.ylabel("ordonnees")
    plt.legend()
    
    integrale = 0
    for i in range(nbi):
        integrale = integrale +     f(x[i+0]) + 4*f( (x[i+0] + x[i+1])/2 ) + f(x[i+1]) * (x[i+1]-x[i+0])/6
        # dessin Simpson
        x_simp = [x[i+0], np.linspace(x[i+0],x[i+1],11)     , x[i+1], x[i+0] ]         # abscisses des sommets
        y_simp = [0   , P(f,np.linspace(x[i+0],x[i+1],11))  ,        0,        0]         # ordonnees des sommets
        plt.plot(x_simp, y_simp,"r")
        
    print("integrale =", integrale)
    
    plt.show()
    
  • NameError: name 'y' is not defined
  • Bonjour,
    Quanter0 a écrit:

    Je n'y crois pas une seule seconde, Python donne toujours un message d'erreur.
    Soit tu ne l'as pas vu, soit tu n'as pas su le lire en anglais, mais Nicolas a raison.
    Philou22 te dit d'ailleurs exactement la même chose.
    Maintenant, si les commentaires sur tes erreurs te gênent, débouille toi tout seul.

    Cordialement,
    Rescassol
Connectez-vous ou Inscrivez-vous pour répondre.