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