C 言語で累積分布関数 (CDF) を計算する方法

CBeginner
オンラインで実践に進む

はじめに

この実験では、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 を計算するために必要な手順です。