Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#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 :
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 topic où tous 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]
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.
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 :
# -*- 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 :
# -*- 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,
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







