Bienvenido

Bienvenido
Disfruta el contenido

viernes, 19 de diciembre de 2014

Programacion en C Distribucion binomial



Hola, el dia de hoy les comparto el codigo de este programa que realice hace un tiempo para calcular distribucion binomial. El codigo lo probe con Dev C++ para plataforma Windows.


APOYO A ENCUESTA 
Hola a todos les escribo para apoyarme con una pequeña encuesta a traves deEncuesta Facil solo te tomara un minuto. 



Les dejo la direccion en este URL 
http://www.encuestafacil.com/RespWeb/Qn.aspx?EID=2051724



Espero que la informacion de este foro les sea de utilidad y gracias por sus visitas 


La distribucion binomial se puede considerar como una permutacion con reemplazo y se expresa por medio de la siguiente formula.






Debido a leyes de probabilidad la suma de las probabilidades de exito y fracaso deben ser igual a 1 o sea el 100%

Caracteristicas del modelo binomial
  • Existen solo 2 tipos de resultados: exito y fracaso
  • La probabilidad tanto de exito como de fracaso se mantiene constante entre evento y evento.
  • El numero posible de evento es infinito
Existen dos tipos de distribucion

Dsitribucion indiviual
Aqui en esta distribucion se busca la probabilidad de un elemento de la muestra solamente.


Ejemplo de la formula de distribucion binomial para una distribucion individual

Distribucion acumulada
Aqui se busca la probabilidad de varios elementos de la muestra, por lo que la probabilidad final sera la suma de todas las distribuciones individuales

Solucion general o diseño
El programa se debe dividir de la siguiente forma

Leer el tipo de distribucion
Calcular la distribucion
Entregar resultados

Para escoger entre el tipo de distribucion se implemento una estructura de control tipo case para ellegir en base a un caracter.

Debido a que durante la ejecucion del programa y las iteraciones realizadas en caso de la opcion de distribucion acumulada el codigo para factorial y combinacion se dividieron en funciones que se mandan a llamar cada vez que se necesitan cumpliendo de esta forma con la reutilizacion de software.

Nota antes de usar el programa
Este código lo hice cuando tuve que hacer una tarea con bastantes ejercicios de distribucion, por lo que de ahi me se ocurrio la idea de hacer el programa. Este codigo considero que es util para propositos academicos unicamente. Les recuerdo que los tipos de datos float disponibles en C les falta precision para realizar cálculos precisos que se requieren en trabajos mas especializados o bien aplicaciones comerciales, por lo que les recomiendo que para este u otro programa que requiera calculos precisos reescriban el programa en Fortran.

Recuerda sin importar la herramienta computacional o tecnica que tengas siempre en todo trabajo cotejar tu infromacion y resultados con diferentes metodos y herramientas con las personas de tu equipo de trabajo.

El programa se maneja a traves de una pantalla en consola y tiene la opcion de poder calcular funciones individuales y acumuladas.





Ejemplo de calculo de una funcion acumulada.





/* Distribucion Binomial Juan Lopez

*/

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

float factorial(float);
float combinacion(float, float);

main()
{
    float x, x_1, x_2, number;
    float n, p, q, suma = 0;
    float binomial = 0, sumatoria = 0;
    char opcion, salida;
   
    do{        
         system("cls");
         printf("\tDistribucion binomial  \n\n");
        
         printf("[a]-Funcion individual.\n");
         printf("[b]-Funcion acumulada.\n\n");
        
         printf("*Selecciona la funcion que desee calcular: ");
         scanf("%s", &opcion);
        
         switch(opcion)
         {
             case 'a': printf("\n\n\a-Funcion individual de distribucion binomial f(x).-\n");
                      
                       printf("*Ingrese el numero de eventos 'n': ");
                       scanf("%f", &n);
                      
                       do{
                                  
                           printf("\n*Ingrese la probabilidad de exito %: ");
                           scanf("%f", &p);
                                                    
                           if(p > 1)                         
                             p /= 100;
                                            
                                                                      
                           q = 1 - p;
                          
                           suma = p + q;
                          
                          
                          
                       }while(suma != 1);
                      
                       do{
                           printf("\n*Ingrese el valor de 'x': ");
                           scanf("%f", &x);
                          
                           if(x > n)
                             printf("ERROR 658: 'x' no puede ser mayor a 'n'\n");
                            
                           if(x < 0)
                             printf("ERROR 725: 'x' no puede ser menor a cero.\n");              
                                  
                       }while( -((x > n) || (x < 0)) );
                      
                       printf("\n\n-Resultados del modelo binomial.-\n\n");
                                             
                       binomial = combinacion(n, x) * pow(p, x) * pow(q, n-x);                      
                       printf("  B(%2.0f, %2.0f, %2.0f) = %4.6f = %4.2f %", x, n, p, binomial, binomial * 100);
                      
                       break;
                      
             case 'b': printf("\n\n\a-Funcion acumulada de distribucion binomial F(x).-\n");
                      
                       printf("*Ingrese el numero de eventos ´n´");
                       scanf("%f", &n);
                      
                       do{
                                  
                           printf("\n*Ingrese la probabilidad de exito %: ");
                           scanf("%f", &p);                                                   
                           
                           if(p > 1)                         
                             p /= 100;
                                                    
                          
                           q = 1 - p;                    
                          
                           suma = p + q;
                                 
                          
                          
                       }while(suma != 1);
                      
                       do{
                                  
                           printf("*Ingresa x_1: ");
                           scanf("%f", &number);
                          
                           x_1 = number;
                          
                           if(x_1 < 0)
                             printf("\nERROR 458: El intervalor x_1 no puede ser menor a cero.\n");
                            
                           if(x_1 > n)
                             printf("\nERROR 218: El intervalo x_1 no puede ser mayor a 'n'.\n\n");       
                                  
                       }while( -( (x_1 < 0)||(x_1 > n) ) );
                      
                       do{
                           printf("*Ingresa x_2: ");
                           scanf("%f", &x_2);
                          
                           if(x_2 < x_1)
                             printf("\nERROR 147: El intervalo x_2 no puede ser menor a x_1.\n");
                            
                           if(x_2 > n)
                             printf("\nERROR 231: El intervalo x_2 no puede ser mayor a 'n'.\n"); 
                              
                       }while( -( (x_2 < x_1)||(x_2 > n) ) );
                      
                       printf("\n\n-Resultados del modelo binomial.-\n\n");
                      
                       for(x_1 = number; x_1 <= x_2; x_1++){
                              
                           binomial = combinacion(n, x_1) * pow(p, x_1) * pow(q, n - x_1);
                          
                           printf("  B(%2.0f, %2.0f, %2.2f) = %4.6f\n", x_1, n, p, binomial);
                          
                           sumatoria += binomial;
                              
                       }
                      
                       printf("\n Probabilidad final.");
                       printf("\n F(x) = (x; %2.0f, %2.0f) = %4.4f = %4.2f%", n, p, sumatoria, sumatoria * 100);
                      
                       break;
                      
             default: printf("\nERROR 254: caracter de opcion mal introducido, intentelo de nuevo.\n");         
                       break;                     
                      
                      
         }//fin del menu opcion
        
         printf("\n\n¿Desea un nuevo calculo(S/N)?");
        
         salida = getch();
         salida = tolower(salida);
        
         binomial = 0;
         sumatoria = 0;
                 
    }while(salida == 's');
   
    system("cls");
    printf("\tModelo binomial \n\n");
    printf("\n\nVuelve pronto...");
   
    getch();
    return 0;
     
}//fin de main

float combinacion(float a, float b)
{
      float combinacion;
     
      combinacion = ( factorial(a) /( factorial(b) * factorial(a-b) ));
     
      return combinacion;
}

float factorial(float number)
{
      float factorial = 1, counter;
     
      for(counter = number; counter >= 1; counter--)
        factorial *= counter;
       
      return factorial;  
}
Espero que este programa les ayude en su preparacion en este lenguaje de programacion y planteamiento de algoritmos, al igual que sea una base adecuada para futuros estudios en programacion orientada a objetos.

Les dejo la informacion para el que quiera continuar averiguando sobre este lenguaje de programacion. Se los recomiendo mucho.

Como programar en C Deitel













C. Algoritmos, programacion y estructura de datos 
Joyanes Aguilar et al.













Libro de los cradores del lenguaje C. Este libro ademas de ser practico en sus ejemplos le puede servir como un manual de referencia del lenguaje.



1 comentario:

  1. amigo necesito tu ayuda, tengo que hacer un menu. Tome solo la parte individual del exito, pero tengo un problema al compilar con la variable
    float combinacion(float, float);

    ResponderEliminar