C 言語による近似正規分布 PDF

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

はじめに

この実験では、C 言語で正規分布確率密度関数 (PDF) を近似する方法を学びます。まず、点 (x)、平均 (μ)、標準偏差 (σ) の入力値を読み込み、標準的な公式を使用して PDF を計算します。最後に、計算された PDF の値を出力します。

この実験では、ユーザー入力の読み込み、PDF の計算、結果の表示を含む、この機能を C 言語で実装する手順を段階的に説明します。この実験は、C 言語プログラミングにおける確率と組み合わせ論の概念を実際に理解することを目的としています。

x, 平均 μ, 標準偏差 σ の読み込み

このステップでは、C 言語で正規分布確率密度関数 (PDF) を計算するために、入力値を読み込む方法を学びます。x (点)、μ (平均)、σ (標準偏差) の 3 つの重要なパラメータを受け取るプログラムを作成します。

まず、実装のための新しい C ファイルを作成しましょう。

cd ~/project
nano normal_pdf.c

次に、入力値を読み込むための初期コードを記述します。

#include <stdio.h>

int main() {
    double x, mean, std_dev;

    printf("点 x を入力してください:");
    scanf("%lf", &x);

    printf("平均 (μ) を入力してください:");
    scanf("%lf", &mean);

    printf("標準偏差 (σ) を入力してください:");
    scanf("%lf", &std_dev);

    printf("入力値:\n");
    printf("x = %.2f\n", x);
    printf("平均 (μ) = %.2f\n", mean);
    printf("標準偏差 (σ) = %.2f\n", std_dev);

    return 0;
}

プログラムをコンパイルして実行します。

gcc normal_pdf.c -o normal_pdf
./normal_pdf

出力例:

点 x を入力してください: 2.5
平均 (μ) を入力してください: 0
標準偏差 (σ) を入力してください: 1
入力値:
x = 2.50
平均 (μ) = 0.00
標準偏差 (σ) = 1.00

このコードは、以下のことを示しています。

  1. scanf() を使用して倍精度浮動小数点数を取得する
  2. x、平均、標準偏差の入力値を格納する
  3. 入力値を出力して、正しい入力が確認できる

PDF = (1/(σ√(2π))) * exp(-((x-μ)²/(2σ²))) の計算

このステップでは、数学的な公式を用いて正規分布の確率密度関数 (PDF) を計算するプログラムを拡張します。

normal_pdf.c ファイルを更新します。

nano ~/project/normal_pdf.c

以前の内容を以下に置き換えます。

#include <stdio.h>
#include <math.h>

double compute_normal_pdf(double x, double mean, double std_dev) {
    // PDF を標準正規分布の公式を用いて計算します
    double pi = 3.14159265358979323846;
    double coefficient = 1.0 / (std_dev * sqrt(2 * pi));
    double exponent = -pow(x - mean, 2) / (2 * pow(std_dev, 2));

    return coefficient * exp(exponent);
}

int main() {
    double x, mean, std_dev, pdf;

    printf("点 x を入力してください:");
    scanf("%lf", &x);

    printf("平均 (μ) を入力してください:");
    scanf("%lf", &mean);

    printf("標準偏差 (σ) を入力してください:");
    scanf("%lf", &std_dev);

    // PDF を計算します
    pdf = compute_normal_pdf(x, mean, std_dev);

    printf("入力値:\n");
    printf("x = %.2f\n", x);
    printf("平均 (μ) = %.2f\n", mean);
    printf("標準偏差 (σ) = %.2f\n", std_dev);
    printf("確率密度 = %.6f\n", pdf);

    return 0;
}

数学ライブラリを使用してプログラムをコンパイルします。

gcc ~/project/normal_pdf.c -o ~/project/normal_pdf -lm

プログラムを実行します。

~/project/normal_pdf

出力例:

点 x を入力してください: 2.5
平均 (μ) を入力してください: 0
標準偏差 (σ) を入力してください: 1
入力値:
x = 2.50
平均 (μ) = 0.00
標準偏差 (σ) = 1.00
確率密度 = 0.017528

この実装における重要な点は以下のとおりです。

  1. PDF を計算するための別々の関数 compute_normal_pdf() を作成しました。
  2. math.h ライブラリ関数 (sqrt(), exp(), pow()) を使用しました。
  3. 標準正規分布の PDF 公式を実装しました。
  4. 計算された確率密度を出力しました。

値の出力

この最終ステップでは、正規分布 PDF プログラムを拡張し、より詳細な出力フォーマットと視覚化オプションを追加します。

normal_pdf.c ファイルを更新します。

nano ~/project/normal_pdf.c

以前の内容を以下に置き換えます。

#include <stdio.h>
#include <math.h>

double compute_normal_pdf(double x, double mean, double std_dev) {
    double pi = 3.14159265358979323846;
    double coefficient = 1.0 / (std_dev * sqrt(2 * pi));
    double exponent = -pow(x - mean, 2) / (2 * pow(std_dev, 2));

    return coefficient * exp(exponent);
}

void print_pdf_details(double x, double mean, double std_dev, double pdf) {
    printf("\n--- 正規分布 PDF 詳細 ---\n");
    printf("点 (x)               : %.2f\n", x);
    printf("平均 (μ)               : %.2f\n", mean);
    printf("標準偏差 (σ)          : %.2f\n", std_dev);
    printf("確率密度 (f(x))      : %.6f\n", pdf);

    // PDF 値の解釈を追加
    if (pdf > 0.3) {
        printf("解釈:高い確率密度\n");
    } else if (pdf > 0.1) {
        printf("解釈:中程度の確率密度\n");
    } else {
        printf("解釈:低い確率密度\n");
    }
}

int main() {
    double x, mean, std_dev, pdf;

    printf("正規分布確率密度関数計算機\n");
    printf("点 x を入力してください:");
    scanf("%lf", &x);

    printf("平均 (μ) を入力してください:");
    scanf("%lf", &mean);

    printf("標準偏差 (σ) を入力してください:");
    scanf("%lf", &std_dev);

    // PDF を計算します
    pdf = compute_normal_pdf(x, mean, std_dev);

    // 詳細な結果を出力します
    print_pdf_details(x, mean, std_dev, pdf);

    return 0;
}

プログラムをコンパイルします。

gcc ~/project/normal_pdf.c -o ~/project/normal_pdf -lm

プログラムを実行します。

~/project/normal_pdf

出力例:

正規分布確率密度関数計算機
点 x を入力してください: 2.5
平均 (μ) を入力してください: 0
標準偏差 (σ) を入力してください: 1

--- 正規分布 PDF 詳細 ---
点 (x)               : 2.50
平均 (μ)               : 0.00
標準偏差 (σ)          : 1.00
確率密度 (f(x))      : 0.017528
解釈: 低い確率密度

この実装における主な強化点は以下のとおりです。

  1. フォーマットされた出力のために専用の関数 print_pdf_details() を追加しました。
  2. PDF 値の簡単な解釈を含めました。
  3. 説明的なタイトルでユーザーインターフェースを改善しました。
  4. 前のステップからのコア PDF 計算ロジックを維持しました。

まとめ

この実験では、正規分布確率密度関数 (PDF) の入力値(点 x、平均 μ、標準偏差 σ)を C 言語で読み込む方法を学びました。その後、係数と指数項を計算する数学的公式を実装して PDF を計算しました。最終ステップは、計算された PDF 値を出力することです。

この実験で得られた主な学習点は、1) scanf() を使用して倍精度浮動小数点数を読み込むこと、2) x、平均、標準偏差の入力値を格納すること、3) 標準正規分布の公式を使用して PDF を計算すること、4) 結果の PDF 値を出力することです。