from numpy import *
from numpy.polynomial import polynomial as poly
On définit le polynôme de Wilkinson à partir de ses racines 1,2,...,20.
w_roots = range(1,21)
print w_roots # les racines du polynôme
w = poly.polyfromroots(w_roots)
print w # les coefficients du polynôme
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] [ 2.43290201e+18 -8.75294804e+18 1.38037598e+19 -1.28709312e+19 8.03781182e+18 -3.59997952e+18 1.20664780e+18 -3.11333643e+17 6.30308121e+16 -1.01422999e+16 1.30753501e+15 -1.35585183e+14 1.13102770e+13 -7.56111184e+11 4.01717716e+10 -1.67228082e+09 5.33279460e+07 -1.25685000e+06 2.06150000e+04 -2.10000000e+02 1.00000000e+00]
On calcule les racines de w avec la commande roots
. A noter: la commande roots
prend un vecteur p de taille n+1
des coefficients d'un polynôme de la forme
p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n]
. La commande polyfromroots
retourne les coefficients dans l'ordre inverse, avec p[0]
le coefficient de x**n
. On inverse l'ordre les coefficient d'un vecteur w
par w[::-1]
.
roots(w[::-1])
array([ 20.00023935, 18.99816368, 18.00602676, 16.98888481, 16.01139969, 14.99558051, 13.99573055, 13.00781108, 11.99427495, 11.00229723, 9.99964661, 8.99987936, 8.00008587, 6.99997611, 6.00000375, 4.99999967, 4.00000001, 3. , 2. , 1. ])
Le coefficient de $x^{19}$ est w[19]=-210
w[19]
-210.0
On définit un polynôme modifié, avec le coefficient w[19]
soustrait de $2^{-23}$
w_mod = w
w_mod[19] = -210.0 - 2**(-23)
print w_mod[19]
-210.000000119
w_mod_roots = roots(w_mod[::-1])
w_mod_roots = w_mod_roots[::-1]
print w_mod_roots
[ 1.00000000+0.j 2.00000000+0.j 3.00000000+0.j 3.99999995+0.j 5.00000050+0.j 6.00000243+0.j 6.99972610+0.j 8.00708005+0.j 8.91802747+0.j 10.09549017-0.64215182j 10.09549017+0.64215182j 11.79339292-1.65177055j 11.79339292+1.65177055j 13.99216589-2.51869293j 13.99216589+2.51869293j 16.73066159-2.81261066j 16.73066159+2.81261066j 19.50241962-1.94033228j 19.50241962+1.94033228j 20.84690323+0.j ]
w_roots - w_mod_roots
array([ -2.55351296e-13+0.j , 4.66759964e-11+0.j , -2.19776553e-09+0.j , 4.75010893e-08+0.j , -5.02227952e-07+0.j , -2.43480715e-06+0.j , 2.73895700e-04+0.j , -7.08004917e-03+0.j , 8.19725340e-02+0.j , -9.54901726e-02+0.64215182j, 9.04509827e-01-0.64215182j, 2.06607083e-01+1.65177055j, 1.20660708e+00-1.65177055j, 7.83411389e-03+2.51869293j, 1.00783411e+00-2.51869293j, -7.30661591e-01+2.81261066j, 2.69338409e-01-2.81261066j, -1.50241962e+00+1.94033228j, -5.02419622e-01-1.94033228j, -8.46903229e-01+0.j ])
Certaines racines sont significativement déplacées.
print w_mod_roots[10], w_roots[10]
(10.0954901726+0.642151822585j) 11