private void btnCalcular_Click(object sender, EventArgs e)
        {
            if (comboMetodo.Text == "GAUSS-SEIDEL" && !(txtboxIteraciones.Text != "" && txtboxTolerancia.Text != ""))
            {
                MessageBox.Show("No se colocaron correctamente los parametros", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            this.btnCalcular.Enabled = false;
            List <List <decimal> > Sistema  = new List <List <decimal> >();
            List <decimal>         Ecuacion = new List <decimal>();

            Sistema = new List <List <decimal> >();
            int ecuaciones = Convert.ToInt32(txtboxNumeroEcuaciones.Text);
            int incognitas = Convert.ToInt32(txtboxNumeroIncognitas.Text);

            for (int i = 0; i <= ecuaciones - 1; i++)
            {
                Ecuacion = new List <decimal>();

                for (int z = 0; z <= incognitas; z++)
                {
                    Ecuacion.Add(Convert.ToDecimal(Grilla.Rows[i].Cells[z].Value));
                }
                Sistema.Add(Ecuacion);
            }

            ResultadoEcuaciones resultado = new ResultadoEcuaciones();

            if (comboMetodo.Text == "GAUSS-JORDAN")
            {
                ParametrosEcuaciones parametros = new ParametrosEcuaciones();
                parametros.ValoresIniciales = Sistema;

                resultado = MetodosEcuaciones.ResolverEcuacionGaussJordan(parametros);
            }
            else
            {
                ParametrosGaussSeidel parametros = new ParametrosGaussSeidel();
                parametros.ValoresIniciales = Sistema;
                parametros.Iteraciones      = Convert.ToInt32(txtboxIteraciones.Text);
                parametros.Tolerancia       = Convert.ToDecimal(txtboxTolerancia.Text);
                resultado = MetodosEcuaciones.ResolverEcuacionGaussSeidel(parametros);
            }

            switch (resultado.TipoResultado)
            {
            case TipoResultado.Ecuacion:
                this.Resultado.Visible = true;
                this.Resultado.Height  = 40;
                this.Resultado.Text    = "SE ENCONTRARON LOS VALORES DE LAS INCOGNITAS CORRECTAMENTE";
                this.DibujarGrillaResultado(incognitas, resultado.ResultadosEcuaciones);
                break;

            case TipoResultado.NoDD:
                this.Resultado.Visible = true;
                this.Resultado.Height  = 80;
                this.Resultado.Text    = "EL SISTEMA INGRESADO NO ES DIAGONALMENTE DOMINANTE. INGRESE NUEVAMENTE";
                break;

            case TipoResultado.DD:
                this.Resultado.Visible = true;
                this.Resultado.Height  = 100;
                this.Resultado.Text    = "EL SISTEMA INGRESADO NO ES DIAGONALMENTE DOMINANTE. SE REACOMODARON LAS FILAS Y SE ENCONTRARON LOS VALORES DE LAS INCOGNITAS.";
                this.DibujarGrillaResultado(incognitas, resultado.ResultadosEcuaciones);
                break;

            default:
                break;
            }
        }
        public ResultadoMinimosCuadrados ResolverCurvaPolinomial(ParametrosMinimosCuadrados parametros)
        {
            this.InicializarSistemaGrado10();
            List <List <decimal> > SistemaResolver = this.AveriguarMatrizGrado(parametros);

            ResultadoEcuaciones Incognitas = MetodoEcuaciones.ResolverEcuacionGaussJordan(new ParametrosEcuaciones {
                ValoresIniciales = SistemaResolver
            });

            List <int> ListaIndices = new List <int>();

            for (int i = 0; i <= parametros.Grado; i++)
            {
                ListaIndices.Add(i);
            }

            string  Recta  = "Y = ";
            decimal ValorY = 0;

            for (int i = parametros.Grado; i >= 0; i--)
            {
                Recta  += "(" + (Convert.ToString(Math.Round(Incognitas.ResultadosEcuaciones[i], 4))) + "x^(" + ListaIndices[i] + "))";
                ValorY += (Incognitas.ResultadosEcuaciones[i] * Convert.ToDecimal(Math.Pow(Convert.ToDouble(parametros.ValorX), (Convert.ToDouble(ListaIndices[i])))));

                if (i != 0)
                {
                    Recta += "+";
                }
            }

            decimal Sr = 0;

            for (int i = 0; i <= parametros.ValoresX.Count - 1; i++)
            {
                decimal Error = 0;
                int     grado = parametros.Grado;
                for (int j = Incognitas.ResultadosEcuaciones.Count - 1; j >= 0; j--)
                {
                    Error += Incognitas.ResultadosEcuaciones[j] * (Convert.ToDecimal(Math.Pow(Convert.ToDouble(parametros.ValoresX[i]), grado)));
                    grado -= 1;
                }
                Error -= parametros.ValoresY[i];

                Sr += Convert.ToDecimal(Math.Pow(Convert.ToDouble(Error), 2));
            }

            decimal St = 0;

            decimal yPrima = parametros.ValoresY.Average();

            foreach (var y in parametros.ValoresY)
            {
                St += Convert.ToDecimal(Math.Pow(Convert.ToDouble((y - yPrima)), parametros.Grado));
            }

            decimal CoeficienteCorrelacion = Convert.ToDecimal(Math.Sqrt(Math.Abs((Convert.ToDouble(St) - Convert.ToDouble(Sr))) / Convert.ToDouble(St)));
            decimal Porcentaje             = CoeficienteCorrelacion * 100;

            ResultadoMinimosCuadrados resultado = new ResultadoMinimosCuadrados();

            resultado.RectaMejorAjuste = Recta;
            resultado.Imagen           = ValorY;

            if (Porcentaje >= 80)
            {
                resultado.Ajuste = "ACEPTABLE";
            }
            else
            {
                resultado.Ajuste = "NO ACEPTABLE";
            }

            resultado.CoeficientedeCorrelacion = Math.Round(Porcentaje, 4);

            return(resultado);
        }