	RESOLUTION D'UNE EQUATION EN FORTH
	**********************************

        Mme si il s'agit d'un article sur le FORTH, la mthode elle-mme
pourra tre reprise dans tout autre langage manipulant les nombres rels.
La particularit du FORTH est que les oprateurs rels ne s'crivent pas
comme les oprateurs entiers...

LES OPERATEURS REELS
--------------------
        La structure de ce langage ne permet pas d'identifier avec
certitude la nature d'un paramtre sur la pile. Ainsi, le mot "+"
(l'addition) ne peut pas reconnatre un nombre entier d'un nombre rel, il
a donc fallu ajouter le mot "f+" qui fait le calcul rel et rserver "+"
pour les entiers. Le "f" vient de "virgule Flottante".
        On trouve donc f+, f-, f*, f/, f=, f>, fdup etc... pour manipuler
les rels. Chaque rel occupe 8 octets tant sur la pile qu'en RAM alors
qu'un entier habituel n'en occupe que 4.

LA METHODE DE RESOLUTION
------------------------
        On peut toujours mettre une quation sous la forme f(x)=0 en
basculant dans le premier membre. "f" est donc une expression dans
laquelle apparat une valeur "x" qu'on recherche.
        La mthode que je vous propose est itrative (par rptitions
successives d'un mme calcul) et converge assez rapidement vers la
solution. C'est la mthode de Newton qu'on peut appliquer sous des
conditions qui dpassent le cadre de cet article et qui sont trs souvent
remplies dans les quations courantes.

        Si x0 est une estimation de la solution, alors la valeur:
        x1 = x0 - f(x0)/f'(x0)
        est une meilleure estimation de la solution.
        Je calculerai donc ensuite:
        x2 = x1 - f(x1)/f'(x1)
        qui me donne encore une meilleure valeur, c'est  dire que l'cart
avec la solution se rduit, et ce de manire acclre au fil des
rptitions. On arrte lorsque la diffrence entre deux x successifs est
juge suffisament petite.

        Une question qui a du se poser: Qu'est-ce que ce f'(x)? C'est la
drive de la fonction f. Alors, je vous sens dus, pour rsoudre une
quation il faut driver une fonction? Ben pas forcment. On peut
facilement avoir une valeur approche de la drive qui ne nuit pas  la
prcision de la mthode:

        f'(x)=[f(x+e)-f(x)]/e
        Sachant que e est une valeur petite devant x, on prendra x/10000 ou
1/10000 si x est nul.

        La formule de Newton devient donc:
        x1=x0-e*f(x)/[f(x+e)-f(x)]

L'ALGORITHME
------------

        DEBUT
        si x=0 alors e=0.0001
        sinon e=0.0001*x

        poser y=x-e*f(x)/[f(x+e)-f(x)]

        si |y - x| assez petit, alors afficher y, FIN
        sinon, poser x=y et retour au DEBUT

LE PROGRAMME
------------
	On dclare d'abord les variables qui sont toutes des valeurs
relles:

&float x
&float y
&float e
&float erreur

>comp

	Ensuite, pour l'exemple, nous allons rsoudre l'quation cos(x)=x,
ce qui donne: cos(x)-x=0, c'est  dire que ma fonction vaut f(x)=cos(x)-x.
Le mot fonction attend sur la pile une valeur relle et renvoit la valeur
de la fonction correspondante:

: fonction
   fdup cos fswap f-
;

	Le mot principal newton attend sur la pile deux paramtres: l'un
est la premire estimation de la solution, qui peut tre assez grossire,
l'autre tant l'erreur absolue que l'on exige:

: newton
\ ** range les paramtres
   erreur f!
   x f!
   begin
\ ** calcul de e selon x
      x f@ %f0 f=
      if
         %f0.0001
      else
         %f0.0001 x f@ f*
      then
      e f!
\ ** calcul de f(x)
      x f@ fonction
\ ** calcul de f(x+e)
      x f@ e f@ f+ fonction
\ ** calcul de y
      fover f-
      f/
      e f@ f*
      x f@ fswap f-
      y f!
\ ** calcul de la diffrence |y-x|
      x f@ y f@ f- fabs erreur f@ f>
   while
\ ** si trop grand on boucle
      y f@ x f!
   repeat
\ ** sinon dpose y
   y f@
;

UTILISATION
-----------

	On sait que cos(0)>0 cos(1)<1, la solution de cos(x)=x se trouve
alors entre 0 et 1. Je vais prendre 1 comme valeur de dpart:

	%f1 %f0.1 newton f.

	Cette ligne demande le calcul de la solution  0.1 prs en partant
de 1. On obtient presque instantanment 0.739... comme solution. On peut
alors affiner:

	%f0.739 %f0.00001 newton f.

	Cette ligne demande une prcision de 0.00001 en partant de 0.739,
trs rapidement encore on obtient 0.7390851332. Vous verrez qu'en
demandant plus de prcision cette valeur ne bouge pas.

CONCLUSION
----------
	Ct FORTH, pour manipuler des nombres rels il faut:
	- dclarer les variables avec &float
	- prcder les oprateurs de "f" (f+, f-, etc...)
	- ajouter "%f" devant les constantes (%f5.3, etc...)

	Ct mthode, l'algorithme de Newton est trs simple  implanter
et rend bien des services: il converge rapidement et permet de contrler
l'erreur que l'on tolre par rapport  la solution exacte.

	Guillaume TELLO
	gtello@wanadoo.fr






