Exemple #1
0
        public void graficar(double[] numeros, int cantValores, int intervalos, double media, double desviacion, string distribucion)
        {
            tipoDistr             = distribucion;
            esperada              = new double[intervalos];
            backupNumeros         = numeros;
            med                   = media;
            des                   = desviacion;
            lbl_Distrib_Hist.Text = "";
            lbl_Distrib_Hist.Text = "Distribucion: " + distribucion;
            double max = Math.Round((Generador.obtenerMaximo(numeros) + 0.01), 5);
            double min = Math.Round((Generador.obtenerMinimo(numeros) - 0.01), 5);



            double paso = Math.Round(((max - min) / intervalos), 3);

            paso = Math.Round(paso, 4);


            switch (distribucion)
            {
            case "Uniforme":
                double aux = numeros.Length / intervalos;
                for (int i = 0; i < esperada.Length; i++)
                {
                    esperada[i] = aux;
                }
                break;

            case "Normal":
                for (int i = 0; i < esperada.Length; i++)
                {
                    double frecEsp = Normal.CDF(med, des, min + paso * (i + 1)) - Normal.CDF(med, des, min + paso * i);
                    esperada[i] = frecEsp * cantValores;
                }

                break;

            case "Exponencial":
                for (int i = 0; i < esperada.Length; i++)
                {
                    double frecEsp = Exponential.CDF(1 / media, min + paso * (i + 1)) - Exponential.CDF(1 / media, min + paso * i);
                    esperada[i] = frecEsp * cantValores;
                }
                break;     //media falta esto!!
            }
            //creamos el vector que va a tener la frecuencia de cada intervalo
            int[] acumulados = new int[intervalos];
            mediaCalc = numeros[0]; chiSq = 0.0;


            for (int j = 0; j < numeros.Length; j++) //recorremos array de numeros aleatorios
            {
                double dato = numeros[j];            // double.Parse(.ToString());
                if (j > 0)
                {
                    mediaCalc = ((mediaCalc * j) + dato) / (j + 1); //calculamos la media a cada iteracion
                }
                listValores.Items.Add(dato);                        //ponemos los numeros obtenidos de la distribucion solicitada en la lista
                for (int l = 0; l < acumulados.Length; l++)         //for que recorre array y acumula frecuencias
                {
                    double tope = min + paso * (l + 1);

                    if (dato < tope)
                    {
                        acumulados[l] = acumulados[l] + 1;
                        break;
                    }
                }
            }

            listIntervalos.Items.Add("Numero mayor generado: " + max);
            listIntervalos.Items.Add("Numero menor generado: " + min);
            listIntervalos.Items.Add("Ancho de intervalos: " + paso);
            listIntervalos.Items.Add("");

            double comienzo  = min;
            double totalacum = 0;

            for (int t = 0; t < acumulados.Length; t++)   // for que recorre la el arreglo de intervalos terminado y que aprovechamos para ir calculando chi cuadrado
            {
                double tope = comienzo + paso;
                listIntervalos.Items.Add("Intervalo " + (t + 1) + " (de " + comienzo + " hasta " + tope + "):" + acumulados[t]);
                chiSq      = chiSq + (Math.Pow(esperada[t] - acumulados[t], 2) / esperada[t]);
                comienzo   = tope;
                totalacum += acumulados[t];
            }

            listIntervalos.Items.Add("");
            listIntervalos.Items.Add("");
            listIntervalos.Items.Add("Cantidad de Valores:  " + totalacum);
            double inicio = 0;

            //ahora graficamos frecuencias
            for (int u = 0; u < acumulados.Length; u++)
            {
                inicio = min + (paso * u);
                double tope  = inicio + paso;
                double mitad = Math.Round((tope - (paso / 2)), 2);
                string label = mitad.ToString();

                chart_hist.Series["Frecuencia Observada"].Points.AddXY(label, acumulados[u]);
                chart_hist.Series["Frecuencia Esperada"].Points.AddXY(label, esperada[u]);
            }
            pruebaBondad(intervalos);
        }
Exemple #2
0
        public void graficarPoisson(double[] numeros, int cantValores, int intervalos)
        {
            tipoDistr             = "Poisson";
            backupNumeros         = numeros;
            lbl_Distrib_Hist.Text = "";
            lbl_Distrib_Hist.Text = "Distribucion: Poisson";

            double max  = Generador.obtenerMaximo(numeros) + 1;
            double min  = Generador.obtenerMinimo(numeros);
            double paso = (Math.Abs(max) - Math.Abs(min)) / intervalos;

            paso = Math.Round(paso, 4);

            //creamos el vector que va a tener la frecuencia de cada intervalo
            int[] acumulados = new int[intervalos];

            for (int j = 0; j < numeros.Length; j++)        //recorremos array de numeros aleatorios
            {
                for (int l = 0; l < acumulados.Length; l++) //for que recorre array y acumula numeros
                {
                    double tope = min + paso * (l + 1);
                    double dato = double.Parse(numeros[j].ToString());
                    if (dato < tope)
                    {
                        acumulados[l] = acumulados[l] + 1;
                        break;
                    }
                }
            }

            for (int i = 0; i < numeros.Length; i++)            //ponemos los numeros obtenidos de la distribucion solicitada en la lista
            {
                listValores.Items.Add(numeros[i]);
            }

            listIntervalos.Items.Add("Numero mayor generado: " + max);
            listIntervalos.Items.Add("Numero menor generado: " + min);
            listIntervalos.Items.Add("Ancho de intervalos: " + paso);
            listIntervalos.Items.Add("");
            double comienzo   = min;
            int    totalacump = 0;

            for (int t = 0; t < acumulados.Length; t++)
            {
                double tope = comienzo + paso;
                listIntervalos.Items.Add("Intervalo " + (t + 1) + " (de " + comienzo + " hasta " + tope + "):" + acumulados[t]);
                comienzo    = tope;
                totalacump += (int)acumulados[t];
            }

            listIntervalos.Items.Add("");
            listIntervalos.Items.Add("");
            listIntervalos.Items.Add("Cantidad de Valores:  " + totalacump);


            //ahora graficamos frecuencias
            for (int u = 0; u < acumulados.Length; u++)
            {
                double inicio = paso * u;
                double tope   = paso * (u + 1);
                double mitad  = inicio + (paso / 2);
                chart_hist.Series["Frecuencia Observada"].Points.AddXY(inicio + "-" + tope, acumulados[u]);
            }
        }