La domanda riguarda la funzione di errore complementare
erfc(x)=2π−−√∫∞xexp(−t2)dt
per valori "grandi" di (x=n/2–√ nella domanda originale), ovvero tra 100 e 700.000 circa. (In pratica, qualsiasi valore maggiore di circa 6 dovrebbe essere considerato "grande", come vedremo.) Si noti che poiché questo verrà utilizzato per calcolare i valori p, c'è poco valore nell'ottenere più di tre cifre (decimali) significative .
Per iniziare, considera l'approssimazione suggerita da @Iterator,
f(x)=1−1−exp(−x2(4+ax2π+ax2))−−−−−−−−−−−−−−−−−−−−−−√,
dove
a=8(π−3)3(4−π)≈0.439862.
Anche se questa è un'approssimazione eccellente per la stessa funzione di errore, è un'approssimazione terribile di . Tuttavia, c'è un modo per sistemarlo sistematicamente.erfc
Per i valori p associati a valori così grandi di , siamo interessati all'errore relativo : speriamo che il suo valore assoluto sia inferiore a 0,001 per tre significativi cifre di precisione. Sfortunatamente questa espressione è difficile da studiare per grandi a causa di underflow nel calcolo a doppia precisione. Ecco un tentativo, che traccia l'errore relativo rispetto a per :f ( x ) / erfc ( x ) - 1 x x 0 ≤ x ≤ 5.8x f(x)/erfc(x)−1xx0≤x≤5.8
Il calcolo diventa instabile quando supera 5,3 o giù di lì e non può fornire una cifra significativa oltre 5,8. Non è una sorpresa: sta spingendo i limiti dell'aritmetica a doppia precisione. Perché non ci sono prove che l'errore relativo sarà accettabilmente piccolo per più grandeexp ( - 5,8 2 ) ≈ 10 - 14,6 xxexp(−5.82)≈10−14.6x , dobbiamo fare di meglio.
L'esecuzione del calcolo in aritmetica estesa (con Mathematica ) migliora la nostra immagine di ciò che sta succedendo:
L'errore aumenta rapidamente con e non mostra segni di livellamento. Passatox = 10xx=10 o giù di lì, questa approssimazione non fornisce nemmeno una cifra affidabile di informazioni!
Tuttavia, la trama inizia a sembrare lineare. Potremmo supporre che l'errore relativo sia direttamente proporzionale a . (Ciò ha senso su basi teoriche: è manifestamente una funzione dispari e è manifestamente pari, quindi il loro rapporto dovrebbe essere una funzione dispari. Quindi ci aspetteremmo che l'errore relativo, se aumenta, si comporti come un potere dispari di .) Questo ci porta a studiare l'errore relativo diviso per . Allo stesso modo, scelgo di esaminare , perché la speranza è che questo abbia un valore limite costante. Ecco il suo grafico:erfc f x x x ⋅ erfc ( x ) / f ( x )xerfcfx xx⋅erfc(x)/f(x)
La nostra ipotesi sembra confermata: questo rapporto sembra avvicinarsi a un limite di circa 8 circa. Alla domanda, Mathematica lo fornirà:
a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]
Il valore è . Questo ci consente di migliorare il preventivo:a1=2π√e3(−4+π)28(−3+π)≈7.94325 prendiamo
f1(x)=f(x)a1x
come primo raffinamento dell'approssimazione. Quando è veramente grande - maggiore di qualche migliaio - questa approssimazione va bene. Poiché non sarà ancora abbastanza buono per una serie interessante di argomenti tra e o giù di lì, ripetiamo la procedura. Questa volta, l'errore relativo inverso, in particolare l'espressione dovrebbe comportarsi come per grande (in virtù delle precedenti considerazioni sulla parità) . Di conseguenza, moltiplichiamo per e troviamo il prossimo limite:5.3 2000 1 - erfc ( x ) / f 1 ( x ) 1 / x 2 x x 2x5.320001−erfc(x)/f1(x)1/x2xx2
a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]]
Il valore è
a2=132π−−√e3(−4+π)28(−3+π)(32−9(−4+π)3π(−3+π)2)≈114.687.
Questo processo può procedere finché lo desideriamo. L'ho fatto un altro passo, trovando
a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]]
con un valore di circa 1623,67. (L'espressione completa implica una funzione razionale di grado otto di ed è troppo lunga per essere utile qui.)π
Svolgere queste operazioni produce la nostra approssimazione finale
f3(x)=f(x)(a1−a2/x2+a3/x4)/x.
L'errore è proporzionale a . Di importazione è la costante di proporzionalità, quindi tracciamo : x 6 ( 1 - erfc ( x ) / f 3 ( x ) )x−6x6(1−erfc(x)/f3(x))
Si avvicina rapidamente a un valore limite intorno a 2660,59. Usando l'approssimazione , otteniamo stime di cui accuratezza relativa è migliore di per tutti . Una volta che supera 20 o giù di lì, abbiamo le nostre tre cifre significative (o molto di più, poiché diventa più grande). Come controllo, ecco una tabella che confronta i valori corretti con l'approssimazione per tra e :erfc ( x ) 2661 / x 6 x > 0 x x x 10 20f3erfc(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
In effetti, questa approssimazione fornisce almeno due cifre significative di precisione per in poi, che è quasi dove i calcoli pedonali (come la funzione di Excel ) si esauriscono.x=8NormSDist
Infine, ci si potrebbe preoccupare della nostra capacità di calcolare l'approssimazione iniziale . Tuttavia, non è difficile: quandoxfx è abbastanza grande da causare underflow nell'esponenziale, la radice quadrata è ben approssimata della metà dell'esponenziale,
f(x)≈12exp(−x2(4+ax2π+ax2)).
Il calcolo del logaritmo di questo (nella base 10) è semplice e fornisce facilmente il risultato desiderato. Ad esempio, lasciax=1000 . Il logaritmo comune di questa approssimazione è
log10(f(x))≈(−10002(4+a⋅10002π+a⋅10002)−log(2))/log(10)∼−434295.63047.
Rendimenti esponenziali
f(1000)≈2.34169⋅10−434296.
Applicazione della correzione (inf3 ) produce
erfc(1000)≈1.86003 70486 32328⋅10−434298.
Si noti che la correzione riduce l'approssimazione originale di oltre il 99% (e in effetti .) (Questa approssimazione differisce dal valore corretto solo nell'ultima cifra. Un'altra approssimazione ben nota, , uguale a , nella sesta cifra significativa. Sono sicuro che potremmo migliorare anche quella, se voluto, usando le stesse tecniche.)a1/x≈1%exp(−x2)/(xπ−−√)1.860038⋅10−434298