Calcular una Función de Distribución Acumulativa (CDF) en C

CBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás a calcular la Función de Distribución Acumulativa (CDF) en C. El laboratorio cubre dos pasos principales: leer los parámetros de la distribución y el valor de x, y luego calcular la CDF sumando las probabilidades desde menos infinito hasta el valor de x dado utilizando la distribución normal estándar. El laboratorio proporciona la implementación completa del código y te guía a través del proceso paso a paso, asegurándote de tener una comprensión sólida del cálculo de la CDF en C.

Leer Parámetros de Distribución y Valor de x

En este paso, aprenderás a leer los parámetros de la distribución y el valor de x para calcular la Función de Distribución Acumulativa (CDF) en C.

Primero, creemos un nuevo archivo C para implementar el cálculo de la CDF:

cd ~/project
nano cdf_calculator.c

Ahora, agrega el siguiente código para leer los parámetros de la distribución:

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Parámetros de la distribución
    double media, desviacion_estandar;
    double valor_x;

    // Solicita los parámetros de la distribución al usuario
    printf("Introduce la media (μ): ");
    scanf("%lf", &media);

    printf("Introduce la desviación estándar (σ): ");
    scanf("%lf", &desviacion_estandar);

    // Solicita al usuario el valor de x
    printf("Introduce el valor de x para calcular la CDF: ");
    scanf("%lf", &valor_x);

    // Imprime los parámetros de entrada para su verificación
    printf("\nParámetros de entrada:\n");
    printf("Media (μ): %.2f\n", media);
    printf("Desviación Estándar (σ): %.2f\n", desviacion_estandar);
    printf("Valor de X: %.2f\n", valor_x);

    return 0;
}

Compila y ejecuta el programa:

gcc cdf_calculator.c -o cdf_calculator
./cdf_calculator

Ejemplo de salida:

Introduce la media (μ): 5.0
Introduce la desviación estándar (σ): 2.0
Introduce el valor de x para calcular la CDF: 3.5

Parámetros de entrada:
Media (μ): 5.00
Desviación Estándar (σ): 2.00
Valor de X: 3.50

Sumar Probabilidades de -∞ a x

En este paso, aprenderás a calcular la Función de Distribución Acumulativa (CDF) sumando las probabilidades desde menos infinito hasta un valor x dado utilizando la distribución normal estándar.

Modifiquemos el programa C anterior para implementar el cálculo de la CDF:

cd ~/project
nano cdf_calculator.c

Reemplaza el código anterior con la siguiente implementación:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// Función de aproximación de la CDF normal estándar (Abramowitz y 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;

    // Maneja valores negativos
    int sign = (x < 0) ? -1 : 1;
    x = fabs(x);

    // Fórmula de aproximación
    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);
}

// Calcula la CDF para la distribución normal
double normal_cdf(double x, double mean, double std_dev) {
    // Cálculo del puntaje Z
    double z_score = (x - mean) / std_dev;
    return standard_normal_cdf(z_score);
}

int main() {
    // Parámetros de la distribución
    double mean, std_dev;
    double x_value;

    // Solicita los parámetros de la distribución al usuario
    printf("Introduce la media (μ): ");
    scanf("%lf", &mean);

    printf("Introduce la desviación estándar (σ): ");
    scanf("%lf", &std_dev);

    // Solicita al usuario el valor de x
    printf("Introduce el valor de x para calcular la CDF: ");
    scanf("%lf", &x_value);

    // Calcula e imprime la CDF
    double cdf_value = normal_cdf(x_value, mean, std_dev);

    printf("\nResultados del cálculo de la CDF:\n");
    printf("Media (μ): %.2f\n", mean);
    printf("Desviación Estándar (σ): %.2f\n", std_dev);
    printf("Valor de X: %.2f\n", x_value);
    printf("CDF P(X ≤ x): %.4f\n", cdf_value);

    return 0;
}

Compila el programa con la biblioteca matemática:

gcc cdf_calculator.c -o cdf_calculator -lm

Ejecuta el programa y prueba con entradas de muestra:

./cdf_calculator

Ejemplo de salida:

Introduce la media (μ): 5.0
Introduce la desviación estándar (σ): 2.0
Introduce el valor de x para calcular la CDF: 3.5

Resultados del cálculo de la CDF:
Media (μ): 5.00
Desviación Estándar (σ): 2.00
Valor de X: 3.50
CDF P(X ≤ x): 0.2525

Imprimir el Valor de la CDF

En este paso, aprenderás a mejorar el programa de cálculo de la Función de Distribución Acumulativa (CDF) añadiendo una salida más detallada e interpretación de los resultados de la CDF.

Modifiquemos el programa C anterior para mejorar la salida y añadir algunos comentarios interpretativos:

cd ~/project
nano cdf_calculator.c

Actualiza la función main() para incluir una salida más detallada:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// Las funciones anteriores standard_normal_cdf y normal_cdf permanecen igual

int main() {
    // Parámetros de la distribución
    double mean, std_dev;
    double x_value;

    // Solicita los parámetros de la distribución al usuario
    printf("Calculadora de Función de Distribución Acumulativa (CDF)\n");
    printf("-----------------------------------------------\n");
    printf("Introduce la media (μ): ");
    scanf("%lf", &mean);

    printf("Introduce la desviación estándar (σ): ");
    scanf("%lf", &std_dev);

    // Solicita al usuario el valor de x
    printf("Introduce el valor de x para calcular la CDF: ");
    scanf("%lf", &x_value);

    // Calcula e imprime la CDF
    double cdf_value = normal_cdf(x_value, mean, std_dev);

    // Salida detallada con interpretación
    printf("\n--- Resultados del cálculo de la CDF ---\n");
    printf("Media (μ):             %.2f\n", mean);
    printf("Desviación Estándar (σ): %.2f\n", std_dev);
    printf("Valor de X:              %.2f\n", x_value);
    printf("CDF P(X ≤ x):         %.4f (%.2f%)\n",
           cdf_value, cdf_value * 100);

    // Interpreta el valor de la CDF
    printf("\nInterpretación:\n");
    if (cdf_value < 0.5) {
        printf("El valor está por debajo de la media de la distribución.\n");
    } else if (cdf_value > 0.5) {
        printf("El valor está por encima de la media de la distribución.\n");
    } else {
        printf("El valor está en la media de la distribución.\n");
    }

    // Explicación de la probabilidad
    printf("Probabilidad de observar un valor menor o igual a %.2f: %.2f%%\n",
           x_value, cdf_value * 100);

    return 0;
}

Compila el programa:

gcc cdf_calculator.c -o cdf_calculator -lm

Ejecuta el programa con entradas de muestra:

./cdf_calculator

Ejemplo de salida:

Calculadora de Función de Distribución Acumulativa (CDF)
-----------------------------------------------
Introduce la media (μ): 5.0
Introduce la desviación estándar (σ): 2.0
Introduce el valor de x para calcular la CDF: 3.5

--- Resultados del cálculo de la CDF ---
Media (μ):             5.00
Desviación Estándar (σ): 2.00
Valor de X:              3.50
CDF P(X ≤ x):         0.2525 (25.25%)

Interpretación:
El valor está por debajo de la media de la distribución.
Probabilidad de observar un valor menor o igual a 3.50: 25.25%

Resumen

En este laboratorio, aprendiste a leer los parámetros de distribución (media y desviación estándar) y un valor x para calcular la Función de Distribución Acumulativa (CDF) en C. Luego, implementaste el cálculo de la CDF sumando las probabilidades desde menos infinito hasta el valor x dado utilizando la función de aproximación de la distribución normal estándar. Finalmente, imprimiste el valor de la CDF para los parámetros de entrada proporcionados.

Los puntos clave de aprendizaje de este laboratorio son los pasos necesarios para calcular la CDF, incluyendo la lectura de los datos de entrada necesarios y la aplicación de la fórmula de aproximación de la CDF normal estándar para calcular el valor deseado de la CDF.