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