La pregunta se refiere a la función de error complementaria
erfc(x)=2π−−√∫∞xexp(−t2)dt
para valores "grandes" de x ( =n/2–√ en la pregunta original), es decir, entre 100 y 700,000 más o menos. (En la práctica, cualquier valor mayor que aproximadamente 6 debe considerarse "grande", como veremos). Tenga en cuenta que debido a que esto se usará para calcular los valores p, hay poco valor para obtener más de tres dígitos significativos (decimales) .
Para comenzar, considere la aproximación sugerida por @Iterator,
f(x)=1−1−exp(−x2(4+ax2π+ax2))−−−−−−−−−−−−−−−−−−−−−−√,
dónde
a=8(π−3)3(4−π)≈0.439862.
Aunque esta es una aproximación excelente a la función de error en sí, es una aproximación terrible a erfc . Sin embargo, hay una manera de arreglarlo sistemáticamente.
Para los valores p asociados con valores tan grandes de , estamos interesados en el error relativo f ( x ) / erfc ( x ) - 1 : esperamos que su valor absoluto sea menor que 0.001 para tres dígitos significativos de precisión. Desafortunadamente, esta expresión es difícil de estudiar para x grande debido a flujos inferiores en el cálculo de doble precisión. Aquí hay un intento, que traza el error relativo versus x para 0 ≤ x ≤ 5.8 :x f(x)/erfc(x)−1xx0≤x≤5.8
El cálculo se vuelve inestable una vez que excede aproximadamente 5.3 y no puede entregar un dígito significativo más allá de 5.8. Esto no es sorprendente: exp ( - 5.8 2 ) ≈ 10 - 14.6 está empujando los límites de la aritmética de doble precisión. Debido a que no hay evidencia de que el error relativo sea aceptablemente pequeño para una x mayor , debemos hacerlo mejor.xexp(−5.82)≈10−14.6x
Realizar el cálculo en aritmética extendida (con Mathematica ) mejora nuestra imagen de lo que está sucediendo:
El error aumenta rápidamente con no muestra signos de nivelación. Pasado x = 10 más o menos, ¡esta aproximación ni siquiera ofrece un dígito confiable de información!xx=10
Sin embargo, la trama comienza a verse lineal. Podríamos adivinar que el error relativo es directamente proporcional a . (Esto tiene sentido por motivos teóricos: erfc es manifiestamente una función impar yf es manifiestamente par, por lo que su relación debería ser una función impar. Por lo tanto, esperaríamos que el error relativo, si aumenta, se comportara como una potencia impar de x .) Esto nos lleva a estudiar el error relativo dividido por x . De manera equivalente, elijo examinar x ⋅ erfc ( x ) / f ( x )xerfcfx xx⋅erfc(x)/f(x), porque la esperanza es que esto debería tener un valor límite constante. Aquí está su gráfico:
Nuestra conjetura parece estar confirmada: esta relación parece estar llegando a un límite de alrededor de 8 más o menos. Cuando se le pregunte, Mathematica lo suministrará:
a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]
El valor es . Esto nos permite mejorar la estimación:tomamosa1=2π√e3(−4+π)28(−3+π)≈7.94325
f1(x)=f(x)a1x
como el primer refinamiento de la aproximación. Cuando es realmente grande, mayor que unos pocos miles, esta aproximación está bien. Debido a que todavía no será lo suficientemente bueno para un rango interesante de argumentos entre 5.3 y 2000 más o menos, iteremos el procedimiento. Esta vez, el error relativo inverso - específicamente, la expresión 1 - erfc ( x ) / f 1 ( x ) - debería comportarse como 1 / x 2 para x grande (en virtud de las consideraciones de paridad anteriores). En consecuencia, multiplicamos por x 2x5.320001−erfc(x)/f1(x)1/x2xx2 y encuentra el siguiente límite:
a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]]
El valor es
a2=132π−−√e3(−4+π)28(−3+π)(32−9(−4+π)3π(−3+π)2)≈114.687.
Este proceso puede continuar todo el tiempo que queramos. Lo di un paso más, encontrando
a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]]
con un valor aproximado de 1623.67. (La expresión completa implica una función racional de grado ocho de y es demasiado larga para ser útil aquí).π
Desenrollar estas operaciones produce nuestra aproximación final
f3(x)=f(x)(a1−a2/x2+a3/x4)/x.
El error es proporcional a . De importación es la constante de proporcionalidad, así que graficamos x 6 ( 1 - erfc ( x ) / f 3 ( x ) ) :x−6x6(1−erfc(x)/f3(x))
Se acerca rápidamente a un valor límite alrededor de 2660.59. Usando la aproximación , obtenemos estimaciones de erfc ( x ) cuya precisión relativa es mejor que 2661 / x 6 para todo x > 0 . Una vez que x excede 20 o menos, tenemos nuestros tres dígitos significativos (o mucho más, a medida que x se hace más grande). Como verificación, aquí hay una tabla que compara los valores correctos con la aproximación para x entre 10 y 20 :f3erfc(x)2661/x6x>0xxx1020
x Erfc Approximation
10 2.088*10^-45 2.094*10^-45
11 1.441*10^-54 1.443*10^-54
12 1.356*10^-64 1.357*10^-64
13 1.740*10^-75 1.741*10^-75
14 3.037*10^-87 3.038*10^-87
15 7.213*10^-100 7.215*10^-100
16 2.328*10^-113 2.329*10^-113
17 1.021*10^-127 1.021*10^-127
18 6.082*10^-143 6.083*10^-143
19 4.918*10^-159 4.918*10^-159
20 5.396*10^-176 5.396*10^-176
De hecho, esta aproximación ofrece al menos dos cifras significativas de precisión para adelante, que es justo donde los cálculos de peatones (como la función de Excel ) se agotan.x=8NormSDist
Finalmente, uno podría preocuparse por nuestra capacidad de calcular la aproximación inicial . Sin embargo, eso no es difícil: cuando x es lo suficientemente grande como para causar desbordamientos en la exponencial, la raíz cuadrada se aproxima a la mitad de la exponencial,fx
f(x)≈12exp(−x2(4+ax2π+ax2)).
Calcular el logaritmo de esto (en la base 10) es simple y proporciona fácilmente el resultado deseado. Por ejemplo, sea . El logaritmo común de esta aproximación esx=1000
log10(f(x))≈(−10002(4+a⋅10002π+a⋅10002)−log(2))/log(10)∼−434295.63047.
Exponentiating yields
f(1000)≈2.34169⋅10−434296.
Applying the correction (in f3) produces
erfc(1000)≈1.86003 70486 32328⋅10−434298.
Note that the correction reduces the original approximation by over 99% (and indeed, a1/x≈1%.) (This approximation differs from the correct value only in the last digit. Another well-known approximation, exp(−x2)/(xπ−−√), equals 1.860038⋅10−434298, erring in the sixth significant digit. I'm sure we could improve that one, too, if we wanted, using the same techniques.)