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

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/FunctionsGroup -.-> c/math_functions("Math Functions") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-435339{{"用 C 语言计算累积分布函数(CDF)"}} c/math_functions -.-> lab-435339{{"用 C 语言计算累积分布函数(CDF)"}} c/user_input -.-> lab-435339{{"用 C 语言计算累积分布函数(CDF)"}} c/output -.-> lab-435339{{"用 C 语言计算累积分布函数(CDF)"}} end

读取分布参数和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值。