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

Calcul scientifique Python Discussion :

Ordre de travail avec des expressions de polynômes


Sujet :

Calcul scientifique Python

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut Ordre de travail avec des expressions de polynômes
    Bonjour

    J'essaie de comprendre python et de travailler les bibliothèques de calcul. Là, mon but est d'afficher une décomposition en éléments simples d'un polynôme. Voici mon code :

    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
    38
    39
    import sympy as sp
    x=sp.Symbol('x')
     
    p=64*x**6-1
    list=sp.factor_list(p)
    #list=sp.factor_list(sp.Poly(p)) # ne marche pas parce que les multiplications développent automatiquement
    p=1
    for i in range(len(list[1])) :
        if list[1][i][1]==1 :
            p=p*(list[1][i][0])
        else :
            p=p*(list[1][i][0])**list[1][i][1]
    p=list[0]*p # Le coefficient du monome de plus haut degré
    display(p)
     
    for i in range(len(list[1])) :
        sol=sp.solve(list[1][i][0],x)
        if len(sol)==1 :
            print(sol[0]," d'ordre ",list[1][i][1])
        else :
            print(list[1][i][0]," sans racine réelle d'ordre ",list[1][i][1])
     
    # Pour les racines complexes
    p=64*x**6-1
    list=sp.factor_list(p,extension=sp.roots(p))
    display(list)
    p=1 # Le coefficient du monome de plus haut degré
    for i in range(len(list[1])) :
        if list[1][i][1]==1 :
            p=p*(list[1][i][0])
        else :
            p=p*(list[1][i][0])**list[1][i][1]
        display(list[1][i]," => ",p) # affichage pour bien vérifier l'ordre d'arrivée
    p=list[0]*p        
    display(p)
     
    print ("liste des racines :")
    for i in range(len(list[1])) :
        print(list[1][i][0]," => ",x-list[1][i][0]," d'ordre ",list[1][i][1])
    J'ai deux problèmes au niveau des racines complexes :
    1) J'ai fait afficher une à une les opérations effectuées pour générer le polynôme décomposer. Le polynôme n'est pas restitué dans le bon sens.
    2) Le coefficient du monôme du plus haut degré, je dois l'introduire à la fin, sinon, il est rentré en facteur dans le premier terme utilisé. C'est à dire que je dois initialiser p par p=1 et conclure par p=list[0]*p. Si je ne fais qu'initialiser par p=list[0], ça ne marche pas.

    édit : Une autre question : comment ne récupérer que le 𝑥3−1, de Poly(𝑥3−1,𝑥,𝑑𝑜𝑚𝑎i𝑛=ℤ) ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre habitué
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 123
    Points : 162
    Points
    162
    Par défaut
    Bonjour,
    Déjà en python c'est pas "display" mais "print", mais bon on comprend l'idée. Appeler une variable "list", ça pique un peu...
    Que voulez-vous dire par
    Le polynôme n'est pas restitué dans le bon sens.
    ? La loie "*" est commutative, donc qu'importe l'ordre.
    Si je ne fais qu'initialiser par p=list[0], ça ne marche pas.
    Je viens d'essayer et je tombe exactement sur le même résultat.
    Une autre question : comment ne récupérer que le 𝑥3−1, de Poly(𝑥3−1,𝑥,𝑑𝑜𝑚𝑎i𝑛=ℤ) ?
    Il suffit d'invoquer la méthode "as_expr()" de l'objet Poly.
    Désolé de ne pas vous aidez plus mais je ne comprends pas vraiment ou se situ votre problème.
    Peut être cette solution peut vous inspirer?
    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
     
    from sympy.core.symbol import Symbol
    from sympy.polys.polytools import factor_list
    from sympy.polys.polyroots import roots
    from sympy.core.mul import Mul
    from sympy.core.power import Pow
    from sympy.printing.pretty.pretty import pprint
     
    x = Symbol("x")
    poly = 64*x**6 - 1
     
    coef, facts = factor_list(poly, extension=roots(poly))
    facts = [base if exp == 1 else Pow(base, exp, evaluate=False) for base, exp in facts]
    factorised_poly = Mul(coef, *facts, evaluate=False)
     
    pprint(factorised_poly)

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Bonjour

    Pour le display, c'est juste que j'ai oublié de rajouter ceci en début de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from IPython.display import *
    Je sais que la multiplication est commutative. Mon but est d'avoir l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    64*(x - 1/2)*(x + 1/2)*(x - 1/4 - sqrt(3)*I/4)*(x - 1/4 + sqrt(3)*I/4)*(x + 1/4 - sqrt(3)*I/4)*(x + 1/4 + sqrt(3)*I/4)
    Pour l'obtenir, je dois finir par la multiplication par le coefficient du monome de plus haut degré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    display(list)
    p=1
    for i in range(len(list[1])) :
        if list[1][i][1]==1 :
            p=p*(list[1][i][0])
        else :
            p=p*(list[1][i][0])**list[1][i][1]
        display(list[1][i]," => ",p) # affichage pour bien vérifier l'ordre d'arrivée
    p=list[0]*p         # Le coefficient du monôme de plus haut degré
    display(p)

    Si je le fais au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    p=list[0] # Le coefficient du monome de plus haut degré
    for i in range(len(list[1])) :
        if list[1][i][1]==1 :
            p=p*(list[1][i][0])
        else :
            p=p*(list[1][i][0])**list[1][i][1]
        display(list[1][i]," => ",p) # affichage pour bien vérifier l'ordre d'arrivée
    display(p)
    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (x - 1/2)*(x + 1/2)*(x - 1/4 - sqrt(3)*I/4)*(x + 1/4 - sqrt(3)*I/4)*(x + 1/4 + sqrt(3)*I/4)*(64*x - 16 + 16*sqrt(3)*I)
    Le 64 est intégré au premier polynôme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    p=sp.Poly(2*x**2+8,x)
    print(p.as_expr())
    est parfait. Merci. Je ne suis pas arrivé à trouver les méthodes de l'objet Poly.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

Discussions similaires

  1. Travailler avec des gifs animés
    Par Commodore dans le forum Imagerie
    Réponses: 1
    Dernier message: 13/07/2006, 15h58
  2. Réponses: 8
    Dernier message: 09/03/2006, 17h48
  3. Travailler avec des hexadécimaux
    Par LEK dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 18/09/2005, 04h24
  4. Réponses: 3
    Dernier message: 25/01/2005, 11h27
  5. Travailler avec des bits
    Par Vulvulune dans le forum Langage
    Réponses: 5
    Dernier message: 02/03/2003, 19h09

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