用 C 语言近似正态分布概率密度函数

CCBeginner
立即练习

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

简介

在本实验中,我们将学习如何在C语言中近似正态分布概率密度函数(PDF)。我们将首先读取点(x)、均值(μ)和标准差(σ)的输入值,然后使用标准公式计算PDF。最后,我们将打印计算出的PDF值。

本实验涵盖了在C语言中实现此功能的逐步过程,包括读取用户输入、计算PDF和显示结果。本实验旨在提供对在C编程中处理概率和组合数学概念的实际理解。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/if_else("If...Else") 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-435338{{"用 C 语言近似正态分布概率密度函数"}} c/operators -.-> lab-435338{{"用 C 语言近似正态分布概率密度函数"}} c/if_else -.-> lab-435338{{"用 C 语言近似正态分布概率密度函数"}} c/math_functions -.-> lab-435338{{"用 C 语言近似正态分布概率密度函数"}} c/user_input -.-> lab-435338{{"用 C 语言近似正态分布概率密度函数"}} c/output -.-> lab-435338{{"用 C 语言近似正态分布概率密度函数"}} end

读取 x、均值 μ、标准差 σ

在这一步中,我们将学习如何在C语言中读取用于计算正态分布概率密度函数(PDF)的输入值。我们将创建一个程序,该程序接受三个关键参数:x(点)、μ(均值)和 σ(标准差)。

首先,让我们为我们的实现创建一个新的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. 我们创建了一个单独的函数 compute_normal_pdf() 来计算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计算逻辑

总结

在本实验中,我们学习了如何在C语言中读取正态分布概率密度函数(PDF)的输入值,包括点x、均值μ和标准差σ。然后,我们实现了用于计算PDF的数学公式,其中涉及计算系数和指数项。最后一步是打印计算出的PDF值。

本实验的关键学习要点包括:1)使用scanf()读取双精度浮点数,2)存储x、均值和标准差的输入值,3)使用标准正态分布公式计算PDF,以及4)打印得到的PDF值。