はじめMath! Javaでコンピュータ数学

第55回 確率の数学 正規分布

この記事を読むのに必要な時間:およそ 2.5 分

問題 標準正規分布のz=0の点から任意のzまでの積分値を返すプログラムを作りましょう。

教科書の巻末等に掲載されている正規分布の数表は,次の式54.5の,標準正規分布の確率密度関数の積分について,aを0から4程度まで,0.01刻みで変えて積分値を求めたものです。

今回の演習では,z=0から1の積分値をJava言語のプログラムで近似計算して求めてみましょう。0.3413が得られれば正しく計算できたことにします。図55.3に大まかなヒントを示します。

図55.3 標準正規分布の確率密度関数を数値積分する

図55.3 標準正規分布の確率密度関数を数値積分する

標準正規分布の確率密度関数は,スムーズな形状の曲線を描きますので,図のような方法で数表に掲載されている程度の精度を得ることができます。

積分といっても,関数のグラフと各軸で囲まれた部分の面積を求めるだけのことです。曲線を持つ図形ですから,簡単には面積が得られません。

そこで図形を細い短冊形に切り刻み,短冊の面積を合計します。図55.3のようにして積分値を求める方法を数値積分※7といいます。

※7)
numerical integration 別名 数値求積法(quadrature)

解説

問題 標準正規分布のz=0の点から任意のzまでの積分値を返すプログラムを作りましょう。

式をプログラムコードに置き換え,ごとに短冊の面積を合計していくだけの単純な方法です。地道に組めばすんなりできあがるのですが,整数,実数の取り扱いを几帳面に行わないと変な誤差が発生します。解答例を示しますので,うまくいかなかった方は参考にしてご自分のコードを改善してください。

ソースコード:Sample GetSND.java完成版

/*
  問題 標準正規分布の積分を求めましょう。
  filename : Sample_GetSND.java
 */

class Sample_GetSND {

  public static void main(String[] args) {

    int DIV = 10000; //標準偏差を何等分するか
    double deltaZ = 1.0 / DIV; //微小長方形の幅
    double S = 0; //積分結果
    double z = 1; //面積を求めたいz 位置
    double temp_z = 0;

    //---------------------------------
    System.out.println("標準正規分布を0 から"
             + z + "まで積分する。");
    for (int i=0; i<(long)(z*DIV); ++i){
      temp_z = (double) i / DIV + 0.5 * 1.0 / DIV;
      S += 1.0 / Math.sqrt(2*Math.PI)
        * Math.exp(- Math.pow( temp_z ,2 ) / 2)
        * 1.0 / DIV;
    }

    int prec = (int) Math.log10(DIV);
    System.out.println("<結果>結果の精度は小数点以下"
     + prec + "桁程度です。");
    System.out.println(S);

  }// end of main
}// end of class Sample_GetSND

実行結果は次のようになりました。

C:\>java Sample_GetSND
標準正規分布を0から1.0まで積分する。
<結果>結果の精度は小数点以下4桁程度です。
0.3413447461693643

今回はここまで

今回は標準正規分布の定義式を確認し,正規分布表に掲載された数値を近似的に計算する方法を学びました。

今回のまとめ

  • 標準正規分布の意味と定義式を確認しました。
  • Java言語で近似的に正規分布表の数値を求めました。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。