22 votos

Cómo calcular con precisión el error de la función erf(x) con un ordenador?

Estoy buscando una precisa algoritmo para calcular la función de error

Math97 first question example

He intentado usar [esta fórmula]

math97 second question example

(http://stackoverflow.com/a/457805) (Manual de Funciones Matemáticas, la fórmula 7.1.26), pero los resultados no son lo suficientemente precisas para la aplicación.

19voto

Andrew Puntos 140

Estoy asumiendo que usted necesita la función de error sólo para verdaderos valores. Para argumentos complejos, hay otros enfoques, más complicado de lo que me sugiere.

Si vas a la serie de Taylor de la ruta, la mejor de la serie para el uso de la fórmula 7.1.6 en Abramowitz y Stegun. No es tan propenso a la sustracción de la cancelación de la serie derivada de la integración de la potencia de la serie para $\exp(-x^2)$. Esto es bueno sólo para los "pequeños" de los argumentos. Para grandes argumentos, puede utilizar la asintótica de la serie o de la continuación de la fracción de representaciones.

De lo contrario, puede que me dirija a estos documentos por S. Winitzki que dar buen aproximaciones a la función de error.


(añadido en el 5/4/2011)

Escribí sobre el cálculo de la (complementario) de la función de error (expresado en notación diferente) en esta respuesta a un CV pregunta.

7voto

pix0r Puntos 17854

Usted puede utilizar un polinomio de Taylor de grado suficiente para garantizar la precisión que usted necesita. (La serie de Taylor para erf(x) se da en la página de la Wikipedia, a la que se enlaza.) El Resto de Lagrange término puede ser usado para acotar el error en la serie de Taylor de la aproximación.

5voto

bw. Puntos 21

Aquí está un enlace para el impulso de c++ de matemáticas de la documentación de la biblioteca. Ellos utilizan su aplicación de la función gamma incompleta, que a su vez utiliza un enfoque mixto, dependiendo del argumento. Es todo bastante bien documentado debe importarle a duplicar su método. Y parece que su error se encuentra dentro de unos múltiplos de la máquina de epsilon.

Aparte de eso, me gustaría probar la serie de Taylor. Aproximación numérica podría conducir a un mayor término de error de la analítica, y sólo será válido en una vecindad de 0. Para valores más grandes que usted podría utilizar el asintótica de la serie.

Otra idea sería la de restringir el dominio a un intervalo cerrado. Si el tamaño de la misma correctamente, entonces la función aparecerá constante con respecto a su precisión de la máquina fuera de este intervalo. Una vez que usted tiene un dominio compacto, usted puede saber exactamente cuántos Taylor términos que usted necesita, o puede utilizar otros tipos de interpolación spline. Los polinomios de Chebyshev vienen a la mente.

En cuanto al problema de que el lenguaje de su escritura no tiene dicha biblioteca ya: para mí que probablemente no es tan grande de un acuerdo, como usted piensa. La mayoría de los idiomas parecen tener una forma de enlace en las funciones de C, y si ese es el caso, entonces no es una implementación de código abierto en algún lugar ahí fuera.

4voto

TPArrow Puntos 140

Una forma sencilla de computación en la función de error es el uso de Kummer de la ecuación de la forma,

$ M(a,b,z)=\sum_{s=0}^{\infty} \frac{(a)_s}{(b)_s s!}z^s=1+\frac{a}{b}z+\frac{a(a+1)}{b(b+1)2!}z^2+...,\quad z \in \mathbb{C} $

and

$ M(a,b,z)=\sum_{s=0}^{\infty}\frac{(a)_s}{\Gamma{(b+s)}s!}z^s $

and

$ erf(z)=\frac{2z}{\sqrt{\pi}}M(.5,1.5,-z^2)=\frac{2z}{\sqrt{\pi}}e^{-z^2}M(1,1.5,z^2) $

Aquí está el código R,

f<-function(a,b,z,maxt=5){
  s=1:maxt
  a=a+s
  b=b+s
  ss=1
  for(i in s){
    mt=prod(a[1:i]/b[1:i])
    ss=ss+mt *z^(2*i)/factorial(i)
  }
  ss=2*z/sqrt(pi)*exp(-z^2)*ss
  return(ss)
}

aquí está la trama, de verdad, z) enter image description here

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