質問は補完的な誤差関数に関する
erfc(x )= 2π−−√∫∞バツexp(− t2)dt
「大きい」値の場合バツ(= n / 2–√元の質問の 2)-つまり、100〜700,000程度です。(実際には、約6を超える値は、「大きい」と見なされる必要があります。)これはp値の計算に使用されるため、3桁を超える(10進数)桁を取得することはほとんどありません。 。
まず、@ Iteratorによって提案された近似を検討します。
f(x )= 1 − 1 − exp( − x2(4 + a x2π+ a x2))−−−−−−−−−−−−−−−−−−−−−−√、
どこ
a = 8 (π− 3 )3 (4 - π)≈ 0.439862。
これはエラー関数自体の優れた近似ですが、恐ろしい近似です。ただし、それを体系的に修正する方法があります。erfc
このような大きな値に関連付けられたp値については、相対誤差f (x )/ erfc(x )− 1に関心があります。3桁の精度で絶対値が0.001未満になることを願っています。残念ながら、この式は、倍精度計算のアンダーフローのため、大きなxを調べるのは困難です。ここでは対相対誤差プロット1つの試みであり、Xのための0 ≤ X ≤ 5.8:バツ f(x )/ erfc(x )− 1バツバツ0 ≤ X ≤ 5.8
が5.3程度を超えると計算が不安定になり、5.8を超える1桁の有効数字を提供できなくなります。これは驚くべきことではない:EXP (- 5.8 2)≈ 10 - 14.6倍精度演算の限界を押しています。xが大きい場合に相対誤差が許容できるほど小さくなるという証拠はないため、もっとうまくやる必要があります。バツexp(− 5.82)≈ 10− 14.6バツ
拡張演算(Mathematicaを使用)で計算を実行すると、何が起こっているのかがわかります:
エラーはとともに急速に増加し、横ばいの兆候は見られません。過去のx = 10前後では、この近似は1桁の信頼できる情報も提供しません!バツx = 10
ただし、プロットは線形に見え始めています。相対誤差は正比例すると推測できます。(これは、理論的な根拠に基づいて理にかなって:ERFCは明らか奇関数であり、fはさえ明らかであるので、それらの比は奇関数であるべきで、それは増加した場合にこのように、我々は、相対誤差が予想される、奇数電源のように動作する。X。)これにより、xで割った相対誤差を調べることになります。等価的に、私は検討することを選択したX ⋅ ERFC(X )/ F (X )バツerfcfバツ バツX ⋅ ERFC(X )/ F(x )なぜなら、これには一定の制限値が必要だからです。そのグラフは次のとおりです。
私たちの推測は裏付けられているように見えます。この比率は、約8程度の限界に近づいているようです。尋ねられたら、Mathematicaはそれを提供します:
a1 = Limit[x (Erfc[x]/f[x]), x -> \[Infinity]]
値は、1 = 2。 これは、推定値を改善することを可能に:私たちは取りますa1= 2π√e3 (− 4 + π)28 (− 3 + π)≈ 7.94325
f1(x )= f(x )a1バツ
近似の最初の改良として。本当に大きいです-数千を上回る-この近似はだけで結構です。5.3から2000程度の興味深い範囲の引数に対してはまだ十分ではないので、手順を繰り返しましょう。今回は、逆相対誤差、具体的には式1 − erfc(x )/ f 1(x ) -は、大きなxに対して1 / x 2のように動作するはずです(以前のパリティの考慮事項により)。したがって、x 2を掛けますバツ5.32000年1−erfc(x)/f1(x)1/x2xx2 次の制限を見つけます。
a2 = Limit[x^2 (a1 - x (Erfc[x]/f[x])), x -> \[Infinity]]
値は
a2=132π−−√e3(−4+π)28(−3+π)(32−9(−4+π)3π(−3+π)2)≈114.687.
このプロセスは、必要な限り続行できます。私はそれをもう一歩踏み出し、見つけました
a3 = Limit[x^2 (a2 - x^2 (a1 - x (Erfc[x]/f[x]))), x -> \[Infinity]]
値は約1623.67です。(完全な式は8次の有理関数を含み、長すぎてここでは役に立ちません。)π
これらの操作を解くと、最終的な近似が得られます
f3(x )= f(x )(a1− a2/ x2+ a3/ x4)/ x。
誤差は比例します。インポートは比例定数なので、x 6(1 − erfc(x )/ f 3(x ))をプロットします。バツ− 6バツ6(1 − erfc(x )/ f3(x ))
2660.59付近の制限値に急速に近づきます。近似を使用して、すべてのx > 0に対して相対精度が2661 / x 6より優れているerfc(x )の推定値を取得します。一度、xは 20かそこら超える(として、またははるかに、私たちは3つの重要な数字を持って、xが大きくなります)。チェックとして、ここでの近似に正しい値を比較した表であるXとの間の10と20:f3erfc(x)2661 / x6x > 0バツバツバツ1020
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
実際、この近似により、に少なくとも2つの有効桁数の精度が得られます。これは、歩行者の計算(Excelの関数など)が変化するところです。x = 8NormSDist
最後に、初期近似を計算する能力について心配するかもしれません。ただし、それは難しくありません。xが指数関数でアンダーフローを引き起こすのに十分な大きさである場合、平方根は指数関数の半分で近似されます。fバツ
f(x)≈12exp(−x2(4+ax2π+ax2)).
これの対数の計算(10を底とする)は簡単で、望ましい結果がすぐに得られます。たとえば、ます。この近似の常用対数はx = 1000
ログ10(f(x ))≈ ( − 10002(4 + ⋅ 1000年2π+ ⋅ 1000年2) −log(2 ))/log(10 )〜- 434295.63047。
累乗利回り
f(1000年)≈ 2.34169 ⋅ 10− 434296。
()補正を適用すると、f3
ERFC(1000年)≈1.860037048632328⋅ 10 −434298.
補正は99%以上、元の近似値を減少させることに留意されたい(そして実際、1 / X ≈ 1 %)のみ最後の桁に正しい値から(この近似が異なる別の周知の近似。EXP (- X 2)/(X √a1/x≈1%、等しい1.860038⋅10 - 434298、第六の上位桁に誤ります。同じテクニックを使用して、必要に応じてそれも改善できると確信しています。)exp(−x2)/(xπ−−√)1.860038⋅10−434298