Calcular

13

La función f:x(ex1)/x tiene singularidad cerca de x=0 . Sin embargo, esa singularidad se puede levantar: para x=1 , uno debería tener f(x)=1 , ya que y por lo tanto Sin embargo, la formano es solo no definido en, también es numéricamente inestable en la vecindad de ese punto; con el fin de evaluarpara muy pequeñanuméricamente, se podría utilizar una expansión de Taylor, es decir, un truncamiento de la serie de potencias antes mencionado.

ex=k=0xkk!
(ex1)/x=k=1xk1k!
(ex1)/xx=0f(x)x

P : ¿La función tiene un nombre? En otras palabras, ¿es este un problema común?f

P : ¿Alguien sabe de una biblioteca C / C ++ que maneje bien esta situación, es decir, utiliza la expansión Taylor de un grado apropiado cerca de 0 y la otra representación lejos de cero?

anónimo
fuente

Respuestas:

19

Posiblemente uno podría comenzar con la función que forma parte del estándar C99, y calcula e x - 1 con precisión cerca de x = 0 .expm1ex1x=0

n00b
fuente
17

Esta es una instancia de error de cancelación. La biblioteca estándar de C (a partir de C99) incluye una función llamada expm1que evita este problema. Si usa en expm1(x) / xlugar de (exp(x) - 1.0) / x, no experimentará este problema (consulte el gráfico a continuación). <code> fabs (expm1 (x) / x - (exp (x) - 1.0) / x) </code>

Los detalles y la solución de este problema en particular se analizan en detalle en la Sección 1.14.1 de Precisión y estabilidad de los algoritmos numéricos . La misma solución también se explica en la página 19 del artículo de W. Kahan titulado ¿Cuán inútiles son las evaluaciones sin sentido del redondeo en la computación de punto flotante? . La implementación real de expm1la biblioteca GNU C es diferente del enfoque descrito en las referencias anteriores y está completamente documentada en el código fuente .

Juan M. Bello-Rivas
fuente
1
¡Gracias, eso es justo lo que necesitaba! Desafortunadamente, solo puedo aceptar una respuesta ...
anónimo
¡Por supuesto! No hay problema :-)
Juan M. Bello-Rivas
3

Para responder a su primera pregunta, no, la función no tiene un nombre (al menos no uno que sea ampliamente conocido).

Como otros han mencionado, la mejor manera de calcular la función es tratar varios casos especiales. Así es como cualquier biblioteca calcularía la función.

  1. Caso 0: x = 0, devuelve 1.
  2. Caso 1: , devuelve 1 + x / 2 . Elija δ empíricamente para su precisión numérica y tipo de datos. Para , debería ser sobre . Para flotar, se trata .|x|<δ1+x/2δdouble2e-85e-4
  3. Caso más: devolución expm1(x)/x.

Puede ser más sofisticado y especial, más cosas con la serie Taylor truncada, pero probablemente no valga la pena. De hecho, no está del todo claro que el caso 1 deba manejarse por separado, ya que, como señaló k20, la cancelación es segura. Sin embargo, manejarlo por separado me haría sentir más seguro al respecto.

Victor Liu
fuente
2

Recuerdo que esta pregunta se había hecho anteriormente en este sitio, y sorprendentemente la respuesta es que solo necesita un caso especial de igualdad exacta a cero. Los errores se cancelan cerca de cero. No tengo el enlace

Sí, esta respuesta fue completamente incorrecta. No estoy seguro de por qué se votó tanto, probablemente porque se declaró con autoridad. Encontré el enlace que tenía en mente. Estaba en el intercambio de pila matemática aquí , no en el intercambio de pila scicomp. La expm1fórmula de cancelación de error libre se da en la respuesta de JM y utiliza una u = exp(x)transformación.

k20
fuente
xdx(edx1)/dx(1+dx1)/dx1
1
dx1+dx=1
0

Para responder la primera pregunta y proporcionar un método (probablemente numéricamente ineficiente) para la segunda, tenga en cuenta que esta es la inversa de la función generadora de los números de Bernoulli .

Nikolaj-K
fuente
Esa es una conexión interesante, gracias por señalarlo. Desafortunadamente, creo que la suma triple hará que esto sea prohibitivamente costoso. Además, no está claro de inmediato dónde truncar cada suma para obtener la precisión deseada.
anónimo
@anónimo: ¿Qué suma triple quieres decir? No necesita los polinomios de Bernoulli, solo los números de Bernoulli, y puede enumerarlos por adelantado. Pero sí, aún no es mejor que la serie Taylor.
Nikolaj-K
Sin embargo, puede calcularlos por adelantado si está claro que solo necesita un número finito fijo para cualquier entrada.
anónimo
@ anónimo: Bueno, sí, al igual que enumerarías los coeficientes de Taylor por adelantado.
Nikolaj-K