5 votos

¿Breve cálculo del dilogaritmo?

¿Existe una forma agradable de implementar la función dilogaritmo para valores reales, sin tener que realizar la integración?

Una solución en series hubiera sido ideal, pero la serie alrededor de $0$ tiene un radio de convergencia de $1$, por lo que no funciona para valores mayores de $x$. Idealmente, estoy buscando un método "elegante", en lugar del método más "rápido".

Para referencia, la biblioteca gsl utiliza más de 650 líneas de código para la implementación, pero estoy buscando algo un poco más compacto.

8voto

Anthony Shaw Puntos 858

La página citada de Wikipedia da la expansión $$ \mathrm{Li}_2(x)=\frac{\pi^2}{3}-\frac12\log(x)^2-\sum_{k=1}^\infty\frac1{k^2x^k}-i\pi\log(x)\tag{1} $$ para $x\ge1. Combinada con $$ \mathrm{Li}_2(x)=\sum_{k=1}^\infty\frac{x^k}{k^2}\tag{2} $$ para $|x|\le1$, deberías obtener lo que necesitas.


La ecuación $(1)$ también funciona para $x\le-1$ si usamos $\log(x)=\log(-x)-\pi i$: $$ \mathrm{Li}_2(x)=-\frac{\pi^2}{6}-\frac12\log(-x)^2-\sum_{k=1}^\infty\frac1{k^2x^k}\tag{3} $$ para $x\le-1$.


Fórmula de Inversión $$ \begin{align} \mathrm{Li}_2(x) &=-\int_0^x\log(1-t)\frac{\mathrm{d}t}{t}\\ &=\frac{\pi^2}{6}-\int_1^x\log(1-t)\frac{\mathrm{d}t}{t}\\ &=\frac{\pi^2}{6}-\pi i\log(x)-\int_1^x\log(t-1)\frac{\mathrm{d}t}{t}\\ &=\frac{\pi^2}{6}-\pi i\log(x)-\int_{1/x}^1\log(1/t-1)\frac{\mathrm{d}t}{t}\\ &=\frac{\pi^2}{6}-\pi i\log(x)-\int_{1/x}^1\Big(\log(1-t)-\log(t)\Big)\frac{\mathrm{d}t}{t}\\ &=\frac{\pi^2}{6}-\pi i\log(x)+\frac{\pi^2}{6}+\int_0^{1/x}\log(1-t)\frac{\mathrm{d}t}{t}+\int_{1/x}^1\log(t)\frac{\mathrm{d}t}{t}\\ &=\frac{\pi^2}{3}-\pi i\log(x)-\mathrm{Li}_2(1/x)-\frac12\log(x)^2\tag{4}\\ &=-\frac{\pi^2}{6}-\mathrm{Li}_2(1/x)-\frac12\log(-x)^2\tag{5} \end{align} $$ $(2)$ y $(4)$ demuestran la expansión $(1)$. $(2)$ y $(5)$ demuestran la expansión $(3)$.


Fórmula de Duplicación $$ \begin{align} \mathrm{Li}_2(x) &=-\int_0^x\log(1-t)\frac{\mathrm{d}t}{t}\\ &=-\int_0^1\log(1-t)\frac{\mathrm{d}t}{t}+\int_x^1\log(1-t)\frac{\mathrm{d}t}{t}\\ &=\frac{\pi^2}{6}+\int_0^{1-x}\log(t)\frac{\mathrm{d}t}{1-t}\\ &=\frac{\pi^2}{6}-\log(x)\log(1-x)+\int_0^{1-x}\log(1-t)\frac{\mathrm{d}t}{t}\\ &=\frac{\pi^2}{6}-\log(x)\log(1-x)-\mathrm{Li}_2(1-x)\tag{6}\\ \mathrm{Li}_2(x)+\mathrm{Li}_2(1-x) &=\frac{\pi^2}{6}-\log(x)\log(1-x)\tag{7} \end{align} $$

2voto

Andrew Redd Puntos 1693

No sé qué tan bien se compara esto con otros métodos, pero es uno que he ideado con el propósito de calcular el polilogaritmo para valores de z cerca del círculo unitario. En el caso del dilogaritmo, el grupo de razones anarmónicas permite reducir el cálculo en el caso general a una región fundamental para ese grupo. Sin embargo, eso parece implicar todavía cálculos para valores cerca (o en) del círculo unitario, en particular las raíces cúbicas de -1 en el semiplano derecho son puntos fijos para ese grupo, por lo que es necesario calcular esos. Y valores cercanos.

Una aproximación racional al polilogaritmo se puede conseguir con polos en el corte de rama (donde deberían estar para cualquier aproximación decente). El teorema de Runge garantiza que habrá muchos.

Hemos llegado a esta:

$$\text{Li}_{s}(z)\approx \frac{\pi z}{Γ(s)\sqrt{N}} \sum_{k=-N}^{N}\frac{e^{k\pi/\sqrt{N}}}{(e^{k\pi/\sqrt{N}}+1-z)(1+e^{k\pi/\sqrt{N}})} \log^{s-1}(1+e^{k\pi/\sqrt{N}})$$ $$= z\sum_{k=-N}^{N}\frac{w_{k}}{λ_{k}-z}$$

que es una suma de Riemann para la representación integral

$$\text{Li}_{s}(z)=\frac{z}{Γ(s)}\int_{-\infty}^{\infty} \frac{e^{\tau}}{(e^{\tau}+1-z)(1+e^{\tau})} \log^{s-1}(1+e^{\tau})d\tau$$

que se sigue de un simple cambio de variables en la conocida representación integral

$$\text{Li}_{s}(z)=\frac{1}{Γ(s)}\int_0^\infty \frac{ze^{-t}}{1-ze^{-t}}t^{s-1}dt$$

que se puede obtener fácilmente de la transformada de Laplace.

1voto

jlupolt Puntos 369

Para mayor referencia, basado en la respuesta de @robjohn, elaboré el siguiente código para el cálculo de la función de Spence:

double spenceFunction(double x, double precision = 1.0e-13) {
    if (x >= 0.5 && x < 1.0) {
        return  M_PI*M_PI/6.0 - spenceFunction(1.0 - x) - std::log( x)*std::log(1-x);
    }
    if (x >= 1.0) {
        return  M_PI*M_PI/3.0 - spenceFunction(1.0 / x) - std::log( x)*std::log(x) / 2.0;
    }
    if (x < -1.0) {
        return -M_PI*M_PI/6.0 - spenceFunction(1.0 / x) - std::log(-x)*std::log(-x) / 2.0;
    }

    double sum = 0.0, i = 1.0;
    for (; i < INT_MAX; i += 1.0) {
        double delta = std::pow(x,i) / (i*i);
        sum += delta;
        if (std::abs(delta/sum) < precision) break;
    }
    return sum;
}

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X