/*==============================================================================================
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) 確率積分のページ参照
*/