はじめに
前の記事で正規分布に従う2個の独立な確率変数の和と差の確率密度関数を計算しました。
Google先生に聞いてみたり、思い出しながら書いているためにところどころ用語の使い方が怪しい部分があるかもしれませんが、そのあたりは気づき次第修正します。
前の記事でちょっとエンジンがかかってきたところで、この記事では標準正規分布の確率密度関数をテイラー展開し、さらにそいつを積分して累積分布関数を計算してみます。
ついでに収束判定のところで少し寄り道をします。
テイラー展開します。
本記事では冪乗及び階乗の計算式が頻繁に登場しますが、
指数関数のテイラー展開
指数関数の
次節以降の話の展開の都合上、
標準正規分布の確率密度関数のテイラー展開
次に、標準正規分布の確率密度関数の
といっても、テイラー展開の(一般的な)展開式
に
を直接当てはめようとして、
(
(ただし、
収束することの確認。
標準正規分布の確率密度関数は(
となります。
ここで、ダランベールの収束判定法を使いたい… ところではありますが、(
スポンサーリンク
そこで、ここはコーシーの冪根判定法を使用します。(
となることと、
累積分布関数を計算します。
この節では、前節の結果を利用して累積分布関数を計算します。なお、この節では累積分布関数を
積分します。
まず、不定積分を計算してみます。(
となります。
次に、
したがって、
もうちょい変形。
数学的には(
そこで
すると、
収束があまり速くなさそうな気もしますが、上式のように変形すると級数の前の項の係数の計算結果及び変数
プログラムを書いて検算です。
(
コードを差し替えました。[2018/09/03追記,2018/09/16計算式を訂正]
normDist関数中のwhile文のループの継続条件を変化率の絶対値(
これに伴い、いわゆる「ゼロ割りエラー」が発生するのを防止するため、normDist関数の引数に0が指定された場合には計算を行わずに0.5を返すためのコードを関数の先頭部分に追加しました。
package info.pandanote.normdist; | |
public class NormDistTest { | |
public double normDist(double x) { | |
if (x == 0.0) { | |
return 0.5; | |
} | |
double ax = x; | |
double deltaax = x; | |
int k = 0; | |
while (Math.abs(deltaax/ax) > 1e-12) { | |
deltaax *= x*x*((double)(-(2*k+1)))/(2*k+3)/(2*k+2); | |
//System.out.println("deltaax="+deltaax); | |
ax += deltaax; | |
//System.out.println("ax="+ax); | |
k++; | |
} | |
//System.out.println("k="+k); | |
return ax/Math.sqrt(2.0*Math.PI)+0.5; | |
} | |
public static void main(String[] args) { | |
NormDistTest ndt = new NormDistTest(); | |
double x = 0.0; | |
System.out.println("f("+x+")="+ndt.normDist(x)); | |
x = 1.0; | |
System.out.println("f("+x+")="+ndt.normDist(x)); | |
x = 2.0; | |
System.out.println("f("+x+")="+ndt.normDist(x)); | |
x = 3.0; | |
System.out.println("f("+x+")="+ndt.normDist(x)); | |
x = 4.0; | |
System.out.println("f("+x+")="+ndt.normDist(x)); | |
x = -1.0; | |
System.out.println("f("+x+")="+ndt.normDist(x)); | |
x = -2.0; | |
System.out.println("f("+x+")="+ndt.normDist(x)); | |
x = -3.0; | |
System.out.println("f("+x+")="+ndt.normDist(x)); | |
x = -4.0; | |
System.out.println("f("+x+")="+ndt.normDist(x)); | |
} | |
} |
Excelと答え合わせ。
実はExcelの関数に同様の計算を行うもの(NORM.S.DIST関数)がありますので、その結果と照らし合わせて確認してみます。
正しい計算結果を返していることが確認できました。(`・ω・´)シャキーン
まとめ
ここまでの考察で確率密度関数が正規分布である確率変数がある値
前項の動作確認で
この記事は以上です。