Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

4 votos

Evitar la pérdida de precisión numérica

Necesito para evaluar la función

f(x)=1(1A)xA,

donde0<A10x1.

Una sencilla implementación en C de f(x) con aritmética de punto flotante funciona bien siempre y como es bastante grande, pero se rompe cuando Una es pequeña. (1A)x es muy cercano a 1, y restar de 1 rendimientos de un número pequeño, con apenas dígitos significativos, lo cual se divide por el diminuto A.

f(x) parece enfoque de una identidad en función de como se aproxima a cero, pero no puedo probarlo.

Hay alguna manera de reorganizar la definición de f que evita la pérdida de precisión cuando Una es pequeña? Mejor aún, hay una manera de hacerlo para que f(x)=xA=0, sin introducir un caso especial?

2voto

Shabaz Puntos 403

El simple cosa a hacer es decir (1A)x1xAA1. Esto conduce a f(x)=x como usted dice. Usted puede probar la A y cambiar a f(x) cuando es pequeño. El problema de esto lleva a que se tiene un salto en f(x) al cruzar la transición. Tal vez esto es un problema, tal vez no. Usted puede utilizar más términos de la serie de Taylor: (1A)x1+xlog(1A)+12(xlog(1A))2+16(xlog(1A))3+log(1A)=A12A213A3. Mantener más términos reducirá el salto. Si usted necesita continuidad, usted puede mantener a un montón de condiciones, cerca de la transición de hacer una interpolación.

1voto

bubba Puntos 16773

La construcción de un polinomio (o racional) la aproximación de la función que da buena precisión durante todo el intervalo de [0,1], y evaluar esta aproximación en lugar de evaluar su función original.

La construcción de una buena aproximación es un poco justo de trabajo, por lo que no puede ser vale la pena para usted. El mejor enfoque es la aproximación de Chebyshev. Usted debe ser capaz de construir un polinomio de razonablemente pequeño grado que se aproxima a su función adecuadamente a lo largo de [0,1]. Con un poco más de trabajo, usted puede hacer arreglos para la aproximación a ser exactamente correcta enx=0x=1. No hay caso especial de ramificación que se necesita en su código, así que esto evita la discontinuidad de los problemas mencionados en Ross Millikan respuesta. En general, Chebshev aproximaciones son agradables porque son exactas a lo largo de un intervalo, mientras que la serie de Taylor aproximaciones son muy buenas en un solo punto (y alrededores), pero pobres en otros lugares.

La construcción de la aproximación es fácil si usted tiene acceso a Matlab: se puede usar el Chebfun paquete.

Existe la ventaja añadida de que la evaluación de un polinomio probablemente será más rápido que la evaluación de su función original.

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