Example #1
0
        public static Resultado_TP2 RegresionPorMC(double[] vector_x, double[] vector_y, int n, int Grado, int max_grado)
        {
            //Obtengo el sistema de ecuaciones
            double[,] auxiliar = RegresionPolinomial(vector_x, vector_y, n, Grado);
            Resultado_TP2 res = Practico2.GaussJordan(auxiliar, Grado);

            if (res.Ok != false)
            {
                Resultado_TP2 resu = new Resultado_TP2();
                resu.Ok = true;
                //Calcular sr y st para poder calcular el coeficiente de correlación
                double sum_y = 0, sr = 0, st = 0, sr_temp;
                for (int i = 0; i < n + 1; i++)
                {
                    sum_y += vector_y[i];
                }
                double media_y = sum_y / n;
                if (Grado == 2)
                {
                    double sum_xx = 0;
                    double sum_x  = 0;
                    double sum_xy = 0;
                    for (int i = 0; i < n + 1; i++)
                    {
                        sum_xx += Math.Pow(vector_x[i], 2);
                        sum_x  += vector_x[i];
                        sum_xy += vector_x[i] * vector_y[i];
                    }
                    double media_x = sum_x / n;
                    double a1      = (n * sum_xy - sum_x * sum_y) / (n * sum_xx - Math.Pow(sum_x, 2));
                    resu.Resoluciones[0] = a1;

                    double a0 = media_y - (a1 * media_x);
                    resu.Resoluciones[1] = a0;
                    sr = 0;
                    st = 0;
                    for (int i = 0; i < n; i++)
                    {
                        // Se calcula el coeficiente de la recta de mejor ajuste
                        sr += Math.Pow(((a1 * vector_x[i]) + a0 - vector_y[i]), 2);
                        // Se calcula rl coeficiente de la recta promedio
                        st += Math.Pow((media_y - vector_y[i]), 2);
                    }
                    resu.Resoluciones[0] = a0;
                    resu.Resoluciones[1] = a1;
                }
                else
                {
                    for (int i = 0; i < n; i++)
                    {
                        sr_temp = vector_y[i] - res.Resoluciones[0];

                        for (int j = max_grado; j > 0; j--)
                        {
                            sr_temp -= Grado - 1 >= j?Math.Pow(vector_x[i], j) * res.Resoluciones[j] : 0;
                        }
                        sr += Math.Pow(sr_temp, 2);
                        st += Math.Pow(vector_y[i] - (sum_y / n), 2);
                    }
                }

                //Evaluar coeficiente de correlación
                if (Grado == 2)
                {
                    resu.Coeficiente = Math.Sqrt(((st - sr) / st)) * 100;
                    return(resu);
                }
                else
                {
                    res.Coeficiente = Math.Sqrt(((st - sr) / st)) * 100;
                    return(res);
                }
            }
            else
            {
                res.Coeficiente = -1;
            }
            return(res);
        }
Example #2
0
        private void btn_Resolver_Click_1(object sender, EventArgs e)
        {
            int  dim          = int.Parse(textBox1.Text);
            bool camposvacios = false;

            for (int i = 1; i <= dim + 1; i++)
            {
                for (int j = 1; j <= dim; j++)
                {
                    string    nom = "txt" + j + i;
                    Control[] m   = panel2.Controls.Find(nom, true);
                    if (m[0].Text.Trim() == string.Empty)
                    {
                        MessageBox.Show("Hay campos vacíos!");
                        camposvacios = true;
                    }
                }
            }
            if (!camposvacios)
            {
                string[] aux;
                double[,] matriz = new double[dim, dim + 1];
                for (int i = 0; i < dim; i++)
                {
                    for (int j = 0; j < dim + 1; j++)
                    {
                        string nom = "txt";
                        int    x   = j + 1;
                        int    y   = i + 1;
                        nom = nom + y + x;
                        Control[] m = panel2.Controls.Find(nom, true);
                        if (m[0].Text.Contains("/"))
                        {
                            aux          = m[0].Text.Split(new char[] { '/' }, 2);
                            matriz[i, j] = double.Parse(aux[0]) / double.Parse(aux[1]);
                        }
                        else
                        {
                            matriz[i, j] = double.Parse(m[0].Text);
                        }
                    }
                }
                Resultado_TP2 result = new Resultado_TP2(false, "", 0, 0);
                if (cmb_Metodos.SelectedIndex == 0)
                {
                    result = Practico2.GaussJordan(matriz, dim);
                }
                else
                {
                    double tole = 0.0001; //cambiar la tolerancia acá si se necesita para el eje 5
                    int    ite  = 100;    // 2 para el ejercicio 5
                    result = Practico2.GaussSeidel(matriz, dim, ite, tole);
                }

                if (result.Ok)
                {
                    MostrarEnPantalla(result);
                }
                else
                {
                    MessageBox.Show(result.Mensaje);
                }
            }
        }