/*************************************************************************************************************************************/
/* */
/* D E F I N I T I O N S D E S F O N C T I O N S N E C E S S A I R E S */
/* A L ' E T U D E D E L ' A T O M E D ' H Y D R O G E N E : */
/* */
/* */
/* Author of '$xrq/Laguerre.31$I' : */
/* */
/* Jean-Francois COLONNA (LACTAMME, 1993??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P O L Y N O M E S D E L A G U E R R E : */
/* */
/* */
/* definition du polynome de Laguerre d'ordre (p,k) : */
/* */
/* k [ p+k ] */
/* k k d [ x d [ -x p+k]] */
/* L (x) = (-1) .-----[e .-------[e .x ]] */
/* p k [ p+k ] */
/* dx [ dx ] */
/* */
/* avec : */
/* */
/* k = 0,1,2,...,+infini */
/* p = 0,1,2,...,+infini */
/* */
/* Ceci est l'une des trois formules de Rodrigue. */
/* */
/* */
/* definition du polynome de Laguerre d'ordre (p,k) : */
/* */
/* s=p */
/* _____ */
/* \ 2 */
/* k \ s [(p+k)!] s */
/* L (x) = / (-1) .------------------.x */
/* p /____ (p-s)!.(k+s)!.s! */
/* */
/* s=0 */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C A L C U L O P T I M I S E D ' U N P O L Y N O M E D E L A G U E R R E D E T Y P E P(p,k,x) : */
/* */
/*************************************************************************************************************************************/
BFonctionF
DEFV(Local,DEFV(FonctionF,polynome_de_Laguerre_p_k(ordre_p,ordre_k,variable)))
DEFV(Argument,DEFV(Int,ordre_p));
/* Ordre 'p' du polynome de Laguerre. */
DEFV(Argument,DEFV(Int,ordre_k));
/* Ordre 'k' du polynome de Laguerre. */
DEFV(Argument,DEFV(Float,variable));
/* Variable pour laquelle evaluer le polynome de Laguerre. */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
Bblock
DEFV(Float,INIT(valeur_du_polynome,FZERO));
/* Valeur courante du polynome lors du processus iteratif. Cette valeur convient tout a */
/* fait a la methode de Horner qui sera utilisee par la suite. */
INIT_ERROR;
/*..............................................................................................................................*/
Test(IFOU(IZLT(ordre_p),IZLT(ordre_k)))
Bblock
PRINT_ERREUR("l'ordre 'p' et/ou l'ordre 'k' sont negatifs, une valeur nulle est renvoyee");
Eblock
ATes
Bblock
DEFV(Float,INIT(signe_du_monome_courant,COND(EST_PAIR(ordre_p),SIGNE_PLUS,SIGNE_MOINS)));
/* Signe du monome courant qui s'alterne a chaque iteration... */
DEFV(Int,INIT(indice_du_polynome,UNDEF));
/* Indice 's' de calcul du polynome... */
DoDe(indice_du_polynome,ZERO,ordre_p,I)
Bblock
EGAL(valeur_du_polynome
,AXPB(valeur_du_polynome
,variable
,DIVI(signe_du_monome_courant
,MUL3(FACT(SOUS(ordre_p,indice_du_polynome))
,FACT(ADD2(ordre_k,indice_du_polynome))
,FACT(indice_du_polynome)
)
)
)
);
/* Calcul optimise a l'aide de la methode de Horner du polynome de Laguerre : */
/* */
/* s=p */
/* _____ */
/* \ 2 */
/* k \ s [(p+k)!] s */
/* L (x) = / (-1) .------------------.x */
/* p /____ (p-s)!.(k+s)!.s! */
/* */
/* s=0 */
/* */
/* ou encore : */
/* */
/* s=p */
/* _____ */
/* \ */
/* k 2 \ s 1 s */
/* L (x) = [(p+k)!] . / (-1) .------------------.x */
/* p /____ (p-s)!.(k+s)!.s! */
/* */
/* s=0 */
/* */
EGAL(signe_du_monome_courant,NEGA(signe_du_monome_courant));
/* Inversion du signe du monome suivant... */
Eblock
EDoD
EGAL(valeur_du_polynome,MUL2(EXP2(FACT(ADD2(ordre_p,ordre_k))),valeur_du_polynome));
/* Multiplication finale par (p+k)! au carre qui ne change pas a l'interieur de la boucle */
/* de calcul du polynome. */
Eblock
ETes
RETU(valeur_du_polynome);
Eblock
EFonctionF