コード例 #1
0
        public ResultadoRegresion MetodoLagrange(ParametroRegresion parametro, double ValorX)
        {
            int    CantPuntos = parametro.ValoresX.Count;
            double Resultado  = 0;

            for (int j = 0; j < CantPuntos; j++)
            {
                double Productoria = 1;

                for (int i = 0; i < CantPuntos; i++)
                {
                    if (j != i)
                    {
                        Productoria = Productoria * ((ValorX - parametro.ValoresX[i]) / (parametro.ValoresX[j] - parametro.ValoresX[i]));
                    }
                }

                Resultado += Productoria * parametro.ValoresY[j];
            }

            ResultadoRegresion retornar = new ResultadoRegresion();

            retornar.Resultado.Add(Resultado);
            retornar.CoeficienteCorrelacion = 0;

            return(retornar);
        }
コード例 #2
0
        public ResultadoRegresion MinimosCuadrados(ParametrosRegresion parametros)
        {
            var resultado = new ResultadoRegresion();

            var numeroDePares = parametros.NumPares;

            double sumatoriaX = parametros.X.Sum();
            double sumatoriaY = parametros.Y.Sum();

            double sumatoriaXCuadrado = 0;

            double promedioX = parametros.X.Sum() / parametros.NumPares;
            double promedioY = parametros.Y.Sum() / parametros.NumPares;

            foreach (var item in parametros.X)
            {
                sumatoriaXCuadrado = (sumatoriaXCuadrado + (item * item));
            }

            double sumatoriaXporY = 0;

            for (int i = 0; i < numeroDePares; i++)
            {
                sumatoriaXporY = sumatoriaXporY + (parametros.X[i] * parametros.Y[i]);
            }

            double deltaA1 = (numeroDePares * sumatoriaXporY) - (sumatoriaX * sumatoriaY);

            double delta = (numeroDePares * sumatoriaXCuadrado) - (sumatoriaX * sumatoriaX);

            resultado.Pendiente      = deltaA1 / delta;
            resultado.OrdenadaOrigen = promedioY - (resultado.Pendiente * promedioX);

            return(resultado);
        }
コード例 #3
0
        private ResultadoRegresion MetodosCerrados(ParametroCompuesto parametros, MetodoCerradoDelegate calcularXr)
        {
            ResultadoRegresion resultado = new ResultadoRegresion();
            var resultadoxi = Utilidad.EvaluarFuncion(parametros.Funcion, parametros.Xi);
            var resultadoxd = Utilidad.EvaluarFuncion(parametros.Funcion, parametros.Xd);

            if (resultadoxi.Equals(double.NaN) || resultadoxd.Equals(double.NaN))
            {
                throw new ArgumentException("Verificar Función", "parametros.Funcion");
            }

            if (resultadoxi * resultadoxd > 0)
            {
                throw new ArgumentException("Ingresar nuevamente los extremos", "parametros.Xi");
            }

            if (resultadoxi * resultadoxd == 0)
            {
                if (resultadoxi == 0)
                {
                    resultado.Raiz = parametros.Xi;
                }
                else
                {
                    resultado.Raiz = parametros.Xd;
                }
                resultado.Iteraciones   = 0;
                resultado.ErrorRelativo = 0;

                return(resultado);
            }

            return(this.BuscarRaicesCerrados(parametros, calcularXr));
        }
コード例 #4
0
        public ResultadoRegresion MetodoRegresionLineal(ParametroRegresion parametro)
        {
            ResultadoRegresion Devolver = new ResultadoRegresion();

            var    n                  = parametro.ValoresX.Count;
            var    SumatoriaX         = parametro.ValoresX.Sum();
            var    SumatoriaY         = parametro.ValoresY.Sum();
            var    SumatoriaXCuadrada = parametro.ValoresX.Sum(x => x * x);
            double SumatoriaXporY     = 0;
            var    PromedioY          = SumatoriaY / n;
            var    PromedioX          = SumatoriaX / n;

            for (int i = 0; i < parametro.ValoresX.Count; i++)
            {
                SumatoriaXporY = SumatoriaXporY + (parametro.ValoresX[i] * parametro.ValoresY[i]);
            }

            var A1 = ((n * SumatoriaXporY) - (SumatoriaX * SumatoriaY)) / ((n * SumatoriaXCuadrada) - (SumatoriaX * SumatoriaX));
            var A0 = PromedioY - (A1 * PromedioX);

            Devolver.Resultado.Add(A0);
            Devolver.Resultado.Add(A1);
            Devolver.CoeficienteCorrelacion = this.CalcularCoeficienteDeCorrelacion(parametro, PromedioY, new List <double>()
            {
                A0, A1
            });


            return(Devolver);
        }
コード例 #5
0
        private void button2_Click(object sender, EventArgs e)
        {
            bool band = true;

            int numero = Convert.ToInt32(this.textBox1.Text);

            double[] vecx = new double[numero];
            double[] vecy = new double[numero];

            List <TextBox> lista = panel1.Controls.OfType <TextBox>().ToList();

            if (VerificarDatosMetodo(lista) == true)
            {
                for (int i = 0; i < numero; i++)
                {
                    vecx[i] = Convert.ToDouble(lista.ElementAt(i).Text);
                }
                int c = 0;
                int n = numero * 2;
                for (int j = numero; j < n; j++)
                {
                    vecy[c] = Convert.ToDouble(lista.ElementAt(j).Text);
                    c++;
                }
            }
            else
            {
                MessageBox.Show("Complete todos los campos");

                band = false;
            }
            if (band == true)
            {
                DatosParametros datos = new DatosParametros();

                datos.NumPares = numero;
                datos.X        = vecx;
                datos.Y        = vecy;

                ResultadoRegresion NuevoResultado = new ResultadoRegresion();

                FormularioPrincipal formularioprincipal = this.Owner as FormularioPrincipal;
                if (formularioprincipal != null)
                {
                    NuevoResultado = formularioprincipal.MinimosCuadrados(datos);

                    string variable = "";

                    variable = Convert.ToString("EFECTIVIDAD: " + NuevoResultado.Efectividad + "     ORDENADA ORIGEN: " + NuevoResultado.OrdenadaOrigen + "     PENDIENTE: " + NuevoResultado.Pendiente);

                    MessageBox.Show(variable);
                }
            }
        }
コード例 #6
0
        private void button1_Click(object sender, EventArgs e)
        {
            double[,] Matriz = new double[Cantidad, 2];

            for (int i = 0; i < Cantidad; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    string texto = dataGridView1.Rows[i].Cells[j].Value.ToString();

                    if (texto == "")
                    {
                        texto = "Invalido";
                    }
                    double textoADouble;

                    bool result = double.TryParse(texto, out textoADouble);

                    if (result)
                    {
                        Matriz[i, j] = textoADouble;
                    }
                }
            }
            MatrizUsada = Matriz;
            Regresion nuevaRegresion = new Regresion();

            if (Metodo == "Regresión Lineal por mínimos cuadrados")
            {
                ResultadoRegresion nuevoResultado = new ResultadoRegresion();
                nuevoResultado = nuevaRegresion.CalcularRegresionLineal(Matriz, Cantidad);

                MessageBox.Show("El termino independiente es: " + nuevoResultado.Resultadoa0 + ", su coeficiente es: " + nuevoResultado.Resultadoa1 + ", y su coeficiente de correlacion es: " + nuevaRegresion.CoefienteCorrelacion(Matriz, Cantidad, nuevoResultado.Resultados));
            }
            else
            {
                if (Metodo == "Regresión Polinomial por mínimos cuadrados")
                {
                    var nuevoResultado = nuevaRegresion.CalcularRegrecionPolinomial(Matriz, Cantidad, 2);
                    ResultadosRegresion    = nuevoResultado.Resultados;
                    CoeficienteCorrelacion = nuevaRegresion.CoefienteCorrelacion(Matriz, Cantidad, nuevoResultado.Resultados);
                    ResultadosRegresion nuevoResultadoRegresion = new Regresión.ResultadosRegresion();
                    nuevoResultadoRegresion.Owner = this;
                    nuevoResultadoRegresion.Show();
                }
                else
                {
                    var nuevoResultado = nuevaRegresion.CalcularLagrange(Matriz, Cantidad, numeroLagrange);
                    MessageBox.Show("El valor correspondiente cuando x= " + numeroLagrange + " es: " + nuevoResultado + ", a traves del metodo de Lagrange");
                }
            }
        }
コード例 #7
0
        private ResultadoRegresion BuscarRaicesCerrados(ParametroCompuesto parametros, MetodoCerradoDelegate calcularXr)
        {
            ResultadoRegresion resultado = new ResultadoRegresion
            {
                ErrorRelativo = 0,
                Iteraciones   = 0
            };

            int    contador      = 0;
            double anterior      = 0;
            double errorRelativo = 0;
            var    XI            = parametros.Xi;
            var    XD            = parametros.Xd;
            double xr            = calcularXr(XI, XD, parametros.Funcion);

            if (xr != 0)
            {
                errorRelativo = (xr - anterior) / xr;
            }

            var resultadoXR = Utilidad.EvaluarFuncion(parametros.Funcion, xr);

            while ((Math.Abs(errorRelativo) > parametros.Tolerancia || xr == 0) && contador < parametros.Iteraciones && Math.Abs(resultadoXR) > parametros.Tolerancia)
            {
                if (Utilidad.EvaluarFuncion(parametros.Funcion, XI) * Utilidad.EvaluarFuncion(parametros.Funcion, xr) > 0)
                {
                    XI = xr;
                }
                else
                {
                    XD = xr;
                }

                anterior  = xr;
                xr        = calcularXr(XI, XD, parametros.Funcion);
                contador += 1;

                if (Math.Abs(xr) > ((parametros.Tolerancia) * 10))
                {
                    errorRelativo = (xr - anterior) / xr;
                }

                resultadoXR = Utilidad.EvaluarFuncion(parametros.Funcion, xr);
            }

            resultado.Iteraciones   = contador;
            resultado.ErrorRelativo = errorRelativo;
            resultado.Raiz          = xr;

            return(resultado);
        }
コード例 #8
0
        private void MostrarResultado(ResultadoRegresion resultado)
        {
            Grilla_Res.Controls.Clear();

            int Columna = 2;

            ResultadoMat = new TextBox[resultado.Resultado.Count, Columna];
            int TamañoText = Grilla_Res.Width / Columna;

            for (int y = 0; y < Columna; y++)
            {
                for (int x = 0; x < resultado.Resultado.Count; x++)
                {
                    ResultadoMat[x, y] = new TextBox();
                    if (y == 1)
                    {
                        ResultadoMat[x, y].Text = resultado.Resultado[x].ToString("0.0000");
                    }
                    else
                    {
                        if (resultado.Resultado.Count == 1)
                        {
                            ResultadoMat[x, y].Text = "F(x)";
                        }
                        else
                        {
                            ResultadoMat[x, y].Text = "A" + x;
                        }
                    }

                    ResultadoMat[x, y].Top   = (x * Matriz[x, y].Height) + 20;
                    ResultadoMat[x, y].Left  = y * TamañoText;
                    ResultadoMat[x, y].Width = TamañoText - 2;
                    Grilla_Res.Controls.Add(ResultadoMat[x, y]);
                }
            }

            txt_Coeficiente.Text = resultado.CoeficienteCorrelacion.ToString();
        }
コード例 #9
0
        private void btn_Calcular_Click(object sender, EventArgs e)
        {
            ParametroCompuesto parametros = new ParametroCompuesto();

            parametros.Funcion     = txt_Funcion.Text;
            parametros.Iteraciones = Convert.ToInt32(txt_Iteraciones.Text);
            parametros.Tolerancia  = Convert.ToDouble(txt_Tolerancia.Text);
            parametros.Xi          = Convert.ToDouble(txt_ValorXi.Text);
            parametros.Xd          = Convert.ToDouble(txt_ValorXd.Text);

            ResultadoRegresion Resultado = null;

            switch (MetodoActual)
            {
            case EMetodo.Biseccion:
                try
                {
                    Resultado     = this.MetodosRaices.Biseccion(parametros);
                    txt_Raiz.Text = Resultado.Raiz.ToString("0.000000000000");
                    txt_IteracionesActual.Text = Resultado.Iteraciones.ToString();
                    txt_Error.Text             = Resultado.ErrorRelativo.ToString("0.000000000000");
                }
                catch (ArgumentException Exception)
                {
                    MessageBox.Show(Exception.Message);

                    if (Exception.ParamName == "parametros.Xi")
                    {
                        txt_ValorXi.Text = string.Empty;
                        txt_ValorXd.Text = string.Empty;
                    }
                }
                break;

            case EMetodo.ReglaFalsa:

                try
                {
                    Resultado     = this.MetodosRaices.ReglaFalsa(parametros);
                    txt_Raiz.Text = Resultado.Raiz.ToString("0.000000000000");
                    txt_IteracionesActual.Text = Resultado.Iteraciones.ToString();
                    txt_Error.Text             = Resultado.ErrorRelativo.ToString("0.000000000000");
                }
                catch (ArgumentException Exception)
                {
                    MessageBox.Show(Exception.Message);

                    if (Exception.ParamName == "parametros.Xi")
                    {
                        txt_ValorXi.Text = string.Empty;
                        txt_ValorXd.Text = string.Empty;
                    }
                }
                break;

            case EMetodo.Secante:

                try
                {
                    Resultado     = this.MetodosRaices.Secante(parametros);
                    txt_Raiz.Text = Resultado.Raiz.ToString("0.000000000000");
                    txt_IteracionesActual.Text = Resultado.Iteraciones.ToString();
                    txt_Error.Text             = Resultado.ErrorRelativo.ToString("0.000000000000");
                }
                catch (ArgumentException Exception)
                {
                    MessageBox.Show(Exception.Message);

                    if (Exception.ParamName == "Xi")
                    {
                        txt_ValorXi.Text = string.Empty;
                    }

                    if (Exception.ParamName == "Xd")
                    {
                        txt_ValorXd.Text = string.Empty;
                    }
                }
                catch (DivideByZeroException Exception)
                {
                    MessageBox.Show(Exception.Message);
                }
                catch (NoRaizException Exception)
                {
                    MessageBox.Show(Exception.Message);
                    txt_Raiz.Text = Exception.Valor.ToString();
                    txt_IteracionesActual.Text = Exception.Iteraciones.ToString();
                }

                break;
            }
        }
コード例 #10
0
        public ResultadoRegresion MinimosCuadradosPolinomioGradoN(ParametrosRegresion parametros)
        {
            var resul = new ResultadoRegresion();

            double sumatoriaX = parametros.X.Sum();
            double sumatoriaY = parametros.Y.Sum();
            double r          = 0;

            while (parametros.Grado <= 10 && r <= parametros.Error)
            {
                double[,] matriz = new double[parametros.Grado + 1, parametros.Grado + 2];

                resul = null;
                resul = new ResultadoRegresion();

                var pot = 0;
                for (int columna = 0; columna < parametros.Grado + 1; columna++)
                {
                    if (columna > 0)
                    {
                        pot = columna;
                        for (int i = 0; i < parametros.Grado + 1; i++)
                        {
                            matriz[i, columna] = RetornarSumXpotencia(parametros.X, pot);
                            pot++;
                        }
                    }
                    else if (columna == 0)
                    {
                        pot          = 1;
                        matriz[0, 0] = parametros.NumPares;
                        for (int i = 1; i < parametros.Grado + 1; i++)
                        {
                            matriz[i, columna] = RetornarSumXpotencia(parametros.X, pot);
                            pot++;
                        }
                    }
                }

                for (int i = 0; i < parametros.Grado + 1; i++)
                {
                    if (i != 0)
                    {
                        pot = 1;
                        matriz[i, parametros.Grado + 1] = RetornarXPorY(i, parametros.X, parametros.Y);
                        pot++;
                    }
                    else
                    {
                        matriz[i, parametros.Grado + 1] = parametros.Y.Sum();
                    }
                }

                //var SistemaDeEcucuaciones = new SistemaDeEcuaciones();

                var param = new ParametrosEcuaciones();
                param.NumIncognitas = parametros.Grado + 1;

                for (int i = 0; i < parametros.Grado + 1; i++)
                {
                    for (int c = 0; c < parametros.Grado + 2; c++)
                    {
                        param.Coeficientes.Add(matriz[i, c]);
                    }
                }



                var resultadoGauss = metodosSistemaEcuaciones.GaussJordan(param);

                r = CalcularR(parametros.X, parametros.Y, resultadoGauss.Resultados);

                parametros.Grado++;

                resul.Efectividad = r;
                resul.Resul       = resultadoGauss.Resultados;
                resul.GradoFinal  = parametros.Grado - 1;
            }

            return(resul);
        }
コード例 #11
0
        public ResultadoRegresion Secante(ParametroCompuesto parametros)
        {
            ResultadoRegresion resultado = new ResultadoRegresion()
            {
                Iteraciones   = 0,
                ErrorRelativo = 0
            };

            VerificaParametros(parametros);

            var resultadoxi = Utilidad.EvaluarFuncion(parametros.Funcion, parametros.Xi);
            var resultadoxd = Utilidad.EvaluarFuncion(parametros.Funcion, parametros.Xd);

            if (resultadoxd * resultadoxi == 0)
            {
                if (resultadoxd == 0)
                {
                    resultado.Raiz = parametros.Xd;
                }
                else
                {
                    resultado.Raiz = parametros.Xi;
                }

                return(resultado);
            }

            double errorRelativo = 0;
            int    contador      = 0;
            double anterior      = 0;
            var    Xi            = parametros.Xi;
            var    Xd            = parametros.Xd;
            double Xr            = 0;
            double resultadoXr   = 0;

            do
            {
                if ((Utilidad.EvaluarFuncion(parametros.Funcion, Xi) - Utilidad.EvaluarFuncion(parametros.Funcion, Xd)) == 0)
                {
                    throw new DivideByZeroException("División por 0");
                }

                Xr          = ((Utilidad.EvaluarFuncion(parametros.Funcion, Xi) * Xd) - (Utilidad.EvaluarFuncion(parametros.Funcion, Xd) * Xi)) / ((Utilidad.EvaluarFuncion(parametros.Funcion, Xi) - Utilidad.EvaluarFuncion(parametros.Funcion, Xd)));
                resultadoXr = Utilidad.EvaluarFuncion(parametros.Funcion, Xr);
                contador   += 0;

                if (resultadoXr.Equals(double.NaN))
                {
                    throw new NoRaizException(Xr, "Punto fuera del dominio de la funcion", 0);
                }

                if (double.IsInfinity(resultadoXr))
                {
                    throw new NoRaizException(Xr, "La Funcion evaluada en este punto es infinita", contador);
                }

                if (Xr != 0)
                {
                    errorRelativo = ((Xr - anterior) / Xr);
                }

                Xi       = Xd;
                Xd       = Xr;
                anterior = Xr;
            } while ((Math.Abs(errorRelativo) > parametros.Tolerancia || Xr == 0) && contador < parametros.Iteraciones && Math.Abs(resultadoXr) > parametros.Tolerancia);


            if (Math.Abs(resultadoXr) > parametros.Tolerancia * 100)
            {
                throw new NoRaizException(Xr, "Valor muy alejado de la raiz", contador);
            }

            resultado.Raiz          = Xr;
            resultado.Iteraciones   = contador;
            resultado.ErrorRelativo = Math.Abs(errorRelativo);


            return(resultado);
        }
コード例 #12
0
        public ResultadoRegresion NewtonRaphson(ParametroSimple parametros)
        {
            ResultadoRegresion resultado = new ResultadoRegresion()
            {
                Iteraciones   = 0,
                ErrorRelativo = 0
            };

            double resultadoXr = Utilidad.EvaluarFuncion(parametros.Funcion, parametros.Xi);

            if (resultadoXr.Equals(Double.NaN))
            {
                throw new ArgumentException("Verificar Funcion", "Funcion");
            }

            if (resultadoXr == 0)
            {
                resultado.Raiz = parametros.Xi;
                return(resultado);
            }

            double Anterior       = 0;
            int    Contador       = 0;
            double ValorX         = parametros.Xi;
            double Tolerancia     = parametros.Tolerancia;
            double ValorXTole     = (ValorX + Tolerancia);
            double ValorFXTole    = Utilidad.EvaluarFuncion(parametros.Funcion, ValorXTole);
            double ValorXfun      = Utilidad.EvaluarFuncion(parametros.Funcion, ValorX);
            double ValorNumerador = ValorFXTole - ValorXfun;
            double Derivada       = ValorNumerador / Tolerancia;
            double xr             = 0;
            double errorRelativo  = 0;

            do
            {
                if (Math.Abs(Derivada) < parametros.Tolerancia)
                {
                    throw new NoRaizException(ValorX, "La Recta TG en este punto es horizontal", Contador);
                }

                xr          = ValorX - (Utilidad.EvaluarFuncion(parametros.Funcion, ValorX) / Derivada);
                resultadoXr = Utilidad.EvaluarFuncion(parametros.Funcion, xr);

                if (resultadoXr.Equals(double.NaN))
                {
                    throw new NoRaizException(xr, "El valor no pertenece al dominio de la Funcion", Contador);
                }

                errorRelativo = (xr - Anterior) / xr;
                Contador     += 1;

                Anterior       = xr;
                ValorX         = xr;
                ValorXTole     = (ValorX + Tolerancia);
                ValorFXTole    = Utilidad.EvaluarFuncion(parametros.Funcion, ValorXTole);
                ValorXfun      = Utilidad.EvaluarFuncion(parametros.Funcion, ValorX);
                ValorNumerador = ValorFXTole - ValorXfun;
                Derivada       = ValorNumerador / Tolerancia;
            } while (Math.Abs(resultadoXr) > Tolerancia && Contador < parametros.Iteraciones && (Math.Abs(errorRelativo) > Tolerancia || xr == 0));


            if (Math.Abs(resultadoXr) > Tolerancia * 100)
            {
                throw new NoRaizException(xr, "Valor muy alejado de la raiz", Contador);
            }

            resultado.Raiz          = xr;
            resultado.ErrorRelativo = Math.Abs(errorRelativo);
            resultado.Iteraciones   = Contador;

            return(resultado);
        }