/****************************/ /* ポアソン分布の計算 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> /**************/ /* 階乗の計算 */ /**************/ double fact(int n) { double x = 1.0; int i1; for (i1 = 2; i1 <= n; i1++) x *= i1; return x; } /********************************************/ /* ポアソン分布の計算(P(X = x), P(X < x)) */ /* x : データ */ /* ram : パラメータ */ /* pr : P(X = x) */ /* return : P(X < x) */ /********************************************/ #include <math.h> double Poisson(int x, double ram, double *pr) { double f = 0.0; int i1; *pr = pow(ram, x) * exp(-ram) / fact(x); f = *pr; for (i1 = 0; i1 < x; i1++) f += pow(ram, i1) * exp(-ram) / fact(i1); return f; } /********/ /* main */ /********/ int main() { double ram, pr, f; int x, up, sw; char file1[100], file2[100]; FILE *out1, *out2; printf("λ は? "); scanf("%lf", &ram); printf("グラフ出力?(=1: yes, =0: no) "); scanf("%d", &sw); // 密度関数と分布関数の値 if (sw == 0) { printf(" データは? "); scanf("%d", &x); f = Poisson(x, ram, &pr); printf("P(X = %d) = %f, P( X < %d) = %f (λ = %f)\n", x, pr, x, f, ram); } // グラフ出力 else { printf(" 密度関数のファイル名は? "); scanf("%s", file1); printf(" 分布関数のファイル名は? "); scanf("%s", file2); printf(" データの上限は? "); scanf("%d", &up); out1 = fopen(file1,"w"); out2 = fopen(file2,"w"); for (x = 0; x <= up; x++) { f = Poisson(x, ram, &pr); fprintf(out1, "%d %f\n", x, pr); fprintf(out2, "%d %f\n", x, f); } } return 0; }