C 언어로 정규 분포 PDF 근사 계산

CBeginner
지금 연습하기

소개

이 실습에서는 C 언어로 정규 분포 확률 밀도 함수 (PDF) 를 근사하는 방법을 배웁니다. 먼저 점 (x), 평균 (μ), 표준 편차 (σ) 에 대한 입력 값을 읽고, 표준 공식을 사용하여 PDF 를 계산합니다. 마지막으로 계산된 PDF 값을 출력합니다.

이 실습은 사용자 입력 읽기, PDF 계산, 결과 표시를 포함하여 C 에서 이 기능을 구현하는 단계별 과정을 다룹니다. 이 실습은 C 프로그래밍에서 확률 및 조합론 개념을 실제로 이해하는 데 도움을 주는 것을 목표로 합니다.

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. PDF 를 계산하기 위해 별도의 함수 compute_normal_pdf()를 만들었습니다.
  2. sqrt(), exp(), pow()와 같은 math.h 라이브러리 함수를 사용했습니다.
  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 값을 출력하는 방법입니다.