Die Frage betrifft die komplementäre Fehlerfunktion
erfc(x)=2π−−√∫∞xexp(−t2)dt
für "große" Werte von x ( =n/2–√ in der ursprünglichen Frage) - dh zwischen 100 und 700.000 oder so. (In der Praxis sollte jeder Wert größer als ungefähr 6 als "groß" betrachtet werden, wie wir sehen werden.) Da dies zur Berechnung von p-Werten verwendet wird, ist es wenig sinnvoll, mehr als drei signifikante (Dezimal-) Stellen zu erhalten .
Betrachten Sie zunächst die von @Iterator vorgeschlagene Annäherung.
f(x)=1−1−exp(−x2(4+ax2π+ax2))−−−−−−−−−−−−−−−−−−−−−−√,
wo
a=8(π−3)3(4−π)≈0.439862.
Obwohl dies eine ausgezeichnete Annäherung an die Fehlerfunktion selbst ist, ist es eine schreckliche Annäherung an . Es gibt jedoch eine Möglichkeit, dies systematisch zu beheben.erfc
Für die p-Werte, die mit so großen Werten von assoziiert sind, interessieren wir uns für den relativen Fehler f ( x ) / erfc ( x ) - 1 : Wir hoffen, dass sein absoluter Wert für drei signifikante Stellen der Genauigkeit kleiner als 0,001 ist. Leider ist dieser Ausdruck aufgrund von Unterläufen bei der Berechnung mit doppelter Genauigkeit für große x schwer zu untersuchen . Hier ist ein Versuch, der den relativen Fehler gegen x für 0 ≤ x ≤ 5,8 darstellt :x f(x)/erfc(x)−1xx0≤x≤5.8
Die Berechnung wird instabil, sobald 5,3 oder mehr überschreitet, und kann keine signifikante Ziffer mehr nach 5,8 liefern. Dies ist keine Überraschung: exp ( - 5.8 2 ) ≈ 10 - 14.6 stößt an die Grenzen der Arithmetik mit doppelter Genauigkeit. Da es keinen Beweis dafür gibt, dass der relative Fehler für ein größeres x akzeptabel klein sein wird , müssen wir es besser machen.xexp(−5.82)≈10−14.6x
Das Durchführen der Berechnung in erweiterter Arithmetik (mit Mathematica ) verbessert unser Bild von dem, was vor sich geht:
Der Fehler steigt mit rapide an und zeigt keine Anzeichen einer Nivellierung. Nach x = 10 liefert diese Näherung nicht einmal eine zuverlässige Ziffer an Informationen!xx=10
Die Darstellung beginnt jedoch linear zu wirken. Wir könnten vermuten, dass der relative Fehler direkt proportional zu . (Dies ist aus theoretischen Gründen sinnvoll: erfc ist offensichtlich eine ungerade Funktion und f ist offensichtlich gerade, daher sollte ihr Verhältnis eine ungerade Funktion sein. Daher würden wir erwarten, dass sich der relative Fehler, wenn er zunimmt, wie eine ungerade Potenz von x verhält .) Dies führt uns dazu, den relativen Fehler geteilt durch x zu untersuchen . Gleichermaßen entscheide ich mich, x ⋅ erfc ( x ) / f ( x ) zu untersuchen.xerfcfx xx⋅erfc(x)/f(x), denn die Hoffnung ist, dass dies einen konstanten Grenzwert haben sollte. Hier ist seine Grafik:
Unsere Vermutung scheint sich zu bestätigen: Dieses Verhältnis scheint sich einer Grenze von ungefähr 8 zu nähern. Auf Anfrage liefert Mathematica Folgendes:
a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]
Der Wert ist . Dies ermöglicht es uns, die Schätzung zu verbessern:Wir nehmena1=2π√e3(−4+π)28(−3+π)≈7.94325
f1(x)=f(x)a1x
als erste Verfeinerung der Annäherung. Wenn wirklich groß ist - größer als ein paar Tausend - ist diese Annäherung in Ordnung. Da es für eine Reihe interessanter Argumente zwischen 5.3 und 2000 immer noch nicht gut genug ist , lassen Sie uns die Prozedur wiederholen. Diesmal sollte sich der inverse relative Fehler - insbesondere der Ausdruck 1 - erfc ( x ) / f 1 ( x ) - wie 1 / x 2 für großes x verhalten (aufgrund der vorherigen Paritätsüberlegungen). Dementsprechend multiplizieren wir mit x 2x5.320001−erfc(x)/f1(x)1/x2xx2 und finde das nächste Limit:
a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]]
The value is
a2=132π−−√e3(−4+π)28(−3+π)(32−9(−4+π)3π(−3+π)2)≈114.687.
This process can proceed as long as we like. I took it out one more step, finding
a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]]
with value approximately 1623.67. (The full expression involves a degree-eight rational function of π and is too long to be useful here.)
Unwinding these operations yields our final approximation
f3(x)=f(x)(a1−a2/x2+a3/x4)/x.
x−6x6(1−erfc(x)/f3(x)):
f3erfc(x)2661/x6x>0x exceeds 20 or so, we have our three significant digits (or far more, as x gets larger). As a check, here is a table comparing the correct values to the approximation for x between 10 and 20:
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 fact, this approximation delivers at least two significant figures of precision for x=8 on, which is just about where pedestrian calculations (such as Excel's NormSDist
function) peter out.
Finally, one might worry about our ability to compute the initial approximation f. However, that's not hard: when x is large enough to cause underflows in the exponential, the square root is well approximated by half the exponential,
f(x)≈12exp(−x2(4+ax2π+ax2)).
Computing the logarithm of this (in base 10) is simple, and readily gives the desired result. For example, let x=1000. The common logarithm of this approximation is
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.)