はじめに
この実験では、C 言語で累積分布関数 (CDF) を計算する方法を学びます。この実験は主に 2 つのステップから構成されます。まず、分布のパラメータと x 値を読み込み、次に標準正規分布を用いて、負の無限大から与えられた x 値までの確率を合計することで CDF を計算します。この実験では、完全なコード実装を提供し、CDF 計算のプロセスを段階的にガイドすることで、C 言語における CDF 計算の確かな理解を確立します。
分布パラメータと x 値の読み込み
このステップでは、C 言語で累積分布関数 (CDF) を計算するために、分布パラメータと x 値を読み込む方法を学びます。
まず、CDF 計算を実装するための新しい C ファイルを作成しましょう。
cd ~/project
nano cdf_calculator.c
次に、分布パラメータを読み込むための以下のコードを追加します。
#include <stdio.h>
#include <stdlib.h>
int main() {
// 分布パラメータ
double mean, std_dev;
double x_value;
// ユーザーに分布パラメータを促す
printf("平均 (μ) を入力してください:");
scanf("%lf", &mean);
printf("標準偏差 (σ) を入力してください:");
scanf("%lf", &std_dev);
// ユーザーに x 値を促す
printf("CDF を計算する x 値を入力してください:");
scanf("%lf", &x_value);
// 確認のために入力パラメータを出力
printf("\n入力パラメータ:\n");
printf("平均 (μ): %.2f\n", mean);
printf("標準偏差 (σ): %.2f\n", std_dev);
printf("X 値:%.2f\n", x_value);
return 0;
}
プログラムをコンパイルして実行します。
gcc cdf_calculator.c -o cdf_calculator
./cdf_calculator
実行例:
平均 (μ) を入力してください: 5.0
標準偏差 (σ) を入力してください: 2.0
CDFを計算するx値を入力してください: 3.5
入力パラメータ:
平均 (μ): 5.00
標準偏差 (σ): 2.00
X 値: 3.50
-∞ から x までの確率の合計
このステップでは、標準正規分布を用いて、負の無限大から与えられた x 値までの確率を合計することで、累積分布関数 (CDF) を計算する方法を学びます。
前の C プログラムを修正して CDF 計算を実装しましょう。
cd ~/project
nano cdf_calculator.c
前のコードを以下の実装に置き換えます。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 標準正規 CDF 近似関数 (Abramowitz and Stegun)
double standard_normal_cdf(double x) {
const double a1 = 0.254829592;
const double a2 = -0.284496736;
const double a3 = 1.421413741;
const double a4 = -1.453152027;
const double a5 = 1.061405429;
const double p = 0.3275911;
// 負の値を扱う
int sign = (x < 0) ? -1 : 1;
x = fabs(x);
// 近似式
double t = 1.0 / (1.0 + p * x);
double y = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * exp(-x * x);
return 0.5 * (1.0 + sign * y);
}
// 正規分布の CDF を計算する
double normal_cdf(double x, double mean, double std_dev) {
// Z スコア計算
double z_score = (x - mean) / std_dev;
return standard_normal_cdf(z_score);
}
int main() {
// 分布パラメータ
double mean, std_dev;
double x_value;
// ユーザーに分布パラメータを促す
printf("平均 (μ) を入力してください:");
scanf("%lf", &mean);
printf("標準偏差 (σ) を入力してください:");
scanf("%lf", &std_dev);
// ユーザーに x 値を促す
printf("CDF を計算する x 値を入力してください:");
scanf("%lf", &x_value);
// CDF を計算して出力
double cdf_value = normal_cdf(x_value, mean, std_dev);
printf("\nCDF 計算結果:\n");
printf("平均 (μ): %.2f\n", mean);
printf("標準偏差 (σ): %.2f\n", std_dev);
printf("X 値:%.2f\n", x_value);
printf("CDF P(X ≤ x): %.4f\n", cdf_value);
return 0;
}
math ライブラリを使用してプログラムをコンパイルします。
gcc cdf_calculator.c -o cdf_calculator -lm
プログラムを実行し、サンプル入力でテストします。
./cdf_calculator
実行例:
平均 (μ) を入力してください:5.0
標準偏差 (σ) を入力してください:2.0
CDF を計算する x 値を入力してください:3.5
CDF 計算結果:
平均 (μ): 5.00
標準偏差 (σ): 2.00
X 値:3.50
CDF P(X ≤ x): 0.2525
CDF 値の出力
このステップでは、累積分布関数 (CDF) の結果をより詳細に表示し、解釈を加えることで、CDF 計算プログラムを強化する方法を学びます。
前の C プログラムを修正して、出力内容を改善し、解釈的なコメントを追加しましょう。
cd ~/project
nano cdf_calculator.c
main() 関数を更新して、より詳細な出力を含めます。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 前の standard_normal_cdf と normal_cdf 関数は同じまま
int main() {
// 分布パラメータ
double mean, std_dev;
double x_value;
// ユーザーに分布パラメータを促す
printf("累積分布関数 (CDF) 計算機\n");
printf("-----------------------------------------------\n");
printf("平均 (μ) を入力してください:");
scanf("%lf", &mean);
printf("標準偏差 (σ) を入力してください:");
scanf("%lf", &std_dev);
// ユーザーに x 値を促す
printf("CDF を計算する x 値を入力してください:");
scanf("%lf", &x_value);
// CDF を計算して出力
double cdf_value = normal_cdf(x_value, mean, std_dev);
// 詳細な出力と解釈
printf("\n--- CDF 計算結果 ---\n");
printf("平均 (μ): %.2f\n", mean);
printf("標準偏差 (σ): %.2f\n", std_dev);
printf("X 値: %.2f\n", x_value);
printf("CDF P(X ≤ x): %.4f (%.2f%%)\n",
cdf_value, cdf_value * 100);
// CDF 値の解釈
printf("\n解釈:\n");
if (cdf_value < 0.5) {
printf("値は平均分布より小さいです。\n");
} else if (cdf_value > 0.5) {
printf("値は平均分布より大きいです。\n");
} else {
printf("値は分布の平均値です。\n");
}
// 確率の説明
printf("%.2f 以下の値を観測する確率:%.2f%%\n",
x_value, cdf_value * 100);
return 0;
}
プログラムをコンパイルします。
gcc cdf_calculator.c -o cdf_calculator -lm
サンプル入力でプログラムを実行します。
./cdf_calculator
実行例:
累積分布関数 (CDF) 計算機
-----------------------------------------------
平均 (μ) を入力してください:5.0
標準偏差 (σ) を入力してください:2.0
CDF を計算する x 値を入力してください:3.5
--- CDF 計算結果 ---
平均 (μ): 5.00
標準偏差 (σ): 2.00
X 値:3.50
CDF P(X ≤ x): 0.2525 (25.25%)
解釈:
値は平均分布より小さいです。
3.50 以下の値を観測する確率:25.25%
まとめ
この実験では、C 言語で分布のパラメータ(平均と標準偏差)と x 値を読み込み、累積分布関数 (CDF) を計算する方法を学びました。標準正規分布の近似関数を使用して、負の無限大から与えられた x 値までの確率を合計することで、CDF の計算を実装しました。最後に、提供された入力パラメータに対する CDF 値を出力しました。
この実験で重要な学習点は、必要な入力データを読み込み、標準正規 CDF の近似式を適用して必要な CDF 値を計算する、CDF を計算するために必要な手順です。



