Calcular uma Função de Distribuição Acumulativa (CDF) em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a calcular a Função de Distribuição Acumulativa (CDF) em C. O laboratório cobre dois passos principais: ler os parâmetros de distribuição e o valor de x, e então calcular a CDF somando as probabilidades de menos infinito até o valor de x dado, utilizando a distribuição normal padrão. O laboratório fornece a implementação completa do código e guia você através do processo passo a passo, garantindo que você tenha uma compreensão sólida do cálculo da CDF em C.

Ler Parâmetros de Distribuição e x

Neste passo, você aprenderá a ler os parâmetros de distribuição e o valor de x para calcular a Função de Distribuição Acumulativa (CDF) em C.

Primeiro, vamos criar um novo arquivo C para implementar o cálculo da CDF:

cd ~/project
nano cdf_calculator.c

Agora, adicione o seguinte código para ler os parâmetros de distribuição:

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

int main() {
    // Parâmetros de distribuição
    double media, desvio_padrao;
    double valor_x;

    // Solicitar os parâmetros de distribuição ao usuário
    printf("Digite a média (μ): ");
    scanf("%lf", &media);

    printf("Digite o desvio padrão (σ): ");
    scanf("%lf", &desvio_padrao);

    // Solicitar o valor de x ao usuário
    printf("Digite o valor de x para calcular a CDF: ");
    scanf("%lf", &valor_x);

    // Imprimir os parâmetros de entrada para verificação
    printf("\nParâmetros de Entrada:\n");
    printf("Média (μ): %.2f\n", media);
    printf("Desvio Padrão (σ): %.2f\n", desvio_padrao);
    printf("Valor de X: %.2f\n", valor_x);

    return 0;
}

Compilar e executar o programa:

gcc cdf_calculator.c -o cdf_calculator
./cdf_calculator

Exemplo de saída:

Digite a média (μ): 5.0
Digite o desvio padrão (σ): 2.0
Digite o valor de x para calcular a CDF: 3.5

Parâmetros de Entrada:
Média (μ): 5.00
Desvio Padrão (σ): 2.00
Valor de X: 3.50

Somar Probabilidades de -∞ a x

Neste passo, você aprenderá a calcular a Função de Distribuição Acumulativa (CDF) somando as probabilidades de menos infinito até um determinado valor de x utilizando a distribuição normal padrão.

Vamos modificar o programa C anterior para implementar o cálculo da CDF:

cd ~/project
nano cdf_calculator.c

Substitua o código anterior pela seguinte implementação:

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

// Função de aproximação da CDF Normal Padrão (Abramowitz e 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;

    // Lidar com valores negativos
    int sinal = (x < 0) ? -1 : 1;
    x = fabs(x);

    // Fórmula de aproximação
    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 + sinal * y);
}

// Calcular a CDF para a distribuição normal
double normal_cdf(double x, double media, double desvio_padrao) {
    // Cálculo do escore z
    double escore_z = (x - media) / desvio_padrao;
    return standard_normal_cdf(escore_z);
}

int main() {
    // Parâmetros de distribuição
    double media, desvio_padrao;
    double valor_x;

    // Solicitar os parâmetros de distribuição ao usuário
    printf("Digite a média (μ): ");
    scanf("%lf", &media);

    printf("Digite o desvio padrão (σ): ");
    scanf("%lf", &desvio_padrao);

    // Solicitar o valor de x ao usuário
    printf("Digite o valor de x para calcular a CDF: ");
    scanf("%lf", &valor_x);

    // Calcular e imprimir a CDF
    double valor_cdf = normal_cdf(valor_x, media, desvio_padrao);

    printf("\nResultados do Cálculo da CDF:\n");
    printf("Média (μ): %.2f\n", media);
    printf("Desvio Padrão (σ): %.2f\n", desvio_padrao);
    printf("Valor de X: %.2f\n", valor_x);
    printf("CDF P(X ≤ x): %.4f\n", valor_cdf);

    return 0;
}

Compilar o programa com a biblioteca matemática:

gcc cdf_calculator.c -o cdf_calculator -lm

Executar o programa e testar com entradas de exemplo:

./cdf_calculator

Exemplo de saída:

Digite a média (μ): 5.0
Digite o desvio padrão (σ): 2.0
Digite o valor de x para calcular a CDF: 3.5

Resultados do Cálculo da CDF:
Média (μ): 5.00
Desvio Padrão (σ): 2.00
Valor de X: 3.50
CDF P(X ≤ x): 0.2525

Imprimir o Valor da CDF

Neste passo, você aprenderá a aprimorar o programa de cálculo da CDF adicionando saídas mais detalhadas e interpretação dos resultados da Função de Distribuição Acumulativa (CDF).

Vamos modificar o programa C anterior para melhorar a saída e adicionar alguns comentários interpretativos:

cd ~/project
nano cdf_calculator.c

Atualize a função main() para incluir uma saída mais detalhada:

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

// As funções anteriores standard_normal_cdf e normal_cdf permanecem as mesmas

int main() {
    // Parâmetros de distribuição
    double media, desvio_padrao;
    double valor_x;

    // Solicitar parâmetros de distribuição ao usuário
    printf("Calculadora de Função de Distribuição Acumulativa (CDF)\n");
    printf("------------------------------------------------\n");
    printf("Digite a média (μ): ");
    scanf("%lf", &media);

    printf("Digite o desvio padrão (σ): ");
    scanf("%lf", &desvio_padrao);

    // Solicitar o valor de x ao usuário
    printf("Digite o valor de x para calcular a CDF: ");
    scanf("%lf", &valor_x);

    // Calcular e imprimir a CDF
    double valor_cdf = normal_cdf(valor_x, media, desvio_padrao);

    // Saída detalhada com interpretação
    printf("\n--- Resultados do Cálculo da CDF ---\n");
    printf("Média (μ):             %.2f\n", media);
    printf("Desvio Padrão (σ):     %.2f\n", desvio_padrao);
    printf("Valor de X:              %.2f\n", valor_x);
    printf("CDF P(X ≤ x):         %.4f (%.2f%%)\n",
           valor_cdf, valor_cdf * 100);

    // Interpretar o valor da CDF
    printf("\nInterpretação:\n");
    if (valor_cdf < 0.5) {
        printf("O valor está abaixo da distribuição média.\n");
    } else if (valor_cdf > 0.5) {
        printf("O valor está acima da distribuição média.\n");
    } else {
        printf("O valor está na média da distribuição.\n");
    }

    // Explicação da probabilidade
    printf("Probabilidade de observar um valor menor ou igual a %.2f: %.2f%%\n",
           valor_x, valor_cdf * 100);

    return 0;
}

Compilar o programa:

gcc cdf_calculator.c -o cdf_calculator -lm

Executar o programa com entradas de exemplo:

./cdf_calculator

Exemplo de saída:

Calculadora de Função de Distribuição Acumulativa (CDF)
------------------------------------------------
Digite a média (μ): 5.0
Digite o desvio padrão (σ): 2.0
Digite o valor de x para calcular a CDF: 3.5

--- Resultados do Cálculo da CDF ---
Média (μ):             5.00
Desvio Padrão (σ):     2.00
Valor de X:              3.50
CDF P(X ≤ x):         0.2525 (25.25%)

Interpretação:
O valor está abaixo da distribuição média.
Probabilidade de observar um valor menor ou igual a 3.50: 25.25%

Resumo

Neste laboratório, você aprendeu como ler os parâmetros de distribuição (média e desvio padrão) e um valor x para calcular a Função de Distribuição Acumulativa (CDF) em C. Você então implementou o cálculo da CDF somando as probabilidades de menos infinito até o valor x fornecido, utilizando a função de aproximação da distribuição normal padrão. Finalmente, você imprimiu o valor da CDF para os parâmetros de entrada fornecidos.

Os pontos-chave aprendidos neste laboratório são os passos necessários para calcular a CDF, incluindo a leitura dos dados de entrada necessários e a aplicação da fórmula de aproximação da CDF normal padrão para calcular o valor desejado da CDF.