C 언어로 누적 분포 함수 (CDF) 계산하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 언어로 누적 분포 함수 (CDF) 를 계산하는 방법을 배웁니다. 이 실습은 주요 두 단계로 구성됩니다. 첫째, 분포 매개변수와 x 값을 읽고, 둘째, 표준 정규 분포를 사용하여 음의 무한대에서 주어진 x 값까지의 확률을 합산하여 CDF 를 계산합니다. 이 실습에서는 완전한 코드 구현을 제공하고 단계별로 과정을 안내하여 C 언어에서 CDF 계산에 대한 확실한 이해를 돕습니다.

분포 매개변수 및 x 값 읽기

이 단계에서는 C 언어로 누적 분포 함수 (CDF) 를 계산하기 위해 분포 매개변수와 x 값을 읽는 방법을 배웁니다.

먼저 CDF 계산을 구현하기 위한 새로운 C 파일을 생성합니다.

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 and 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%

요약

이 실험에서 C 언어를 사용하여 분포 매개변수 (평균 및 표준 편차) 와 x 값을 읽어 누적 분포 함수 (CDF) 를 계산하는 방법을 배웠습니다. 그런 다음 표준 정규 분포 근사 함수를 사용하여 음의 무한대에서 주어진 x 값까지의 확률을 합산하여 CDF 계산을 구현했습니다. 마지막으로 제공된 입력 매개변수에 대한 CDF 값을 출력했습니다.

이 실험에서 얻은 주요 학습 내용은 필요한 입력 데이터를 읽고 표준 정규 CDF 근사 공식을 적용하여 원하는 CDF 값을 계산하는 데 필요한 단계입니다.