27 votos

Algoritmo para calcular la función Gamma

La cuestión es sencilla. Me gustaría implementar la función Gamma en mi calculadora escrita en C; sin embargo, no he podido encontrar una manera fácil de calcular mediante programación una aproximación a una precisión arbitraria.

¿Existe un buen algoritmo para calcular aproximaciones de la función Gamma?

Gracias.

0 votos

¿Quieres un algoritmo para su dominio complejo o sólo para los números reales?

0 votos

complejo sería mejor

1 votos

En realidad es el Biblioteca GNU C (no he comprobado si la norma lo exige).

17voto

houbysoft Puntos 213

Parece que la aproximación de Lanczos se ajustará a mis necesidades : http://en.wikipedia.org/wiki/Lanczos_approximation

Gracias por su ayuda.

1 votos

Esta nota debería ser de interés.

5voto

Chad Brewbaker Puntos 217

Ahora forma parte de la biblioteca estándar de C++11.

http://en.cppreference.com/w/cpp/numeric/math/tgamma

0 votos

Lo que enlaza es la interfaz de C++ a la biblioteca estándar de C.

0 votos

Sin embargo, no se trata de una precisión arbitraria.

2voto

Chris S Puntos 139

2voto

Mark Puntos 11

Alguien hizo una pregunta similar ayer. He pensado en sustituir $e^{-t}$ por una serie. $$\Gamma (z) = \int_{0}^{\infty} t^{z-1} e^{-t} dt \approx \sum_{j=0}^{a} \frac{(-1)^j b^{j+z}}{(j + z) j !} . \text{Choose } a > b ,$$ pero, como señala J. M., debería haber revisado esto un poco mejor. Tenga mucho cuidado en la elección de $a, b$ .

0 votos

¿Tiene usted probé con ¿Implementar esto? :)

0 votos

No con más de una $z$ . Puede ser muy inexacto dependiendo de la elección de $a, b$ . Ahora que he probado algunos más $z$ Parece que $a = b z^2$ es más o menos correcto, pero $b$ también debe ser elegido no muy lejos de $z$ . Ejemplo: $z = 6.6$ , $b=2 \times z$ , $a = b z^2$ . Esto es sólo una suposición.

2voto

GrahamW Puntos 11

Prueba la aproximación de Nemes:

$$\ln ( \Gamma( x ) ) = \frac12 \ln( 2 \pi ) + \left( x - \frac12 \right) \ln( x ) - x + \frac x2 \ln\left( x \sinh\left( \frac1x \right) + \frac 1 {810 x^6} \right) $$

El último término, $\dfrac1 { 810 x^6}$ es un término de comprobación de errores y puede ser eliminado de sus cálculos.

Aquí está mi referencia .

3 votos

¿Comprobación de errores? No. Es un término utilizado para aumentar la precisión. No tiene nada que ver con la comprobación de errores. Esto no es una transmisión binaria o lo que sea que estés pensando.

0 votos

Para los valores pequeños, esto es sólo una aproximación muy aproximada. Por ejemplo, para x=1, el LHS es 0, pero el RHS es 0.00015268924587. El error relativo a scipy.special.gammaln es aproximadamente proporcional a x^{-4} para x en [1,3]. Por otro lado, es unas cuatro veces más rápido.

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