WB01432_.gif (3228 バイト)

正規分布ソースプログラム

       

/*==============================================================================================

        normal.c

                                                 正規分布

             積分範囲:0〜7σ、計算精度:小数点以下5桁まで保証

                                                                                                                          1999.9.12

                                                                                                                             by T.Kubota

 ================================================================================================*/

#include <stdio.h>

#include <math.h>

#define    PI         3.141592653589793238462

#define    EPS    (1e-6)

double prob_inte(double);                             /* 確率積分関 */

double fact(long);                                       /* 階乗関数 */

int main(void)

{

    double    a,b,a1,b1;                                  /* 積分区間 */

    double    pa,pb,pab;                                 /* 確率 */

    double    u,s;                                          /* 平均値,標準偏差 */

    double    wk1,wk2;                                   /* 作業用変数 */

    int        n;                                             /* メニュー番号 */

    printf("********** 正規分布 **********\n\n");

    printf("              1: 標準正規分布   N(0,1)\n\n");

    printf("              2: 非標準正規分布 N(μ,σ)\n\n");

    printf("選択する番号を入力して下さい.--->);

    scanf("%d",&n);

    if(n==1){

        printf("\n\n積分区間 a〜b(0<a<b)を入力して下さい.--->);

        scanf("%lf %lf",&a,&b);

    }

    else if(n==2){

        printf("\n\n平均値と標準偏差を入力してください.--->);

        scanf("%lf %lf",&u,&s);

        printf("積分区間 a〜b(0<a<b)を入力して下さい.--->);

        scanf("%lf %lf",&a1,&b1);

        a=(a1-u)/s;                                                 /* 標準正規分布変換 */

        b=(b1-u)/s;                                                 /* 標準正規分布変換 */

    }

    else{

        printf("\n\n選択した番号が不正です.\n);

        exit(1);

    }

    wk1=fabs(a)/sqrt(2);                                             /* 正規分布を誤差関数に変換 */

    wk2=fabs(b)/sqrt(2);                                             /* 正規分布を誤差関数に変換 */

    if(a==0){

        pa=0;

    }

    else{

        pa=prob_inte(a);

    }

    f(b==0){

        pb=0;

    }

    else{

        pb=prob_inte(b);

    }

    if(a*b>=0)

            pab=fabs(pb-pa)/2.0;

    else

            pab=fabs(pb+pa)/2.0;

    if(n==2)      a=a1;     b=b1;

    printf("区間 %g 〜 %g の確率は %7.5lf です.\n",a,b,pab);

    return 0;

}

 

/*

*    確率積分: double prob_inte(double x)       確率積分のページ参照

*/

 

/*

  *    階乗計算: double fact(long n)                確率積分のページ参照

  */

このページの先頭へ