¿Hay alguna directiva de preprocesador que pueda usarse para usar la función polylog? ¿O está incluido en cmath? Si es así, ¿lo llamas Li o Polylog?
EDITAR: lo que realmente estoy tratando de hacer es dar un valor analítico para la integral indefinida de la función
que implica funciones de polilogaritmo. Pero si alguien tiene una sugerencia para otra forma de integrar esta función analíticamente, sería bienvenido cualquier idea.
c++
special-functions
flamencos
fuente
fuente
Respuestas:
Hay una biblioteca GPL'd C, ANANT - Algorithms in Analytic Number Theory de Linas Vepstas, que incluye la implementación de multiprecisión del polilogaritmo, basado en GMP .
Desde su archivo README:
La GSL (GNU Scientific Library) aparentemente solo tiene la función de dilogaritmo . Sin embargo, siguiendo una pista de @JM, se encuentra la función Debye que proporciona la integral ulterior (hasta un múltiplo escalar) implementada con doble precisión (consulte GSL 7.10 Órdenes de funciones Debye 1 a 6):
El software de integración simbólica como Mathematica o Maxima proporciona:
El lado izquierdo es obviamente un valor puramente real si , pero los polilogaritmos mostrados tendrán un valor complejo (porque , por lo que la igualdad depende de la cancelación total de partes imaginarias). Podemos evitar la necesidad de aritmética compleja en este caso sustituyendo la expresión:x > 0 miX> 1
Esto es una mejora porque con los argumentos de pollogaritmo en , los resultados son valores puramente reales. Tenga en cuenta el resultado adecuado cuando es cero, y esto se logra mediante la cancelación entre el término inicial y la constante. Por lo tanto, el error relativo podría ser un problema para pequeños valores positivos de .[ 0 , 1 ] x = 0 X
Tenga en cuenta que nuestra misteriosa constante es el límite superior limitante en estas integrales (monótonas):π4 4/ 15
Ahora podemos volver a la pregunta del título, ¿Cómo usar la función de polilogaritmo en c ++? Vale la pena señalar que no existe una implementación estándar de funciones de polilogaritmo para C o incluso C ++ . Si el objetivo es evitar cualquier biblioteca adicional para su implementación, lo bastante bien lo lleva a desarrollar sus propias rutinas, tal vez en la línea sugerida por el documento de David C. Wood al que enlaza la Respuesta de GertVdE.
Además de las rutinas de multiprecisión sugeridas en la primera parte de mi Respuesta, hay una biblioteca matemática de doble precisión madura (gratuita) en Cephes por Stephen L. Moshier que implementa versiones reales (
polylog
) y complejas (cpolylog
) de las funciones especiales del polilogaritmo. Aunque su precisión depende en parte de las funciones matemáticas estándar subyacentes de C, la documentación fuente de Cephes informa sobre las pruebas y los errores teóricos máximos para las órdenes 1 a 4 en aproximadamente los límites de la doble precisión.Alternativamente, es posible que desee utilizar otro software para verificar directamente (sin hacer referencia a los policlogaritmos) las rutinas de cuadratura que escribió para su integral. Como esbozo en esta pregunta de Math.SE , la serie de potencia centrada en el origen de la integral tiene una convergencia limitada, pero esto se puede mitigar mediante el uso de una expansión de fracción continua en su lugar.
Para una satisfacción inmediata, recomiendo las rutinas QUADPACK de cuadratura numérica (gratis) incluidas en Maxima , específicamente
quad_qag
. Por ejemplo, encuentre la integral sobre [0,5] con este comando Maxima:De los argumentos de entrada, solo el último lleva una explicación. El quinto argumento para
quad_qag
especificar qué regla aplicar en la cuadratura adaptativa. Los valores posibles son de 1 a 6 y ofrecen una sofisticación / precisión cada vez mayor. La línea de salida proporciona primero la cuadratura numérica, seguida de una estimación de su error absoluto, el número de subintervalos / pasos utilizados y un código de retorno (aquí cero significa que no se encontraron errores o condiciones especiales).fuente
En primer lugar, debe elegir en función de su aplicación si necesita una aritmética de alta precisión (es decir, ¿estará satisfecho con los resultados de doble precisión de IEEE para las funciones de polylog o necesita una mayor precisión)? Si necesita alta precisión, puede buscar en la familia de herramientas de la biblioteca GMP.
Si no lo hace, puede usar aproximaciones. Algunas investigaciones literarias me señalaron este artículo . Al final del artículo, hay una "tabla de selección": en función de los argumentos de los polylogs que necesita, puede seleccionar una fórmula de aproximación. Pero tenga cuidado de verificar la estabilidad y la precisión.
Si no necesita demasiadas evaluaciones (no en un bucle anidado), simplemente optaría por la cuadratura numérica utilizando el método de doble exponencial.
fuente
j j =Fj(x) j j=−12,12,32
fuente