/*************************************************************************************************************************************/ /* */ /* 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