IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Polynome de Legendre en Python


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2024
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2024
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Polynome de Legendre en Python
    Bonjour,

    Je cherche à faire un programme Python résolvant cette récurrence :

    Nom : aaa.png
Affichages : 131
Taille : 21,1 Ko

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import numpy as np
    import matplotlib.pyplot as plt
     
    a=1
    b=50
    n=1000
     
    def P_0(x) :
      n=0
      return i,1
     
    def P_1(x) : 
      n=1
      return i,x
     
    def P_n(n,x) : 
     
      f=(2*n-1)/(n)*x*P_n(n-1,x)-P_n(n-2,x)*(n-1)/(n)
      return n, f
     
    x = np.linspace(a, b, n+1)
    y=P_n(30,x)
     
    plt.plot(x, y)
     
    plt.show()
    Il s'agit d'un des premiers programme que je fais en python, soyez indulgent

    A vous lire

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 374
    Points : 19 784
    Points
    19 784
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Si tu souhaite évaluer le polynôme en fonction de n et x, comme tu as une relation de récurrence, tu peux créer une fonction récursive à partir de cette relation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def P_n(n,x) :
     
        if n==0: # si n=0, renvoie 1 : sortie
            return 1
        else:
            if n==1: # si n=1, renvoie x : sortie
                return x
            else: # sinon : appels récursifs :
                return ((2*n-1)/n)*x*P_n(n-1,x) - P_n(n-2,x)*(n-1)/n
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 888
    Points : 6 632
    Points
    6 632
    Par défaut
    À ta place j'éviterais de créer une fonction récursive, car si ton intention est de calculer la valeur au rang 30, cela nécessitera pas moins de 2692537 appels de ta fonction. À mon avis mieux vaut opter pour une boucle allant jusqu'à n dans laquelle tu mets à jour les deux termes précédents, la complexité sera moins grande.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 374
    Points : 19 784
    Points
    19 784
    Billets dans le blog
    65
    Par défaut
    Ah oui en effet je n'avais pas vu le degré n=30.

    Dans ce cas oui il vaut mieux utiliser une boucle, c'est peut-être moins lisible pour un débutant mais nettement plus rapide à l'exécution.

    Un peu comme pour le calcul du nième terme de la suite de Fibonacci à l'aide d'une boucle, mais en un peu plus compliqué
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 374
    Points : 19 784
    Points
    19 784
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    J'ai ajouté les fonctions dans ton code pour afficher le graphique si tu es toujours dessus. Il reste peut-être quelques petites erreurs.

    On peut donc optimiser le code en utilisant la programmation dynamique : on mémorise les résultats intermédiaires pour éviter de les calculer plusieurs fois :

    La méthode ascendante (proposée par CosmoKnacki) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import numpy as np
    import matplotlib.pyplot as plt
     
     
    def P_leg(n,x):
     
        if n==0:
            return 1
     
        # initialisation des 2 variables
        p_prec = 1
        p_cour = x
     
        # parcours des i
        for i in range(2,n+1):
            # relation de récurrence
            pi = ((2*i-1)/i)*x*p_cour - p_prec*(i-1)/i
            p_prec = p_cour; p_cour = pi
     
        return p_cour
     
    n=3
     
    a=-1
    b=1
     
    x = np.linspace(a, b, 1000)
     
    y = [P_leg(n,xi) for xi in x]
     
    plt.plot(x, y, label="P_leg(n,x)")
     
    plt.legend()
     
    plt.show()
    Habituellement on mémorise les résultats intermédiaires dans un tableau.


    La méthode descendante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    import numpy as np
    import matplotlib.pyplot as plt
     
    def P(n,x) :
     
        if n not in p_dict:
            # appels récursifs :
            p_dict[n] = ((2*n-1)/n)*x*P(n-1,x) - P(n-2,x)*(n-1)/n
     
        return p_dict[n]
     
    def P_leg(n,x):
        global p_dict
     
        if n==0:
            return 1
     
        # initialisation du dico : 2 première valeurs 1 et x
        p_dict = {0: 1, 1: x}
     
        # appel de la fonction récursive Pn(n,x) et renvoi de son résultat
        return P(n,x)
     
    n=3
     
    a=-1
    b=1
     
    x = np.linspace(a, b, 1000)
     
    y = [P_leg(n,xi) for xi in x]
     
    plt.plot(x, y, label="P_leg(n,x)")
     
    plt.legend()
     
    plt.show()
    On utilise dans ce cas un dictionnaire pour mémoriser les valeurs déjà calculées.

    Tout est expliqué en détail sur cette page Wikipedia :

    https://fr.wikipedia.org/wiki/Programmation_dynamique

    Il y a aussi plein d'exemples sur internet il suffit de chercher un peu.

    Voilà si ça peut être utile
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

Discussions similaires

  1. Polynômes Formels en Python
    Par Avi.Py dans le forum Général Python
    Réponses: 46
    Dernier message: 06/06/2021, 15h04
  2. Formule de gauss-légendre et polynome de lagrange
    Par midoubah dans le forum Mathématiques
    Réponses: 1
    Dernier message: 23/02/2012, 09h52
  3. Réponses: 30
    Dernier message: 15/12/2007, 19h39
  4. les polynômes de Legendre
    Par awalle dans le forum Mathématiques
    Réponses: 2
    Dernier message: 23/07/2007, 12h31
  5. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo