CALCUL DE RACINES EN « J »
R. Coquidé
Racines d’un polynôme
(expression usuellement utilisée pour « solutions d’une
équation polynomiale »)
Le
langage J est pourvu d’un outil puissant pour calculer les racines d’un
polynôme : le verbe «
p. ».
Il
est possible de définir un polynôme par ses racines.
Par
exemple le polynôme suivant défini par ses facteurs
3(x-1)(x-2)(x+1.5)(x-0.5)(x-1.2)
sera créé par
[pr =. 3;1 2 _1.5 0.5 1.2
NB. On peut remarquer le
NB. facteur 3 et la «mise en boîte »
NB. de la variable pr (pro-nom)
ÚÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³3³1 2 _1.5 0.5 1.2³
ÀÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Avec le verbe « p. »,
calcul des coefficients du polynôme :
[pc
=. p. prNB. A partir des racines
5.4 _19.8 19.05 1.95 _9.6 3
NB. Ici, pas de« boîte »
Avec le même verbe « p. » calcul des racines à partir
des coefficients :
p. pc NB. rangées dans l’ordre des modules décroissants
ÚÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³3³2 _1.5 1.2 1 0.5³
ÀÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Les racines complexes sont acceptées … et traitées…
[pr
=. 2 ; 0j0.2 _1 0j_0.2 1j2 1j_2 2
ÚÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³2³0j0.2 _1 0j_0.2 1j2 1j_2 2³
ÀÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
[pc
=. p. pr
_0.8 _0.08 _19.6 _2.24 10.08 _6 2
p. pc
ÚÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³2³1j2 1j_2 2 _1 0j0.2 0j_0.2³
ÀÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
…
les coefficients complexes aussi
[pr
=. 2j_1 ; 1j0.1 _1 0j_0.2 1j2 1j_2 _2j_0.5
ÚÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³2j_1³1j0.1 _1 0j_0.2 1j2 1j_2 _2j_0.5³
ÀÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
[pc
=. p. pr
_0.55j_4.6
_23.13j2.39 _0.57j5.01 22.25j_6.35 _1.16j_2.17
0.6j1.2 2j_1
p. pc
ÚÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³2j_1³1j2 1j_2 _2j_0.5 1j0.1 _1j0 0j_0.2³
ÀÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Solution de f(x) =
0 où f(x) n’est pas polynomiale
(on suppose connu un intervalle [a , b] contenant une solution et une seule : x).
Il
est permis de s’inspirer de l’algorithme de NEWTON (ou de la tangente):
xn+1 = xn – f(xn)/f’(xn) qui
calcule xn+1, approximation meilleure que xn
NEWTON =. ]-([. % ].) NB. conjonction
Usage : xn+1 =. (f
xn+k =.
( (f NEWTON fp)^ : k ) xn
Ici, on utilise la « puissance
fonctionnelle » k ( entier positif ou nul ).
La suite récurrente (xn) converge (quand tout se passe bien !)
vers x, racine de l’équation f(x) = 0 ; fp(x) est la dérivée de f(x)
Exemple :
pour résoudre x =
cos(x) ou f(x) = 0
avec f(x) = x – cos(x),
écrivons :
f
=. –2&o. NB. verbe
représentant la fonction x-cos(x)
fp =. 1:
+ 1&o. NB. verbe représentant sa dérivée première
Partons de x0 =
1.5NB.
Si nous utilisons
NB. xn+1
= cos(xn)
,. (2&o.)^:(i.20) 1.5
1.5
0.070737201667703
0.997499167206586
0.542404992339220
0.856469708947328
0.655108801780784
0.792981645797353
0.701724168276573
0.763730311290859
0.722261082134520
0.750312885709986
0.731475558034674
0.744189586630583
0.735637098348715
0.741403372909269
0.737521554461599
0.740137474793432
0.738375854160239
0.739562726170268
0.738763336576956
etc…
Convergence
lente
( d’ordre 1 )
NB.
Si nous utilisons
NB.
la conjonction NEWTON
,.
(f NEWTON fp)^:(i.6)
1.5
1.5
0.784472397719411
0.739518709832052
0.739085174705196
0.739085133215161
0.739085133215161
Convergence
beaucoup
plus
rapide
( d’ordre
2 ).
On
a défini et exécuté
P
=. 9!:11
P 15
pour
obtenir 15 chiffres affichés.
,.
(f NEWTON fp)^:(_)
1.5
0.739085133215161
Utilisation
de la « puissance
fonctionnelle
» infinie.
A suivre!