CALCUL DE
RACINES EN « J »
(suite)
Robert Coquidé
Dans « les nouvelles
d’APL » no 30 , la
pro-conjonction
NEWTON =. ]-([. % ].)
a été utilisée
de la manière suivante
: xn+1 =. (f NEWTON
fp) xn
où les verbes f
et fp représentent une fonction et sa dérivée
première,
x0, x1, x2
… est une suite convergeant vers X, racine de l’équation f(X) = 0.
Cette conjonction utilise la
formule mathématique (de NEWTON):
Son avantage est une
convergence rapide (ordre 2) si X est une racine simple.
Son inconvénient est une
convergence lente (ordre 1) si la racine X est d’ordre supérieur à 1.
Une formule mathématique (de
NEWTON « modifiée ») permet d’améliorer
les performances mais utilise
également fs (dérivée seconde) :
k= 0 formule de NEWTON « normale »
k= -1
convergence d’ordre 2 pour une racine d’ordre quelconque
k= -0.5 convergence
d’ordre 3 pour une racine simple.
Voici une pro-conjonction utilisant cette
formule de « NEWTON modifiée »:
NEWK =. 2 : '-`%`+/y.,(1 1,n.)**/(m.,:
1 1 0{m.)/. y.'
Utilisation : xn+1 =. ( f `fp`fs NEWK
k ) xn
avec k
= 0 , _1
ou _0.5
Remarque :
l’expression f `fp`fs est
un gérondif , sorte de
« vecteur de verbes » très pratique et puissant en langage J (un prochain article sera consacré aux gérondifs, « vecteurs et matrices
de verbes », et leurs possibilités de programmation).
La fonction a une racine
double : 2/3.
f =. 3 :
'(y.*(9*y.)-12*2 o. o. 3*y.)+2*1+2 o. o. 6*y.'
f 0.666666666666666666 NB.
verbe f
0
fp =. 3 :
'(18*y.*1+o. 2*1 o. o. 3*y.)-12*(2 o. o. 3*y.)+o. 1 o.
o. 6*y.'
fp 0.666666666666666666 NB. dérivée première fp
0
fs =. 3 :
'18+1p1 * +/(72,(y.*108p1),_72p1)*(1 2 2) o. (1 1 2)*(3p1)*y.'
fs 0.666666666666666666 NB. dérivée seconde fs
18
A =. f
`fp`fs
NB. Demande de 18 itérations ; valeur initiale 0.8
(,.(0 A)^:(i. 18)
0.8);(,.(_0.5
A)^:(i. 18) 0.8);(,.(_1 A)^:(i.
18) 0.8)
ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿
³0.8 ³0.8 ³0.8 ³
³0.75742422³0.73866536³0.69035650³
³0.72955101³0.70429402³0.66201012³
³0.70997265³0.68491518³0.66582546³
³0.69593834³0.67458327³0.66664465³
³0.68589205³0.66971234³0.66666665³
³0.67882459³0.66774445³0.66666667³
³0.67401492³0.66703369³0.66666667³
³0.67089727³0.66678990³0.66666667³
³0.66899378³0.66670785³0.66666667³
³0.66790068³0.66668040³0.66666667³
³0.66730468³0.66667125³0.66666667³
³0.66699148³0.66666819³0.66666667³
³0.66683061³0.66666718³0.66666667³
³0.66674903³0.66666684³0.66666667³
³0.66670795³0.66666672³0.66666667³
³0.66668733³0.66666668³0.66666667³
³0.66667701³0.66666667³0.66666667³
ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÙ
On constate :
Pour k = 0 la méthode « classique » de NEWTON a une convergence lente.
Pour k =_0.5 la méthode « modifiée » n’est pas sensiblement meilleure.
Pour k = _1 la méthode « modifiée » est nettement plus performante.
Cela s’explique par le fait que la racine calculée est d’ordre 2.
t=3D. 'corde tang ortho
oblique ordre3 toujours2 dichot newtondescartes =
E P'
t=3D. t,' OBL ORTHO NEWTON
nat NEWT ND DIC DESC '
SCRIPTNAMES=3D.t
E=3D. 1!:2&2
P=3D. 9!:11=20
corde =3D. 3 : 0 NB. Verbe
('ab')=3D.y.
c=3D. a-(f a)*(a-b)%((f a)-(f b))
((0< f c)#a),c,((0>f
c)#b)
:
[:
)
=20
tang =3D. 3 : 0 NB.
Verbe
y.-(f y.)%fp y.
:
[:
)
ortho =3D. 3 : 0 NB. Verbe
y.-(f y.)*(fp y.)%1+(fp y.)^2
:
[:
)
ORTHO =3D. 12 : ']-(x.@])*(y.@])%>:@(*:@(y.@]))' NB.
Conjonction
oblique =3D. 3 : 0 NB.
Verbe
y. -(f y.)%pente
:
[:
)
OBL =3D. ]-(([.@])@(%&].)) NB. Conjonction
ordre3 =3D.
3 : 0 NB. Verbe
y.-(f y.)*(fp y.)%(*:&fp
y.)-0.5*(f y.)*(fs y.)
:
[:
)
toujours2 =3D.
3 : 0 NB. Verbe
y.-(f y.)*(fp y.)%(*:&fp
y.)-(f y.)*(fs y.)
:
[:
)
dichot =3D. 3 : 0 NB. Verbe
('ab') =3D.y.
d =3D.f c =3D. 0.5*(a+b)
((d>0)#a),c,(d<0)#b=20
:
[:
)
newtondescartes =3D.
3 : 0 NB.
Verbe
('ab')=3D.y.
(a-(f a)*(a-b)%((f a)-(f b))),(b-(f b)%(fp b))
:
[:
)
nat =3D. 4!:0 NB. 0 : pro-nom 1 : pro-adverbe
NB. 2 : pro-conjonction 3 :
pro-verbe
NB.
NEWTON : Conjonction- Methode de NEWTON=20
NEWTON =3D. ]-([. % ].) =20
NB. ND :
Conjonction- Methode de Newton Descartes
ND =3D. ]-([.*(-/,1:)%(-/@[.,(].@}.))) =20
NB. DIC :
Adverbe - methode dichotomique
DIC =3D. 1 : ',(~:/"1*u.m)#m=3D.2 2$(-:+/y.),|.y.'
NB.
DESC : Adverbe - Methode de Descartes (cordes)
DESC=3D. 1 : =
'((3=3D#d)#2$c),(2=3D#d)#d=3D./:~c,((*u.y.)~:*u.c=3D.(-/(|.y.)*u.y.)%-/u.=
y.)#y.'
NB. NEWK :
Conjonction - Newton modifie
NB. (f`f1`f2 NEWK k) x0
avec k =3D 0 _1 ou _0.5
NEWK =3D. 2 : '-`%`+/y.,(1 1,n.)**/(m.,: 1 1
0{m.)/. y.'