Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 20-10-2013 20:50:07

Charmander
Membre
Inscription : 12-10-2013
Messages : 9

[Python] Fonction qui définit une fonction

Bonjour,

Je suis un débutant en Python, et je cherche à définir une fonction polynomiale à partir d'une liste P, c'est à dire écrire une fonction F qui à partir de la liste [a1,a2,...,an] définit et renvoie la fonction P(x)=a1+a2*x+...+an*x^n

Je sais comment m'en sortir avec le polynôme, en sommant les produits de x et les éléments de la liste... Mais c'est le fait de "définir une fonction qui définit et renvoie une autre" en général qui me bloque... Savez-vous comment le faire ? Merci d'avance :)

Hors ligne

#2 20-10-2013 22:56:47

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Fonction qui définit une fonction

Bonsoir,

Clarifions la situation...
En entrée (par exemple) L = [1,0,0,-3,5]
En sortie :
P(x)=1-3x^3+5x^4 c'est bien ça ?
Il faut passer par les chaînes de caractères.
Tu dois remarquer d'abord que l'indice des éléments :
1. Commence à zéro
2. Te donne donc directement l'exposant de x...
Donc il te faut lire L en ayant les coefficients et les indices de ces coefficients.

ll y a plusieurs façons de le faire.
1. a) Chercher la longueur de L ici len(L)=5
    b)  Lire L avec une boucle de 0 à 5 (ici) elle s'arrêtera à 4 puisque commençant à 0 de 0 à 4 il y a bien 5 valeurs
    c) Si i est l'indice de boucle L[i} te donne la valeur de l'élément

ou

2. a) Lire les éléments de L un par un, on écrit -->  for i in L:
    b) Soit on initialise un compteur à 0 ( par ex cpt=0) avant la boucle et dans ce cas après avoir écrit le monôme on incrémente le compteur cpt=cpt+1 (plus joli --> cpt+=1)
    c) soit on utilise la méthode index() : L.index(-3) renvoie 3. Inconvénient ici, il y a deux zéros, mais le problème est le même avec deux coefficients identiques...

ou

3. Employer enumerate(Liste) qui est fait pour :
   

for indice,coeff in enumerate(L):

   A chaque tour de boucle indice te donnera... l'indice du nombre lu et coeff la valeur lue : tu fais d'une pierre deux coups !
Une chaîne de caractère s'obtient ici avec str...
>>> print 1+2
3
mais
>>> print str(1)+str(2)
12
Bien sûr, tu peux écrire ici print "1"+"2", mais tu connais les nombres...
Dans le cas qui t'occupes il te faut concaténer
le coeff avec x, ^ et l'exposant.
Avec str(coeff)+"x^"+str(indice).
Le mieux est d'indiquer avant la boucle P="" puis à chaque tour de boucle de faire P=P+str(coeff)+"x^"+str(indice)
En fin de boucle et en dehors demander d'afficher le résultat par :
print "P(x) = "+P

Je pense que tu ne veux pas avoir 0x^2, ni 1x^0
Donc la boucle tu dois avoir 2 structures conditionnelles avec if...
La première :
si coeff == 0 tu passes un tour (c'est la commande pass) sinon (else) on traite le coefficient et on teste dans ce cas si indice ==0
si c'est le cas on utilise seulement P=P+str(coeff).
Encore un problème à traiter et si le coeff est > 0 on ne voit pas de + !...
Il te faut donc prévoir d'ajouter "+" devant le coeff si celui-ci est négatif...

Voilà; si j'ai bien compris ce que tu demandes, je t'ai fait l'inventaire des problèmes à résoudre et écrit un scénario informel...

A toi de mettre de l'ordre là-dedans ; je t'y aiderai au besoin.

@+

[EDIT]

si coeff == 0 tu passes un tour (c'est la commande pass) sinon (else) on traite le coefficient

Plus simple : on teste si coeff > 0 et tout se passe à l'intérieur de ce bloc if...

Dernière modification par yoshi (21-10-2013 08:16:00)

Hors ligne

#3 21-10-2013 08:15:51

Charmander
Membre
Inscription : 12-10-2013
Messages : 9

Re : [Python] Fonction qui définit une fonction

Bonjour,

Alors en fait, mon problème n'est pas dans la définition du polynôme avec la liste: ma méthode par exemple est

>>>def polynome(x):
         |S=0
         |for i in range(len(P)):
            |S=S+P[ i ]*(x**i)
         |return S

La consigne de mon exercice mot pour mot est "Ecrire une fonction getPol(P) qui à partir d'une liste définit et renvoie la fonction polynomiale f:x->P(x)"
C'est-à-dire que je voudrais coder une fonction, qui dans sa propre définition, définit une fonction à partir d'un paramètre, du style:

>>>def getPol(P):
          |def polynome(x):
              |(...)
              |return S
          |return polynome

Mais je ne suis pas sûr que ma syntaxe est bonne car lorsque j'exécute le programme puis je rentre par exemple polynome(5) ça m'affiche fonction "polynome" non définie.

Hors ligne

#4 21-10-2013 09:04:24

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Fonction qui définit une fonction

Salut,

Il me semble qu'il y a une confusion entre le mot fonction mathématique et le mot fonction informatique...
"Ecrire une fonction getPol(P) (informatique) qui à partir d'une liste définie renvoie la fonction polynomiale (maths) f:x->P(x)"
Et c'est plutôt en maths [tex] f:x->f(x)[/tex], mais c'est un détail.
Ecrire une fonction dans une fonction, c'est scabreux et peu recommandable...
D'autre part dans ton architecture, le return polynome fait allusion, je suppose, à def polynome alors pourquoi sors-tu de def GetPol avant même de sortir de def polynome qui lui est incluse.

Si tu dois écrire def GetPol(P):
P est est un argument que tu passes à ta fonction informatique GetPol()... Dans ce cas, il faut bien que P représente quelque chose, ce n'est qu'un "conteneur"...
Dans ce que tu fais, quelque chose, m'échappe : tu appelles polynôme(5).
Qu'est-ce que ton programme est censé faire avec 5 ? Calculer la valeur du polynôme pour x = 5 ? Bizarre, il n'en est pas question dans ton énoncé.

La liste est censée être définie quand ? Par qui ? Où ? Comment ?

Cela dit, je t'invite à aller ce topictous les intervenants sont des programmeurs en Python très confirmés...

Je pense toujours, jusqu'à plus amples détails, que tu ne dois définir qu'une seule fonction informatique def --> def GetPol(L):
où L est la liste [tex][a_0,a_1,\cdots, a_n][/tex] et qui retourne [tex]P=a_0+a_1x + a_2x+...a_nx^n[/tex] et où tu termines par print "P(x) =",P

@+

[EDIT]

Dans le post #1, Charmander a écrit :

Je suis un débutant en Python, et je cherche à définir une fonction polynomiale à partir d'une liste P

Ceci confirme ce que je dis.
Si j'en crois ce que tu dis, tu vas passer en argument à GetPol(), la liste L des coefficients du Polynôme et cette fgonction devra retourner le polynôme P écrit...
Il y a déjà bien assez de cas à étudier pour qu'un débutant se mélange les crayons sans ajouter une (grosse) problématique complémentaire.
Lancer un débutant dans des fonctions imbriquées ? Non, ce ne serait pas sérieux, donc ce n'est pas ce qui est attendu...

Dernière modification par yoshi (21-10-2013 09:17:28)

Hors ligne

#5 21-10-2013 12:20:21

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Fonction qui définit une fonction

Bonjour,

Voilà, j'ai fait le programme.
Je t'en donne la sortie commentée.

# Définition de L
L = [1, -7, 0, 2, -3, 0, 5]

# Appel de GetPol par GetPol(L) qui écrit la fonction polynomiale :
P(x) = 1-7x+2x^3-3x^4+5x^6
>>>

@+

Hors ligne

#6 27-10-2013 20:50:55

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 17 385

Re : [Python] Fonction qui définit une fonction

Bonsoir,

Code simple :

#!/usr/bin/env python
# -*- coding: cp1252 -*-

def GetPol(L):
    P=""
    var="x"
    if L==[0]:
        P="0"
    for indice,coeff in enumerate(L):        
        if coeff!=0:
            if indice==0:
                P=str(coeff)
            else:
                if abs(coeff)==1:
                    cof=""
                    if coeff==-1:
                        signe="-"
                    else:
                        signe="+"
                else:
                    cof=str(abs(coeff))
                    if coeff<0:
                        signe="-"
                    else:
                        signe="+"
                if indice==1:
                    expo=""
                else:
                    expo="^"+str(indice)
                P=P+signe+cof+var+expo
    print "P(x) =",P
    return P

print "# Définition de L"
L=[1,-7,0,2,-3,0,5]

print "L =",L
print
print "# Appel de GetPol par GetPol(L) qui écrit la fonction polynomiale :"
GetPol(L)

Sortie : post #5 ci-dessus.

Code avec calcul de valeur :

#!/usr/bin/env python
# -*- coding: cp1252 -*-

def GetPol(L,x):
    P=""
    var="x"
    if L==[0]:
        P="0"
    for indice,coeff in enumerate(L):        
        if coeff!=0:
            if indice==0:
                P=str(coeff)
            else:
                if abs(coeff)==1:
                    cof=""
                    if coeff==-1:
                        signe="-"
                    else:
                        signe="+"
                else:
                    cof=str(abs(coeff))+"*"
                    if coeff<0:
                        signe="-"
                    else:
                        signe="+"
                if indice==1:
                    expo=""
                else:
                    expo="**"+str(indice)
                P=P+signe+cof+var+expo
    print "P(x) =",P
    print "P("+str(x)+") =",eval(P)
    return P

print "# Définition de L"
#L=[0,-1,7,0,0,-1,-4,5]
L=[-1,3,-3,1]
n=2
print "n =",n

print "L =",L
print
print "# GetPol(L,x) va écrire la fonction polynomiale et calculer P(n) :"
GetPol(L,n)

Quelques sorties :

# Définition de L
n = 2
L = [-1, 3, -3, 1]

# GetPol(L,x) va écrire la fonction polynomiale et calculer P(n) :
P(x) = -1+3*x-3*x**2+x**3
P(2) = 1
>>> ================================ RESTART ================================
>>>
# Définition de L
n = -3
L = [-1, 3, -3, 1]

# GetPol(L,x) va écrire la fonction polynomiale et calculer P(n) :
P(x) = -1+3*x-3*x**2+x**3
P(-3) = -64
>>> ================================ RESTART ================================
>>>
# Définition de L
n = 2
L = [10, -13, 2, 1]

# GetPol(L,x) va écrire la fonction polynomiale et calculer P(n) :
P(x) = 10-13*x+2*x**2+x**3
P(2) = 0
>>>

@+

Hors ligne

#7 28-10-2013 18:53:17

Barbichu
Membre actif
Inscription : 15-12-2007
Messages : 405

Re : [Python] Fonction qui définit une fonction

Bonjour Charmander,

Charmander a écrit :

Mais je ne suis pas sûr que ma syntaxe est bonne car lorsque j'exécute le programme puis je rentre par exemple polynome(5) ça m'affiche fonction "polynome" non définie.

Ton programme est tout à fait correct, tu ne l'as juste pas bien utilisé !


def getPoly(l):
    def polynome(x):
        S = 0
        for i in range(len(l)):
            S += l[i] * (x ** i)
        return S
    return polynome

P = getPoly([1,2]) # P est la fonction polynomiale 1 + 2x
P(2)
 

Remarque qu'un code utilisant la méthode de Horner sera plus efficace :


def horner(l):
    def polynome(x):
        S = 0
        for a in reversed(l):
            S = S * x + a
        return S
    return polynome

P = horner([1,2]) # P est la fonction polynomiale 1 + 2x,  calculé par la méthode de Horner cette fois-ci.
P(2)
 

Quant à l'utilisation de python comme langage fonctionnel c'est tout à fait possible mais pas vraiment "dans le style python", mais chacun ces goûts, et moi j'aime bien.

A+

Dernière modification par Barbichu (28-10-2013 19:56:01)

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
vingt huit plus
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums