A questão diz respeito à função de erro complementar
erfc ( x ) = 2π--√∫∞xexp( - t2) dt
para valores "grandes" de (x na pergunta original) - ou seja, entre 100 e 700.000 ou mais. (Na prática, qualquer valor maior que cerca de 6 deve ser considerado "grande", como veremos.) Observe que, como isso será usado para calcular valores de p, há pouco valor na obtenção de mais de três dígitos significativos (decimais) .= n / 2-√
Para começar, considere a aproximação sugerida pelo @Iterator,
f( X ) = 1 - 1 - exp( - x2( 4 + a x2π+ a x2) ))----------------------√,
Onde
a = 8 ( π- 3 )3 ( 4 - π)≈ 0,439862.
Embora esta seja uma excelente aproximação à própria função de erro, é uma terrível aproximação à . No entanto, existe uma maneira de corrigir isso sistematicamente.erfc
Para os valores p associados a valores tão grandes de , estamos interessados no erro relativo f ( x ) / erfc ( x ) - 1 : esperamos que seu valor absoluto seja menor que 0,001 para três dígitos significativos de precisão. Infelizmente, essa expressão é difícil de estudar para x grande devido a fluxos insuficientes no cálculo de precisão dupla. Aqui está uma tentativa, que plota o erro relativo versus x para 0 ≤ x ≤x f( X ) / erfc (x)−1xx :0 ≤ x ≤ 5,8
O cálculo se torna instável quando excede 5,3 ou mais e não pode fornecer um dígito significativo além de 5,8. Isso não é surpresa: exp ( - 5,8 2 ) ≈ 10 - 14,6 está ultrapassando os limites da aritmética de precisão dupla. Como não há evidências de que o erro relativo seja aceitável pequeno para um x maior , precisamos fazer melhor.xexp( - 5,82) ≈ 10- 14,6x
A realização do cálculo em aritmética estendida (com o Mathematica ) melhora nossa imagem do que está acontecendo:
O erro aumenta rapidamente com e não mostra sinais de nivelamento. Passado xx , aproximadamente, essa aproximação nem fornece um dígito confiável de informações!x = 10
No entanto, o enredo está começando a parecer linear. Podemos supor que o erro relativo seja diretamente proporcional a . (Isso faz sentido em bases teóricas: erfc é manifestamente uma função ímpar ef é manifestamente uniforme, portanto a razão deve ser uma função ímpar. Assim, esperaríamos que o erro relativo, se aumentasse, se comportasse como uma potência ímpar de x .) Isso nos leva a estudar o erro relativo dividido por x . Equivalentemente, eu escolho para examinar x ⋅ ERFC ( x ) / f ( , porque a esperança é este deve ter um valor limite constante Aqui é o seu gráfico.:xerfcfx xx⋅erfc(x)/f(x)
Nosso palpite parece estar confirmado: essa proporção parece estar se aproximando de um limite em torno de 8 ou mais. Quando solicitado, o Mathematica fornecerá:
a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]
O valor é . Isso nos permite melhorar a estimativa:tomamosa1=2π√e3(−4+π)28(−3+π)≈7.94325
f1(x)=f(x)a1x
como o primeiro refinamento da aproximação. Quando é realmente grande - superior a alguns milhares - essa aproximação é ótima. Como ainda não será bom o suficiente para uma gama interessante de argumentos entre 5.3 e 2000 , vamos repetir o procedimento. Desta vez, o erro relativo inverso - especificamente, a expressão 1 - erfc ( x ) / f 1 ( x ) - deve se comportar como 1 / x 2 para x grande (em virtude das considerações de paridade anteriores). Assim, multiplicamos por x 2x5.320001−erfc(x)/f1(x)1/x2xx2 e encontre o próximo limite:
a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]]
O valor é
a2=132π−−√e3(−4+π)28(−3+π)(32−9(−4+π)3π(−3+π)2)≈114.687.
Esse processo pode prosseguir o quanto quisermos. Eu dei mais um passo, encontrando
a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]]
com valor aproximadamente 1623,67. (A expressão completa envolve uma função racional de grau oito de e é muito longa para ser útil aqui.)π
Desenrolar essas operações produz nossa aproximação final
f3(x)=f(x)(a1−a2/x2+a3/x4)/x.
O erro é proporcional a . De importação é a constante de proporcionalidade, portanto, plotamos x 6 ( 1 - erfc ( x ) / f 3 ( x ) ) :x−6x6(1−erfc(x)/f3(x))
Ele se aproxima rapidamente de um valor limite em torno de 2660,59. Usando a aproximação , obtemos estimativas de erfc ( x ) cuja precisão relativa é melhor que 2661 / x 6 para todos x > 0 . Uma vez que x é superior a 20 ou assim, nós temos os nossos três dígitos significativos (ou muito mais, como x fica maior). Como verificação, segue uma tabela comparando os valores corretos com a aproximação de x entre 10 e 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 fato, essa aproximação fornece pelo menos duas figuras significativas de precisão para x=8 , que é exatamente onde os cálculos de pedestres (como a NormSDist
função do Excel ) desaparecem.
Finalmente, pode-se preocupar com nossa capacidade de calcular a aproximação inicial . No entanto, isso não é difícil: quando x é grande o suficiente para causar subfluxos no exponencial, a raiz quadrada é bem aproximada pela metade do exponencial,fx
f(x)≈12exp(−x2(4+ax2π+ax2)).
A computação do logaritmo disso (na base 10) é simples e fornece rapidamente o resultado desejado. Por exemplo, deixe . O logaritmo comum dessa aproximação éx=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.)