回答:
まさにあなたが探しているものに依存します。以下に、簡単な詳細と参照を示します。
近似に関する文献の多くは、関数集中しています
以下のため。これは、指定した関数が上記の関数の単純な差として分解される可能性があるためです(定数によって調整される場合があります)。この関数は、「正規分布の上端」、「右正規積分」、「ガウス関数」など、多くの名前で呼ばれます。ミルズ比の近似値も表示されます。これは、 ここで、はガウスpdfです。
ここに、あなたが興味を持つかもしれない様々な目的のためのいくつかの参考文献をリストします。
計算
関数または関連する相補誤差関数を計算するための事実上の標準は次のとおりです。
WJ Cody、エラー関数の合理的なチェビシェフ近似、数学。比較 、1969、pp.631--637。
すべての(自尊心のある)実装はこのペーパーを使用します。(MATLAB、Rなど)
「単純な」近似
AbramowitzとStegunには、入力の変換の多項式展開に基づいたものがあります。一部の人々はそれを「高精度」近似として使用します。それはゼロ付近でひどく振る舞うので、私はその目的のためにそれが好きではありません。たとえば、それらの近似ではは得られませんが、これは大きな問題ではないと思います。このために時々悪いことが起こります。
BorjessonとSundbergは、数桁の精度しか必要としないほとんどのアプリケーションで非常にうまく機能する簡単な近似を提供します。絶対相対誤差は、そのシンプルさを考えるとかなり良いです、1%、より悪くなることはありません。基本的な近似は あり、定数の好ましい選択はおよび。その参照は=0.339、B=5.51
PO BorjessonおよびCE Sundberg。通信アプリケーションのエラー関数Q(x)の単純な近似。IEEE Trans。コミュニケーション。、COM-27(3):639–643、1979年3月。
これは、絶対相対誤差のプロットです。
電気工学の文献は、このようなさまざまな近似に満ちており、それらに過度に強い関心を持っているようです。しかし、それらの多くは貧弱であるか、非常に奇妙で複雑な表現に拡大します。
あなたも見ているかもしれません
W.ブリック。右の法線積分に対する一様近似。応用数学と計算、127(2-3):365–374、2002年4月。
ラプラスの連続分数
ラプラスには美しい連続分数があり、すべての値に対して連続した上限と下限が得られ。それは、ミルズの比率で言えば、
ここで使用した表記法は、連続した分数、つまりかなり標準的なものです。ただし、この式は小さなあまり速く収束せず、で発散し。x x = 0
この継続的な割合は、実際には、1900年代半ばから後半に「再発見」されたの「単純な」境界の多くをもたらします。「標準」形式の連続した分数(つまり、正の整数係数で構成される)の場合、奇数(偶数)項で分数を切り捨てると上限(下限)になることがわかります。
したがって、ラプラスは、すぐに伝えます。 これらは両方とも、 1900年代。関数に関しては、これはと同等 パーツによる単純な統合を使用したこの代替の証拠は、S。Resnick、Stochastic Processesの冒険、Birkhauser、1992年、第6章(Brownian motion)にあります。この関連する回答に示されているように、これらの境界の絶対相対誤差はより悪くありません。Q x
特に、上記の不等式はすぐに意味することに注意してください。この事実は、ロピタルのルールを使用しても確立できます。これは、Borjesson-Sundberg近似の関数形式の選択の説明にも役立ちます。選択すると、漸近的等価性がとして維持されます。パラメータは、ゼロに近い「連続性補正」として機能します。A ∈ [ 0 、1 ] のx → ∞ B
関数と2つのラプラスの境界のプロットを次に示します。
CI。C. Leeには、1990年代前半の小さな値に対して「修正」を行う論文があります。見る
CI。C.リー。ラプラスの通常の積分のための割合を続けました。アン。研究所 統計学者。数学。、44(1):107–120、1992年3月。
Durrettの確率:理論と例は、第3版の6〜7ページのの古典的な上限と下限を提供します。これらは、大きな値()を対象としており、漸近的にタイトです。x x > 3
うまくいけば、これで開始できます。より具体的な関心がある場合は、どこかで指摘できるかもしれません。
私は主人公には遅すぎると思うが、枢機postの投稿にコメントしたかったので、このコメントは意図したボックスには大きすぎた。
この回答では、想定しています。適切な反射式は、負の使用できます。x
私は自分でエラー関数を扱うことに慣れていますが、Millsの比率(枢機inalの答えで定義されているようにに関して私が知っていることを書き直そうとします。R (x )
実際、チェビシェフ近似を使用する以外に、(相補的な)エラー関数を計算するための代替方法があります。チェビシェフ近似を使用するには、少なからず係数を保存する必要があるため、コンピューティング環境で配列構造が少しコストがかかる場合、これらの方法には限界があります(係数をインライン化できますが、結果のコードはおそらくバロックのように見えます)混乱)。
「小」の場合、AbramowitzおよびStegunは、適切に動作するシリーズを提供します(少なくとも通常のMaclaurinシリーズよりも動作が良好です)。
系列のの係数は、開始し、再帰式。これは、シリーズを合計ループとして実装するときに便利です。
枢機は、大きなミルズ比を制限する方法として、ラプラシアン連続分数を与えました; あまりよく知られていないのは、連続分数が数値評価にも役立つことです。
Lentz、Thompson、およびBarnettは、連続分数を無限積として数値的に評価するアルゴリズムを導出しました。これは、連続分数を「後方に」計算する通常のアプローチよりも効率的です。一般的なアルゴリズムを表示する代わりに、ミルズ比の計算にどのように特化するかを示します。
ここで、は精度を決定します。
CFは、前述のシリーズがゆっくり収束し始める場合に役立ちます。コンピューティング環境でシリーズからCFに切り替えるには、適切な「ブレークポイント」を決定するために実験する必要があります。ラプラシアンCFの代わりに漸近級数を使用する代替方法もありますが、私の経験では、ラプラシアンCFはほとんどのアプリケーションに十分であるということです。
最後に、(相補的な)エラー関数を非常に正確に(つまり、有効数字数桁まで)計算する必要がない場合、Serge Winitzkiによるコンパクトな 近似があります。それらの1つを次に示します。
この近似の最大相対誤差はあり、が増加するにつれてより正確になります。 x
(この返事はもともと同様の質問に答えて現れ、その後複製として閉じられました。OPはガウス積分の「ある」実装のみを望み、必ずしも「最先端」ではありませんでした。彼のコメントでは、比較的単純な、短い実装が優先されます。)
コメントが指摘しているように、PDFを統合する必要があります。積分を実行するには多くの方法があります。ずっと前に、計算が遅くて高価だったとき、David Hillは単純な算術(有理関数とべき乗)を使用して近似を計算しました。これは、(間の典型的な引数の倍精度精度有し及び、約参照)。1973年、彼はALNORM.Fと呼ばれる応用統計の Fortranバージョンを公開しました。長年にわたって、これを、標準(ガウス)積分を持たない環境や疑わしい環境(Excelなど)があるさまざまな環境に移植しました。
MatLabバージョン(適切な属性)は、http://people.sc.fsu.edu/~jburkardt/m_src/asa005/alnorm.mで入手できます。オリジナルのFortranコードの完全に文書化されていないバージョンが「Koders Code Search」(sic)サイトに表示されます。
何年も前、私はこれをAWKに移植しました。このバージョンは、Cライクな(Fortranではなく)構文と、その精度を高める必要があるため、開発およびテスト時に挿入したいくつかの追加コメントにより、現代の開発者にとって移植性があります。下に表示されます。
科学/数学/統計コードの移植経験があまりない人のために、アドバイスの言葉:単一の誤植は、簡単には検出できない深刻なエラーを作成する可能性があります。(これを信じてください、私はそれらをたくさん作りました。) 常に、常に慎重で徹底的なテストを作成してください。通常の積分/ガウス積分/エラー関数は非常に多くのテーブルと非常に多くのソフトウェアで利用できるため、移植された関数の膨大な数の値を集計し、体系的に比較します(つまり、目ではなくコンピューターと)値を修正します。このようなテストは、コードの冒頭で確認できます。-8.5:8.5(0.1単位)の値のテーブルが生成され、体系的なチェックのために(STDOUT経由で)別のプログラムにパイプできます。
別のテストアプローチ-予想されるエラーを推定する方法を知るのに十分な数値分析のバックグラウンドを持つ人のために-値を数値的に区別し、それらをPDF(簡単に計算される)と比較することです。
ちなみに、このコードは、平均がで単位標準偏差(「シグマ」)の場合のみです。しかし、それだけで十分です。平均がでSDがときにからに統合するには、を計算して適用するだけです。alnorm
Mathematicaalnorm
へのポートをテストしました。これは、任意の精度で値を計算します。結果を比較するために、ここに、上限値との比の自然対数のプロットがあります。(正の相対誤差は大きすぎることを意味します。)alnorm
値は常に、わずかに小さいテール確率に対してまで正確です。計算が漸近式()に切り替わる場所を見ることができ、が増加するにつれてこの式が非常に正確になることが明らかです。プロットは、停止します。これは、倍精度のべき乗がアンダーフローを開始する場所だからです。
たとえば、をalnorm[-6.0]
返しますが、に等しい真の値は約、最初は12番目の10進数が異なります。
この編集のNBとして部分は、私が変更UPPER_TAIL_IS_ZERO
から15.
の16.
コードで:それはのため結果はほんの少しより正確になるとの間のと。(編集の終了。)15 16
#----------------------------------------------------------------------#
# ALNORM.AWK
# Compute values of the cumulative normal probability function.
# From G. Dallal's STAT-SAK (Fortran code).
# Additional precision using asymptotic expression added 7/8/92.
#----------------------------------------------------------------------#
BEGIN {
for (i=-85; i<=85; i++) {
x = i/10
p = alnorm(x, 0)
printf("%3.1f %12.10f\n", x, p)
}
exit
}
function alnorm(z,up, y,aln,w) {
#
# ALGORITHM AS 66 APPL. STATIST. (1973) VOL.22, NO.3:
# Hill, I.D. (1973). Algorithm AS 66. The normal integral.
# Appl. Statist.,22,424-427.
#
# Evaluates the tail area of the standard normal curve from
# z to infinity if up, or from -infinity to z if not up.
#
# LOWER_TAIL_IS_ONE, UPPER_TAIL_IS_ZERO, and EXP_MIN_ARG
# must be set to suit this computer and compiler.
LOWER_TAIL_IS_ONE = 8.5 # I.e., alnorm(8.5,0) = .999999999999+
UPPER_TAIL_IS_ZERO = 16.0 # Changes to power series expression
FORMULA_BREAK = 1.28 # Changes cont. fraction coefficients
EXP_MIN_ARG = -708 # I.e., exp(-708) is essentially true 0
if (z < 0.0) {
up = !up
z = -z
}
if ((z <= LOWER_TAIL_IS_ONE) || (up && z <= UPPER_TAIL_IS_ZERO)) {
y = 0.5 * z * z
if (z > FORMULA_BREAK) {
if (-y > EXP_MIN_ARG) {
aln = .398942280385 * exp(-y) / \
(z - 3.8052E-8 + 1.00000615302 / \
(z + 3.98064794E-4 + 1.98615381364 / \
(z - 0.151679116635 + 5.29330324926 / \
(z + 4.8385912808 - 15.1508972451 / \
(z + 0.742380924027 + 30.789933034 / \
(z + 3.99019417011))))))
} else {
aln = 0.0
}
} else {
aln = 0.5 - z * (0.398942280444 - 0.399903438504 * y / \
(y + 5.75885480458 - 29.8213557808 / \
(y + 2.62433121679 + 48.6959930692 / \
(y + 5.92885724438))))
}
} else {
if (up) { # 7/8/92
# Uses asymptotic expansion for exp(-z*z/2)/alnorm(z)
# Agrees with continued fraction to 11 s.f. when z >= 15
# and coefficients through 706 are used.
y = -0.5*z*z
if (y > EXP_MIN_ARG) {
w = -0.5/y # 1/z^2
aln = 0.3989422804014327*exp(y)/ \
(z*(1 + w*(1 + w*(-2 + w*(10 + w*(-74 + w*706))))))
# Next coefficients would be -8162, 110410
} else {
aln = 0.0
}
} else {
aln = 0.0
}
}
return up ? aln : 1.0 - aln
}
### end of file ###