Funciones std::legendre, std::legendref y std::legendrel en C++17

Legendre, legendref y legendrel son funciones integradas en C++ STL que se utilizan para calcular el valor de polinomios no asociados de grado n y argumento x. El valor de orden-n polinomio de Legendre no asociado de x viene dado por:

  \[         \ P_{n}(x)= \frac{1}{2^{n}n!}\frac{d^{n}}{dx^{n}}(x^{2}-1)^{n}      \]

Los primeros polinomios de Legendre son

  \[      Legendre(0,x)= 1 \]  \[      Legendre(1,x)= x \]  \[      Legendre(2,x)= \frac{1}{2} ( 3x^{2}-1 ) \] \[      Legendre(3,x)= \frac{1}{2} ( 5x^{3}-3x ) \]

Sintaxis:

double legendre( unsigned int n, double x )
             or 
double legendre( unsigned int n, float x )
             or 
double legendre( unsigned int n, long double x )
             or
float legendref( unsigned int n, float x )
             or
long double legendrel( unsigned int n, long double x )

Parámetros : la función acepta dos parámetros obligatorios que se describen a continuación:

  • n: especifica el grado del polinomio.
  • x: especifica el argumento que denota un valor de tipo coma flotante o integral

Valor devuelto: la función devuelve el valor del polinomio de Legendre no asociado de orden n para el argumento x. El tipo de retorno depende de los parámetros pasados.

Nota : la función se ejecuta en y por encima de C++ 17 (7.1).

El siguiente programa ilustra las funciones mencionadas anteriormente:

// C++ program to illustrate the above 
// mentioned three functions
#include <cmath> 
#include <iostream>
using namespace std;
int main()
{
    // int and double as parameter 
    cout << "legendre(2,0.3)= " << legendre(2,0.3);
      
    //  x as double type parameter
    cout << "\nlegendre(3,(double)0.4)=" << legendre(3,(double)0.4);
      
     // x as float 
     cout << "\nlegendre(3,(float)0.4)= " << legendre(3,(float)0.4);
  
    //  legendref 
    cout << "\nlegendref(3, 0.45)= " << legendref(3, 0.45);
  
    // legendrel
    cout << "\nlegendrel(7, 0.50)= " << legendrel(7, 0.50);
      
    return 0;
}

Errores y excepciones : la función arroja un error en tres casos que se describen a continuación:

  • Si el argumento es NaN, se devuelve NaN y no se notifica el error de dominio
  • No es necesario definir la función para |x|>1
  • Si n es mayor o igual que 128, el comportamiento está definido por la implementación

Los siguientes programas ilustran los errores anteriores:

Programa 1:

// C++ program to illustrate the above 
// mentioned three functions
// domain error
#include <cmath> 
#include <iostream>
using namespace std;
int main()
{
    // int and double as parameter 
    cout << "legendre(129, 2)= " << legendre(129, 2);
          
    return 0;
}

Producción:

terminate called after throwing an instance of 'std::domain_error'
  what():  Argument out of range in __poly_legendre_p.
legendre(129, 2)=

Programa 2:

// C++ program to illustrate the above 
// mentioned three functions
// when x is NaN
#include <cmath> 
#include <iostream>
using namespace std;
int main()
{
    // int and double as parameter 
    cout << "legendre(129, NaN)= " << legendre(129, sqrt(-2));
      
    return 0;
}

Producción:

legendre(129, NaN)= nan

Programa 3:

// C++ program to illustrate the above 
// mentioned three functions
// domain error
#include <cmath> 
#include <iostream>
using namespace std;
int main()
{
    // int and double as parameter 
    cout << "legendre(129, 2)= " << legendre(129, 2);
      
    return 0;
}

Producción:

terminate called after throwing an instance of 'std::domain_error'
  what():  Argument out of range in __poly_legendre_p.

Publicación traducida automáticamente

Artículo escrito por Pathak7 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *