//GAUSS-SEIDEL
        public ResultadoEcuaciones ResolverEcuacionGaussSeidel(ParametrosGaussSeidel parametros)
        {
            ResultadoEcuaciones resultado = new ResultadoEcuaciones();

            this.ListaOriginal = parametros.ValoresIniciales;

            bool DD = this.DiagonalmenteDominante();

            bool FilasReacomodadas = false;

            if (DD == false)
            {
                FilasReacomodadas = this.AcomodarFilas();

                if (FilasReacomodadas == false)
                {
                    resultado.TipoResultado        = TipoResultado.NoDD;
                    resultado.ResultadosEcuaciones = new List <decimal>();
                    return(resultado);
                }
            }

            this.DespejarIncognitas();
            this.InicializarSolucion();
            bool soluciones = false;

            while (!(soluciones == true || (Contador >= parametros.Iteraciones)))
            {
                this.AveriguarSolucion();
                this.Contador += 1;
                soluciones     = CompararSoluciones(parametros.Tolerancia);
            }

            if (FilasReacomodadas == true)
            {
                resultado.ResultadosEcuaciones = Solucion;
                resultado.TipoResultado        = TipoResultado.DD;
            }
            else
            {
                resultado.ResultadosEcuaciones = Solucion;
                resultado.TipoResultado        = TipoResultado.Ecuacion;
            }
            return(resultado);
        }
        public ResultadoEcuaciones AveriguarIncognitas()
        {
            List <decimal> ValoresIncognitas = new List <decimal>();

            int Incognitas = ListaOriginal[0].Count - 1;

            for (int i = 0; i <= ListaOriginal.Count - 1; i++)
            {
                ValoresIncognitas.Add(Math.Round(ListaOriginal[i][Incognitas], 4));
            }

            ResultadoEcuaciones resultado = new ResultadoEcuaciones();

            resultado.ResultadosEcuaciones = ValoresIncognitas;
            resultado.TipoResultado        = TipoResultado.Ecuacion;
            this.Contador = 0;

            return(resultado);
        }
        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);
        }
Ejemplo n.º 5
0
        public ResultadoEcuaciones GaussSeidel(ParametrosEcuaciones parametros)
        {
            var resultado = new ResultadoEcuaciones();

            var    listaResultados         = new List <double>();
            var    listaResultadosAnterior = new List <double>();
            double tolerancia = parametros.Tolerancia;

            //  Cargo matriz pero no se si es necesario
            double[,] matriz = new double[parametros.NumIncognitas, parametros.NumIncognitas + 1];

            var columna = 0;
            var fila    = 0;

            foreach (var item in parametros.Coeficientes)
            {
                matriz[fila, columna] = item;

                if (columna < parametros.NumIncognitas)
                {
                    columna++;
                }
                else
                {
                    fila++;
                    columna = 0;
                    listaResultados.Add(0);
                }
            }
            //
            for (int i = 0; i < parametros.NumIncognitas; i++)
            {
                listaResultadosAnterior.Add(0);
            }
            double errorRelativo = 0.1;
            bool   corte         = false;

            while (errorRelativo > tolerancia && !corte)
            {
                var cont = 0;
                foreach (var item in listaResultados)
                {
                    listaResultadosAnterior[cont] = item;
                    cont++;
                }

                //  listaResultadosAnterior = listaResultados;

                for (int f = 0; f < parametros.NumIncognitas; f++)
                {
                    double valorAcumulado = 0;

                    for (int c = 0; c < parametros.NumIncognitas + 1; c++)
                    {
                        if (c == f)
                        {
                            listaResultados[f] = matriz[f, c];
                        }
                        else
                        {
                            if (c != parametros.NumIncognitas)
                            {
                                valorAcumulado = listaResultados[c] * matriz[f, c] + valorAcumulado;
                            }
                            else
                            {
                                listaResultados[f] = (matriz[f, c] - valorAcumulado) / listaResultados[f];
                            }
                        }
                    }
                }

                double validacion = 0;
                int    contador   = 0;
                foreach (var item in listaResultados)
                {
                    validacion = (item - listaResultadosAnterior[contador]) / item;
                    corte      = true;
                    contador++;

                    if (validacion > tolerancia)
                    {
                        corte = false;
                        break;
                    }
                }
            }
            resultado.Resultados = listaResultados;

            return(resultado);
        }
Ejemplo n.º 6
0
        public ResultadoEcuaciones GaussJordan(ParametrosEcuaciones parametros)
        {
            var resultado = new ResultadoEcuaciones();

            double[,] matriz = new double[parametros.NumIncognitas, parametros.NumIncognitas + 1];

            var columna = 0;
            var fila    = 0;

            //Cargo la matriz
            foreach (var item in parametros.Coeficientes)
            {
                matriz[fila, columna] = item;
                if (columna < parametros.NumIncognitas)
                {
                    columna++;
                }
                else
                {
                    fila++;
                    columna = 0;
                }
            }

            fila    = 0;
            columna = 0;

            ControlarPivotEsDistintoDe0(matriz, parametros.NumIncognitas); //Si el pivot no es 1 cambia las columna.

            for (int f = 0; f < parametros.NumIncognitas; f++)
            {
                for (int c = 0; c < parametros.NumIncognitas + 1; c++)
                {
                    if (f == c)
                    {
                        if ((matriz[f, c] != 0) && (f + 1 < parametros.NumIncognitas))
                        {
                            VerificarSiElPivotEs1(matriz, parametros.NumIncognitas, f, c); //Si el pivot es != de 1 lo hace 1.

                            PrimerBloque(matriz, parametros.NumIncognitas, f + 1, c);      //Primer columna los hace todos 0 menos el pivot
                        }
                        else if (parametros.NumIncognitas - 1 > f)
                        {
                            CambiarFilaSiElPivotEs0(matriz, parametros.NumIncognitas + 1, f); //Si el pivot es 0 y es una fila del medio la cambia por una de abajo   //ver
                        }
                        else
                        {
                            VerificarSiElPivotEs1(matriz, parametros.NumIncognitas, f, c); //Si el pivot es != de 1 lo hace 1.
                        }
                    }
                }
            }

            for (int f = 0; f < parametros.NumIncognitas; f++)
            {
                for (int c = 0; c < parametros.NumIncognitas + 1; c++)
                {
                    if (c > f && c < parametros.NumIncognitas)
                    {
                        SegundoBloque(matriz, parametros.NumIncognitas, f, c);
                    }
                }
            }

            resultado.Resultados = null;
            resultado.Resultados = new List <double>();

            for (int f = 0; f < parametros.NumIncognitas; f++)
            {
                for (int c = 0; c < parametros.NumIncognitas + 1; c++)
                {
                    if (c == parametros.NumIncognitas)
                    {
                        var x = matriz[f, c];
                        resultado.Resultados.Add(x);
                    }
                }
            }

            return(resultado);
        }