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); }
private void btnGenerar_Click(object sender, EventArgs e) { if (validar()) { Generador g = new Generador(); Histograma_Datos histodato = new Histograma_Datos(); double[] numeros = new double[int.Parse(TextBoxValores.Text)]; String distribucion = ComboBoxDistribucion.Text; switch (distribucion) { case "Normal": numeros = g.calcularNormal(int.Parse(TextBoxValores.Text), double.Parse(TextBoxDesviacion.Text), double.Parse(TextBoxMedia.Text)); histodato.graficar(numeros, int.Parse(TextBoxValores.Text), int.Parse(TextBoxIntervalos.Text), double.Parse(TextBoxMedia.Text), double.Parse(TextBoxDesviacion.Text), distribucion); break; case "Exponencial": double lambda_ = 1 / double.Parse(TextBoxMedia.Text); // cambiar por double.Parse(TextBoxLambda.Text) numeros = g.calcularExponencial(int.Parse(TextBoxValores.Text), 1 / lambda_); histodato.graficar(numeros, int.Parse(TextBoxValores.Text), int.Parse(TextBoxIntervalos.Text), 1 / lambda_, 1 / Math.Pow(lambda_, 2), distribucion); break; case "Poisson": double lmda; if (lambda) { lmda = double.Parse(TextBoxLambda.Text); } else { lmda = Math.Abs(1 / double.Parse(TextBoxMedia.Text)); } numeros = g.calcularPoisson(int.Parse(TextBoxValores.Text), lmda); histodato.graficarPoisson(numeros, int.Parse(TextBoxValores.Text), int.Parse(TextBoxIntervalos.Text)); checkPoisson.Enabled = true; break; case "Uniforme": double a = double.Parse(TextBoxA.Text); double b = double.Parse(TextBoxB.Text); numeros = g.calcularUniforme(int.Parse(TextBoxValores.Text), a, b); histodato.graficar(numeros, int.Parse(TextBoxValores.Text), int.Parse(TextBoxIntervalos.Text), (b + a) / 2.0, Math.Pow(b - a, 2) / 2.0, distribucion); break; default: break; } LimpiarCampos(); histodato.Show(); checkPoisson.Enabled = false; checkPoisson.Checked = false; } else { MessageBox.Show("Ups! No ingreso todos los parametros requeridos para la distribucion :( "); } }
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]); } }