JAVAによる統計学入門 08 シンプソンの公式 02

 


up 2022 06 15 (Fri)
 
 
08 シンプソンの公式 02 正規密度関数の積分
07 シンプソンの公式 01 y = x で面積の算出
06 中心極限定理 02 標準化 1標準偏差、 2標準偏差、 3標準偏差の個数計算、
05 中心極限定理 01 一様乱数、N個のサンプルの平均の分布
04 正規分布 01 確率密度関数、標準正規分布
03 誕生日問題 02 シミュレーションによる確認、ソート
02 誕生日問題 01 階乗、
01 二項分布 : 組み合わせ、nCr = n! / (r! * (n-r)!)  
 
 
【正規確率密度関数の積分】  
 
 シンプソンの公式つ使って、確率密度関数の積分を近似する。
 

//  a  から b  の範囲の面積 = h/3 {y0 + y2n + 4 (y1 + y3 + ... + y2n-1) + 2(y2 + y4 + ... + y2n-2)}
 

//  平均 10.0  標準偏差 5.0 の正規分布を a から bまで積分する。    
//  a = 15.0,  b = 25.0; m = 10.0;  s  = 5.0;  n = 100;  

//  h = (b-a)/(2n)
//
public class s01  { // (Simpson's rule)

  public static void main(String args[]){
    SR01 sr = new SR01();
    sr.start();                        
  } 
}

class SR01{

  double a = 15.0; 
  double b = 25.0; 
  double m = 10.0; 
  double s =  5.0; 

  int n = 100; 

   double za = (a-m)/s;   
   double zb = (b-m)/s;   
   double h = (zb - za) /(n*2);

  void start(){
    double total = 0;
    double t01 = func(za) + func(zb);  
    System.out.println(" a = " + a + " b = " + b + " m = " + m + " s = " + s);
    System.out.println(" za = " + za + " func(za) = " + func(za) + " zb = " + zb + " func(zb) " + func(zb) + " h = " + h);
    System.out.println(" t01 = " + t01);

    double t02 = 0;
    double t03 = 0;
    double x = za + h;  // (y1 + y3 + ... + y2n-1)     
    System.out.println(); 
    for(int i = 1; i<= n*2 -1; i+=2){
      t02 += func(x);
      System.out.println(" x = " + x + " func(x) = " + func(x) + " t02 = " + t02);
      x += h * 2;
    }
    System.out.println(); 
    System.out.println("t02 = " + t02);

    x = za + h * 2;
    System.out.println(); 
    for(int i = 2; i<= n*2 - 2; i+=2){  // (y2 + y4 + ... + y2n-2)
      t03 += func(x);
      System.out.println(" x = " + x + " func(x) = " + func(x) + " t03 = " + t03);
      x += h * 2;
    }
    System.out.println("t03 = " + t03);
    total = t01 + t02*4 + t03 * 2; 
    total = total * h / 3;
    System.out.println("total = " + total);

  }
//  1/root(2 * PI) * E ** (-x+x)/(2) 
  double func(double x){  // y = x
    return  1/Math.sqrt(Math.PI *2)  * Math.pow(Math.E, -x*x/2);
  }
}
/*  デバッグのために挿入した System.out.print(...)の値
h = 0.5
t01 = 6.0

 x = 0.5 func(x) = 0.5 t02 = 0.5
 x = 1.5 func(x) = 1.5 t02 = 2.0
 x = 2.5 func(x) = 2.5 t02 = 4.5
 x = 3.5 func(x) = 3.5 t02 = 8.0
 x = 4.5 func(x) = 4.5 t02 = 12.5
 x = 5.5 func(x) = 5.5 t02 = 18.0

t02 = 18.0

 x = 1.0 func(x) = 1.0 t03 = 1.0
 x = 2.0 func(x) = 2.0 t03 = 3.0
 x = 3.0 func(x) = 3.0 t03 = 6.0
 x = 4.0 func(x) = 4.0 t03 = 10.0
 x = 5.0 func(x) = 5.0 t03 = 15.0
t03 = 15.0
total = 18.0
*/