Existe alguma diretiva de pré-processador que possa ser usada para usar a função polylog? Ou está incluído no cmath? Se sim, você o chama por Li ou por polylog?
EDIT: O que realmente estou tentando fazer é fornecer um valor analítico para a integral indefinida da função
que envolve funções de polilogaritmo. Mas se alguém tiver uma sugestão para outra maneira de integrar essa função analiticamente, eu seria bem-vindo a todas as idéias.
c++
special-functions
flamingohats
fonte
fonte
Respostas:
Existe uma biblioteca C da GPL, ANANT - Algorithms in Analytic Number Theory, de Linas Vepstas, que inclui a implementação multiprecisão do polilogaritmo, com base no GMP .
Do seu arquivo LEIA-ME:
Aparentemente, a GSL (GNU Scientific Library) possui apenas a função de dilogaritmo . No entanto, seguindo uma dica do @JM, encontra-se a função Debye, que fornece a integral ulterior (até um múltiplo escalar) implementada em dupla precisão (consulte GSL 7.10 Debye Functions, pedidos de 1 a 6):
Software de integração simbólica, como Mathematica ou Maxima, fornece:
O lado esquerdo é obviamente um valor puramente real se , mas os polilogaritmos mostrados serão de valor complexo (porque e, portanto, a igualdade depende do cancelamento total de partes imaginárias). Podemos evitar a necessidade de aritmética complexa neste caso, substituindo a expressão:x > 0 ex> 1
Isso é uma melhoria porque, com argumentos de polilogaritmo em , os resultados são valores puramente reais. Observe o resultado apropriado quando é zero, e isso é obtido pelo cancelamento entre o termo inicial e a constante. Assim, o erro relativo pode ser um problema para pequenos valores positivos de .[ 0 , 1 ] x = 0 x
Observe que nossa constante misteriosa é o limite superior limitador dessas integrais (aumento monótono):π4/ 15
Agora podemos revisitar a pergunta do título: Como usar a função polilogaritmo em c ++? Vale ressaltar que não há implementação padrão de funções de polilogaritmo para C ou mesmo C ++ . Se o objetivo é evitar qualquer biblioteca adicional para sua implementação, é muito bom que você role suas próprias rotinas, talvez seguindo as linhas sugeridas pelo artigo de David C. Wood ao qual a resposta de GertVdE está vinculada.
Além das rotinas de multiprecisão sugeridas na primeira parte da minha resposta, existe uma biblioteca matemática de precisão dupla (livre) madura em Cephes, de Stephen L. Moshier, que implementa as versões real (
polylog
) e complexa (cpolylog
) das funções especiais do polilogaritmo. Embora sua precisão dependa em parte das funções matemáticas padrão subjacentes de C, a documentação da fonte Cephes relata testes e erros teóricos de pico para pedidos de 1 a 4, aproximadamente nos limites da precisão dupla.Como alternativa, você pode usar outro software para verificar diretamente (sem referenciar polilogaritmos) as rotinas de quadratura que você escreveu para sua integral. Como esboço nesta pergunta Math.SE , a série de potências centrada na origem da integral tem convergência limitada, mas isso pode ser atenuado usando uma expansão de fração contínua.
Para gratificação imediata, recomendo as rotinas QUADPACK de quadratura numérica (gratuita) incluídas no Maxima , especificamente
quad_qag
. Por exemplo, encontre a integral acima de [0,5] com este comando Maxima:Dos argumentos de entrada, apenas o último tem uma explicação. O quinto argumento
quad_qag
especifica qual regra aplicar em quadratura adaptativa. Os valores possíveis são de 1 a 6 e oferecem sofisticação / precisão crescentes. A linha de saída fornece primeiro a quadratura numérica, seguida por uma estimativa de seu erro absoluto, o número de subintervalos / etapas usados e um código de retorno (aqui zero significa que não há erro ou condições especiais encontradas).fonte
Antes de tudo, você deve escolher com base na sua aplicação se precisar de aritmética de alta precisão (ou seja, ficará satisfeito apenas com os resultados de precisão dupla IEEE para as funções do polilog ou precisa de maior precisão)? Se você precisar de alta precisão, poderá procurar na família de ferramentas da biblioteca GMP.
Caso contrário, você pode usar aproximações. Algumas pesquisas de literatura me indicaram este artigo . No final do artigo, há uma "tabela de seleção": com base nos argumentos dos polilogos de que você precisa, você pode selecionar uma fórmula de aproximação. Mas tenha cuidado para verificar a estabilidade e a precisão.
Se você não precisar de muitas avaliações (não em um loop aninhado), eu usaria a quadratura numérica usando o método exponencial duplo.
fonte
A GSL também possui integrais Fermi-Dirac completas , para o número e . Essas funções são equivalentes aos polylogs Embora observe a restrição aos argumentos negativos do polylog para real .j j = - 1Fj(x) j Fj(x)=-Lij+1(-e-x)xj=−12,12,32
fonte