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

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).

 

Exemple d’utilisation de la pro-conjonction   NEWK 

 

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    NEWK        NB. :  pro-adverbe  ;  (k  A) : pro-verbe

(P  =. 9 ! :11)  8         NB. 8 chiffres affichés

   

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.'