Pytanie dotyczy uzupełniającej funkcji błędu
erfc(x)=2π−−√∫∞xexp(−t2)dt
dla „dużych” wartości ( w pierwotnym pytaniu) - to znaczy między 100 a 700 000 lub mniej więcej. (W praktyce jakakolwiek wartość większa niż około 6 powinna być uważana za „dużą”). Zauważ, że ponieważ zostanie ona wykorzystana do obliczenia wartości p, uzyskanie wartości większej niż trzy cyfry znaczące (dziesiętne) jest niewielkie. .= n / √x=n/2–√
Na początek rozważ przybliżenie sugerowane przez @Iterator,
f(x)=1−1−exp(−x2(4+ax2π+ax2))−−−−−−−−−−−−−−−−−−−−−−√,
gdzie
a=8(π−3)3(4−π)≈0.439862.
Chociaż jest to doskonałe przybliżenie samej funkcji błędu, jest to straszne przybliżenie do . Istnieje jednak sposób, aby to systematycznie naprawić.erfc
Dla wartości p związanych z tak dużymi wartościami interesuje nas błąd względny : mamy nadzieję, że jego wartość bezwzględna byłaby mniejsza niż 0,001 dla trzech znaczących cyfry precyzji. Niestety tego wyrażenia trudno jest badać dla dużych ze względu na niedomiar w obliczeniach o podwójnej precyzji. Oto jedna próba, która wykreśla błąd względny względem dla :f ( x ) / erfc ( x ) - 1 x x 0 ≤ x ≤ 5,8x f(x)/erfc(x)−1xx0≤x≤5.8
Obliczenia stają się niestabilne, gdy przekroczy 5,3 lub mniej więcej i nie może dostarczyć jednej znaczącej cyfry po 5.8. Nie jest to zaskoczeniem: przesuwa granice arytmetyki podwójnej precyzji. Ponieważ nie ma dowodów na to, że błąd względny będzie akceptowalnie mały dla większego , musimy to zrobić lepiej.exp ( - 5,8 2 ) ≈ 10 - 14,6 xxexp(−5.82)≈10−14.6x
Wykonywanie obliczeń w rozszerzonej arytmetyki (z Mathematica ) poprawia nasz obraz tego, co się dzieje:
Błąd rośnie gwałtownie za pomocą i nie wykazuje żadnych oznak wyrównywania. Po lub więcej, to przybliżenie nie zapewnia nawet jednej wiarygodnej cyfry informacji!xx=10
Fabuła zaczyna jednak wyglądać liniowo. Możemy zgadywać, że błąd względny jest wprost proporcjonalny do . (Ma to uzasadnienie teoretyczne: jest oczywiście funkcją nieparzystą, a jest oczywiście parzystą, więc ich stosunek powinien być funkcją nieparzystą. W związku z tym spodziewalibyśmy się, że błąd względny, jeśli wzrośnie, będzie zachowywał się jak nieparzysta moc .) To prowadzi nas do zbadania błędu względnego podzielonego przez . postanowiłem zbadać , ponieważ istnieje nadzieja, że powinna mieć stałą wartość graniczną. Oto jego wykres:erfc f x x x ⋅ erfc ( x ) / f ( x )xerfcfx xx⋅erfc(x)/f(x)
Nasze przypuszczenia wydają się potwierdzone: wydaje się, że stosunek ten zbliża się do granicy około 8. Zapytany, Mathematica dostarczy go:
a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]
Wartość wynosi . . To pozwala nam poprawić szacunek: bierzemya1=2π√e3(−4+π)28(−3+π)≈7.94325
f1(x)=f(x)a1x
jako pierwsze udoskonalenie przybliżenia. Gdy jest naprawdę duży - większy niż kilka tysięcy - to przybliżenie jest w porządku. Ponieważ nadal nie będzie wystarczająco dobry dla interesującego zakresu argumentów między a lub mniej, powtórzmy procedurę. Tym razem odwrotny błąd względny - w szczególności wyrażenie powinien zachowywać się jak dla dużych (na podstawie poprzednich rozważań dotyczących parzystości) . W związku z tym mnożymy przez i znajdujemy następny limit: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]]
Wartość wynosi
za2)= 132 π--√mi3 ( - 4 + π)2)8 ( - 3 + π)( 32 - 9 ( - 4 + π)3)π( - 3 + π)2)) ≈114,687.
Proces ten może trwać tak długo, jak chcemy. Zrobiłem to jeszcze jeden krok, znajdując
a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]]
o wartości około 1623,67. (Pełne wyrażenie obejmuje racjonalną funkcję stopnia i jest zbyt długa, aby była tu użyteczna.)π
Odkręcenie tych operacji daje nam ostateczne przybliżenie
fa3)( x ) = f( x ) ( a1- a2)/ x2)+ a3)/ x4) / x.
Błąd jest proporcjonalny do . Import jest stałą proporcjonalności, więc wykreślamy : x 6 ( 1 - erfc ( x ) / f 3 ( x ) )x- 6x6( 1 - erfc ( x ) / f3)( x ) )
Szybko zbliża się do wartości granicznej około 2660,59. Korzystając z aproksymacji , otrzymujemy oszacowania którego względna dokładność jest lepsza niż dla wszystkich . Gdy przekroczy około 20, mamy trzy cyfry znaczące (lub znacznie więcej, ponieważ staje się większy). Jako sprawdzenie, oto tabela porównująca prawidłowe wartości z przybliżeniem dla między a :erfc ( xfa3)2661 / x 6 x > 0 x x x 10 20erfc (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
W rzeczywistości, to przybliżenie dostarcza co najmniej dwie znaczące liczby precyzji dla , co oznacza, że obliczenia pieszych (takie jak funkcja Excela ) się kończą.x = 8NormSDist
Na koniec można się martwić naszą zdolnością do obliczenia wstępnego przybliżenia . Nie jest to jednak trudne: gdy jest wystarczająco duży, aby spowodować niedomiar wykładniczy, pierwiastek kwadratowy jest dobrze przybliżony do połowy wykładniczej,fax
fa( x ) ≈ 12)exp( - x2)( 4 + a x2)π+ a x2)) ) .
Obliczenie tego logarytmu (w podstawie 10) jest proste i łatwo daje pożądany rezultat. Na przykład niech . Wspólnym logarytmem tego przybliżenia jestx = 1000
log10(f(x))≈(−10002(4+a⋅10002π+a⋅10002)−log(2))/log(10)∼−434295.63047.
Wykładnicze wydajności
f(1000)≈2.34169⋅10−434296.
Zastosowanie poprawki (w ) daje wynikf3
erfc(1000)≈1.86003 70486 32328⋅10−434298.
Zwróć uwagę, że poprawka zmniejsza pierwotne przybliżenie o ponad 99% (i rzeczywiście ). (To przybliżenie różni się od poprawnej wartości tylko w ostatniej cyfrze. Kolejne dobrze znane przybliżenie, , równa się , z szóstej cyfry znaczącej. Jestem pewien, że moglibyśmy to poprawić, jeśli poszukiwany przy użyciu tych samych technik).a1/x≈1%1,860038⋅10 - 434298exp(−x2)/(xπ−−√)1.860038⋅10−434298