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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.