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); }
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); } } }