用 C 语言计算累积分布函数(CDF)

CBeginner
立即练习

简介

在本实验中,你将学习如何用 C 语言计算累积分布函数(CDF)。本实验涵盖两个主要步骤:读取分布参数和 x 值,然后使用标准正态分布将从负无穷到给定 x 值的概率相加来计算 CDF。本实验提供了完整的代码实现,并逐步引导你完成整个过程,确保你对用 C 语言计算 CDF 有扎实的理解。

读取分布参数和 x 值

在这一步中,你将学习如何读取分布参数和 x 值,以便在 C 语言中计算累积分布函数(CDF)。

首先,让我们创建一个新的 C 文件来实现我们的 CDF 计算:

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 和 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;
}

使用数学库编译程序:

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%

总结

在本实验中,你学习了如何读取分布参数(均值和标准差)以及一个 x 值,以便在 C 语言中计算累积分布函数(CDF)。然后,你使用标准正态分布近似函数,通过将从负无穷到给定 x 值的概率相加来实现 CDF 计算。最后,你打印了所提供输入参数的 CDF 值。

本实验的关键学习要点是计算 CDF 所需的步骤,包括读取必要的输入数据以及应用标准正态 CDF 近似公式来计算所需的 CDF 值。