Lyc ´ee Thiers
TP PYTHON - 10
Les fonctions polynomiales, c’est la classe !
1. Introduction
Si nest un entier naturel non nul et a0, ..., an1sont des réels, on appelle fonction polynomiale ou, plus
briévement, polynôme, associé aux coecients a0, ..., an1, l’application Pde Rdans Rdéfinie par :
xR,P(x)=
n1
X
k=0
akxk.
Si l’on note Xla fonction x7→ xde Rdans R, on peut alors écrire : P=
n1
X
k=0
akXk.Xkdésigne ici la
fonction x7→ xk.
On montre que la somme, le produit, la composée de deux fonctions polynomiales est une fonction
polynomiale, la dérivée, les primitives d’une fonction polynomiale sont polynomiales.
Ces propriétés susent à justifier l’intérèt de définir une classe polynome qui modélise ces fonctions.
2. D´efinition dune classe polynome
On souhaite construire un objet de la classe polynome à partir d’un tuple de nombres. L’entête de la
définition de cette classe sera class polynome ou class polynome(object).
[Qu. 1] Compléter la définition de cette classe avec la surchage de la méthode spéciale __init__, qui
servira à créer et modifier l’attribut coeffs des objets de cette classe. On pourra débuter l’implémen-
tation de la surcharge par :
def __init__(self ,*a)
aest le tuple des coecients qui définissent le polynôme.
Faisons quelques essais :
>>>P= polynome (1 ,1 ,1)
>>>P. coeffs
[1, 1, 1]
>>> P
<__main__ . polynome object at 0x1029fb850 >
TP PYTHON - 10 2
[Qu. 2]
1) Tester les commandes suivantes :
>>> P= polynome (1 ,1)
>>> Q= polynome (1 ,1)
>>> P==Q
Comment expliquer la réponse de Python ?
2) Soit Pet Qdeux polynômes associés aux coecients a0, ..., an1et b0, ..., bm1respectivement. Si
nm, on montre que P=Qsi et seulement si, pour tout k[[0,n1]],ak=bket pour tout
k[[n,m1]],bk=0.
L’exemple précédent montre qu’il est donc indispensable de surcharger la fonction spéciale __eq__
pour obtenir une réponse en accord avec la théorie.
Ecrire cette méthode __eq__ pour obtenir par exemple :
>>> P= polynome (1 ,1,0 ,-2)
>>> Q= polynome (1 ,1,0 ,-2 ,0)
>>> P==Q
True
On débutera la définition de cette surcharge par :
def __eq__ (self ,Q):
le paramètre self désignant le premier polynôme du test d’égalité et Qle second.
[Qu. 3] On voudrait un achage des polynomes assez proche de l’habitude mathématique. Cela doit
donner pour le polynome précédent, l’achage suivant :
>>> P
1+X+X **2
et
>>>Q= polynome (1 ,0, -1 ,0,2)
>>> Q
1-X **2+2 X **4
Pour cela on doit surcharger la méthode spéciale __repr__. Une première version de cette méthode
pourrait ressembler à ceci :
def __repr__ ( self):
n=len(self . coeffs )
res =
k=0
while (k<n):
while (k<n)and(self . coeffs[k]==0) :
k+=1
if (k<n):
res =res ++’ +str(self.coeffs [k])+X** +str (k)
TP PYTHON - 10 3
k+=1
if res ==:
res =0
return res
Essayons cette représentation :
>>> P= polynome (1 ,0, -1 ,0,2)
>>> P
+1X **0+ -1 X **2+2 X **4
1) Identifier au moins trois aspects non satisfaisants de cette représentation.
2) Modifier cette surchage pour obtenir la représentation souhaitée.
3) Ecrire une fonction polyGeo de nqui ache le polynôme associé aux coecients ak=(1)nk
pour k[[0,n]].
Vous devez obtenir :
>>> polyGeo (10)
1-X+X **2 -X**3+X**4-X **5+X**6 -X**7+X**8-X **9+X**10
3. Les op´erations arithm ´etiques
L’addition. Soit Pet Qdeux polynômes tels que P=
n1
X
k=0
akXket Q=
m1
X
k=0
bkXk. On a alors :
P+Q=
n1
X
k=0
(ak+bk)Xk+
m1
X
k=n
bkXksi nm
m1
X
k=0
(ak+bk)Xk+
n1
X
k=m
akXksinon.
[Qu. 4]
1) Essayer les commandes suivantes :
>>> P= polynome (1 ,1)
>>> Q= polynome (1 ,1,0 ,-2)
>>> P+Q
2) Le résultat ne correspond pas à ce que l’on souhaite, d’où la nécessité de redéfinir l’opérateur
d’addition via la méthode __add__. Implémenter cette surcharge. Vérifier la validité de votre
méthode en obtenant l’achage suivant dans le shell :
>>>P= polynome (1 ,2,3 ,-4)
>>> P
1+2 X+3X**2 -4 X**3
>>> Q= polynome (3 ,-2 ,1)
>>> Q
3-2X+X**2
>>> P+Q
4+4 X **2 -4 X**3
TP PYTHON - 10 4
ou
>>> P= polyGeo (5)
>>> P
-1+X-X**2+ X**3-X **4+X**5
>>> Q= polyGeo (8)
>>> Q
1-X+X **2 -X**3+X**4-X **5+X**6 -X**7+X**8
>>> P+Q
X**6-X **7+X**8
3) La méthode spéciale __sub__ permet de redéfinir la soustraction. Le faire et tester cet opérateur.
Un exemple :
>>>P= polynome (1 ,2,3 ,-4)
>>> P
1+2 X+3X**2 -4 X**3
>>> Q= polynome (3 ,-2 ,1)
>>> Q
3-2X+X**2
>>> P-Q
-2+4X+2X**2 -4 X**3
>>> P-P
0
La multiplication scalaire. Si Pest un polynôme et αun réel, la fonction x7→ αP(x) est un polynôme
et se note αP.
Python fournit une méthode spéciale __rmul__ ( pour right multiplication), qui, si Pest un objet et a
un objet d’une autre classe, déclenche cette méthode de Plorsque l’objet a*P est créé.
Voici un exemple d’utilisation de cette multiplication scalaire :
>>> P= polynome (1 ,-2 ,1)
>>> -2*P
-2+4X -2X**2
[Qu. 5] Ecrire la définition de cette méthode pour que, si l’objet Preprésente le polynôme Pet ale
réel α, l’objet a*P représente le polynôme αP.
Le produit. Reprenons nos deux polynômes, P=
n1
X
k=0
akXket Q=
m1
X
k=0
bkXk. Naturellement, la fonction
produit, PQ, c’est à dire celle qui à tout xréel associe P(x)Q(x) est une fonction polynomiale et vérifie :
PQ =
n+m2
X
k=0
ckXk
les réels cks’exprimant à partir des réels a0, ..., anet b0, ..., bm. Précisément :
k[[0,n+m2]] ,ck=
min(n1,k)
X
i=max(km+1,0)
aibki
Par exemple, pour k=0, c0=a0b0et pour k=n+m2, cn+m2=an1bm1.
TP PYTHON - 10 5
[Qu. 6]
1) C’est la méthode spéciale __mul__ qui va nous permettre de définir notre produit de polynômes.
Redéfinir cette méthode pour qu’elle donne le résultat attendu lorsqu’on eectue le produit de
deux polynômes. Vous devriez obtenir, par exemple :
>>> Q= polynome (1 ,-2 ,1)
>>> Q
1-2X+X**2
>>> P= polynome (1 ,1)
>>> P
1+X
>>> P*Q
1-X -X**2+ X**3
>>>P*Q ==Q*P
True
2) Si nest un entier et Pun polynôme, Pnest encore un polynôme. Python permet avec la méthode
__pow__ ( power) d’obtenir Pnen écrivant P**n, si Pest un objet de type polynôme et nun entier
naturel. Bien entendu, pour cela il faut surcharger, un fois de plus, cette méthode. Implémenter
cette méthode dont la première ligne prendra la forme suivante :
def __pow__ (self ,n):
On utilisera, évidemment, la produit défini dans la question qui précède.
Par exemple :
>>> P= polynome (1 ,1)
>>> P**5
1+5 X+10 X **2+10 X **3+5 X**4+ X**5
3) Il existe aussi deux méthodes __radd__ et __rsub__ qui vont permettre d’ajouter ou de retrancher
un polynôme quelconque à un réel représentant un polynôme constant. Si l’on surchage ces
méthodes, on peut alors écrire :
>>>X= polynome (0 ,1)
>>> (1+ X+X **2) *(1+ X)
1+2 X+2X **2+ X **3
>>> (1+X)**5
1+5 X+10 X **2+10 X **3+5 X**4+ X**5
>>> (1-X)**5
1 -5X +10 X**2 -10 X **3+5 X **4 -X **5
A vous de jouer !
4. Une premi`ere application
Les polynômes de Tchébichev, (Tn)n0, sont définis par la propriété suivante :
xR,Tn(cos(x)) =cos(nx) (1)
On rappelle que deux polynômes qui coïncident en une infinité de valeurs de la variable xsont égaux
pour tout xréel.
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !