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 : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2024
    Messages : 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 : 401
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 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 636
    Billets dans le blog
    67
    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
    Meilleurs vœux pour la nouvelle année !

    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 confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 998
    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 998
    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.

  4. #4
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 636
    Billets dans le blog
    67
    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é
    Meilleurs vœux pour la nouvelle année !

    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 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 636
    Billets dans le blog
    67
    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
    Meilleurs vœux pour la nouvelle année !

    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, 16h04
  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, 10h52
  3. Réponses: 30
    Dernier message: 15/12/2007, 20h39
  4. les polynômes de Legendre
    Par awalle dans le forum Mathématiques
    Réponses: 2
    Dernier message: 23/07/2007, 13h31
  5. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 13h32

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