public static SistemaDeEcuaciones IgualaTerminos(this SistemaDeEcuaciones sis) { SistemaDeEcuaciones se = new SistemaDeEcuaciones(); EcuacionLineal el = new EcuacionLineal(); for (int i = 0; i < sis.Count; i++) { el = Libera(el); for (int j = 0; j < sis[i].Count; j++) { if (el.Select(x => x.Literal).ToList().Contains(sis[i][j].Literal)) el.AcumulaCoeficientePorTermino(sis[i][j].Literal, sis[i][j].Coeficiente); else el.Add(new TerminoLineal(sis[i][j].Literal, sis[i][j].Coeficiente)); } for (int j = sis[i].Count - 1; j >= 0; j--) { if (el.Select(x => x.Literal).ToList().Contains(sis[i][j].Literal)) el.CambiaCoeficientePorTermino(sis[i][j].Literal, sis[i][j].Coeficiente); else el.Add(new TerminoLineal(sis[i][j].Literal, sis[i][j].Coeficiente)); } se.Add(el); } return se; }
public static int EvaluaNumeroDeResultados(SistemaDeEcuaciones sis) { if (sis.Where(e => e.Where(t => t.Coeficiente == 0).Count() == e.Count).Select(x => x).Count() > 0) return 1;//Cuando hay una infinidad de Resultados else if (sis.Where(e => e.Where(t => t.Coeficiente == 0).Count() == e.Where(t => t.Literal != "_").Count()).Select(x => x).Count() > 0) return -1;//Cuando es Incosistente else if (sis.Select(e => e).LastOrDefault().Select(t => t).LastOrDefault().Coeficiente != 0 && sis.Count() == sis[0].Count() - 1) return 0;//Cuando existe solo un resultado else return 1;//Algo falló }
private void Button_Click(object sender, RoutedEventArgs e) { DataTable dt = (Sistema.ItemsSource as DataView).Table; SistemaDeEcuaciones se = new SistemaDeEcuaciones(); foreach (DataRow dr in dt.Rows) { EcuacionLineal el = new EcuacionLineal(); for (int i = 0; i < dt.Columns.Count; i++) { el.Add(new TerminoLineal(dt.Columns[i].Caption, Convert.ToDouble(dr[i].ToString()))); } se.Add(el); } StringBuilder sb = new StringBuilder(); var s1 = EliminacionDeGaussLinq.IgualaTerminos(se); //Paso 2 orden var _s2 = new SistemaDeEcuaciones(s1.Select(x => x.ordena()).ToList()).ordena(); List<string> l = (from s in _s2[0] select s.Literal).ToList(); var __s2 = new SistemaDeEcuaciones(s1.Select(x => x.ordena(l)).ToList()).ordena(); //Paso 3 Reduccion var s2 = Reduccion.re(__s2, l); //Paso 4 Resultados switch (EliminacionDeGaussLinq.EvaluaNumeroDeResultados(s2)) { case 1: sb.AppendLine("Existen una infinidad de Resultados"); sb.AppendLine(s2.ToString()); sb.AppendLine("Una solución específica es:"); SistemaDeEcuaciones sde = new SistemaDeEcuaciones(); foreach (EcuacionLineal el in s2) { EcuacionLineal ee = new EcuacionLineal(); foreach (TerminoLineal tl in el) ee.Add(new TerminoLineal(tl.Literal, tl.Coeficiente)); sde.Add(ee); } foreach (TerminoLineal t in Reduccion.PresentaResultadoInfinito(sde, 5.3)) sb.AppendLine(t.Literal + "=" + t.Valor.ToString("0.00")); SistemaDeEcuaciones sde1 = new SistemaDeEcuaciones(); foreach (EcuacionLineal el in s2) { EcuacionLineal ee = new EcuacionLineal(); foreach (TerminoLineal tl in el) ee.Add(new TerminoLineal(tl.Literal, tl.Coeficiente)); sde1.Add(ee); } sb.AppendLine("Otra solución específica es:"); foreach (TerminoLineal t in Reduccion.PresentaResultadoInfinito(sde1, -1)) sb.AppendLine(t.Literal + "=" + t.Valor.ToString("0.00")); break; case 0: sb.AppendLine("Existe sólo un Resultado"); sb.AppendLine(s2.ToString()); foreach (TerminoLineal t in Reduccion.PresentaResultadoUnico(s2)) sb.AppendLine(t.Literal + "=" + t.Valor.ToString("0.00")); break; case -1: sb.AppendLine("La ecuación es incongruente"); sb.AppendLine(s2.ToString()); break; default: sb.AppendLine("La ecuación no se evaluó correctamente"); sb.AppendLine(s2.ToString()); break; } Result.Text = sb.ToString(); }
static void Main(string[] args) { double a = 2;//2 infinito y -3 incongruente SistemaDeEcuaciones se = new SistemaDeEcuaciones(){ new EcuacionLineal(){ new TerminoLineal("x",1), new TerminoLineal("y",1), new TerminoLineal("z",-1), new TerminoLineal("_",1) }, new EcuacionLineal(){ new TerminoLineal("x",2), new TerminoLineal("y",3), new TerminoLineal("z",a), new TerminoLineal("_",3) }, new EcuacionLineal(){ new TerminoLineal("x",1), new TerminoLineal("y",a), new TerminoLineal("z",3), new TerminoLineal("_",2) } }; Console.WriteLine("La ecuación inicial es:"); Console.WriteLine(se.ToString()); //Paso 1 mismos términos var s1 = EliminacionDeGaussLinq.IgualaTerminos(se); //Paso 2 orden var _s2 = new SistemaDeEcuaciones(s1.Select(x => x.ordena()).ToList()).ordena(); List<string> l = (from s in _s2[0] select s.Literal).ToList(); var __s2 = new SistemaDeEcuaciones(s1.Select(x => x.ordena(l)).ToList()).ordena(); //Paso 3 Reduccion var s2 = Reduccion.re(__s2, l); //Paso 4 Resultados switch (EliminacionDeGaussLinq.EvaluaNumeroDeResultados(s2)) { case 1: Console.WriteLine("Existen una infinidad de Resultados"); Console.WriteLine(s2.ToString()); Console.WriteLine("Una solución específica es:"); SistemaDeEcuaciones sde = new SistemaDeEcuaciones(); foreach (EcuacionLineal el in s2) { EcuacionLineal e = new EcuacionLineal(); foreach (TerminoLineal tl in el) e.Add(new TerminoLineal(tl.Literal, tl.Coeficiente)); sde.Add(e); } foreach (TerminoLineal t in Reduccion.PresentaResultadoInfinito(sde,5.3)) Console.WriteLine(t.Literal + "=" + t.Valor.ToString("0.00")); SistemaDeEcuaciones sde1 = new SistemaDeEcuaciones(); foreach (EcuacionLineal el in s2) { EcuacionLineal e = new EcuacionLineal(); foreach (TerminoLineal tl in el) e.Add(new TerminoLineal(tl.Literal, tl.Coeficiente)); sde1.Add(e); } Console.WriteLine("Otra solución específica es:"); foreach (TerminoLineal t in Reduccion.PresentaResultadoInfinito(sde1, -1)) Console.WriteLine(t.Literal + "=" + t.Valor.ToString("0.00")); break; case 0: Console.WriteLine("Existe sólo un Resultado"); Console.WriteLine(s2.ToString()); foreach (TerminoLineal t in Reduccion.PresentaResultadoUnico(s2)) Console.WriteLine(t.Literal + "=" + t.Valor.ToString("0.00")); break; case -1: Console.WriteLine("La ecuación es incongruente"); Console.WriteLine(s2.ToString()); break; default: Console.WriteLine("La ecuación no se evaluó correctamente"); Console.WriteLine(s2.ToString()); break; } Console.ReadKey(); }
static void Main(string[] args) { SistemaDeEcuaciones se = new SistemaDeEcuaciones(); int i = 0, j = 0; char confirmacion = 's'; do { Console.WriteLine("A continuacion se le solicita los detalles de su ecuacion:" + (i + 1)); EcuacionLineal el = new EcuacionLineal(); j = 0; do { TerminoLineal tl = new TerminoLineal(); Console.WriteLine("Especifique el coeficiente del termino:" + (j + 1)); tl.Coeficiente = int.Parse(Console.ReadLine()); Console.WriteLine("Especifique la literal del termino:" + (j + 1) + "\n(Para indicar el termino constante, especifique '_')"); tl.Literal = Console.ReadLine(); Console.WriteLine("¿Desea especificar otro término para la ecuacion" + (i + 1)+"(s/n)?"); confirmacion = Console.ReadKey().KeyChar; el.Add(tl); j++; } while (confirmacion != 'n'); if (el.Where(x => x.Literal == "_").Count() == 0) el.Add(new TerminoLineal("_", 0)); se.Add(el); i++; Console.WriteLine("¿Desea especificar otra ecuacion (s/n)?"); confirmacion = Console.ReadKey().KeyChar; } while (confirmacion != 'n'); Console.WriteLine("La ecuación inicial es:"); Console.WriteLine(se.ToString()); //Paso 1 mismos términos var s1 = EliminacionDeGaussLinq.IgualaTerminos(se); //Paso 2 orden var _s2 = new SistemaDeEcuaciones(s1.Select(x => x.ordena()).ToList()).ordena(); List<string> l = (from s in _s2[0] select s.Literal).ToList(); var __s2 = new SistemaDeEcuaciones(s1.Select(x => x.ordena(l)).ToList()).ordena(); //Paso 3 Reduccion var s2 = Reduccion.re(__s2, l); //Paso 4 Resultados switch (EliminacionDeGaussLinq.EvaluaNumeroDeResultados(s2)) { case 1: Console.WriteLine("Existen una infinidad de Resultados"); Console.WriteLine(s2.ToString()); //foreach (string s in Reduccion.PresentaInfinidadDeResultados(s2)) // Console.WriteLine(s); break; case 0: Console.WriteLine("Existe sólo un Resultado"); Console.WriteLine(s2.ToString()); foreach (TerminoLineal t in Reduccion.PresentaResultadoUnico(s2)) Console.WriteLine(t.Literal + "=" + t.Valor); break; case -1: Console.WriteLine("La ecuación es incongruente"); Console.WriteLine(s2.ToString()); break; default: Console.WriteLine("La ecuación no se evaluó correctamente"); Console.WriteLine(s2.ToString()); break; } Console.ReadKey(); }
public static SistemaDeEcuaciones re(SistemaDeEcuaciones s2, List<string> l) { int e = 0; for (int i = 0; i < s2.Count; i++) { if (s2[i][e].Literal != "_") { if (s2[i][e].Coeficiente == 0) continue; if (s2[i][e].Coeficiente < 0) s2[i].InvierteSignos(); if (s2[i][e].Coeficiente == 1) { for (int j = 0; j < s2.Count; j++) if (i < j && s2[j].obtieneCoeficiente(s2[i][e].Literal) != 0) s2[j] = EliminacionDeGaussLinq.AplicacionDeSuma(s2[i], s2[j], -s2[j].obtieneCoeficiente(s2[i][e].Literal)).ordena(l); } else { s2[i] = EliminacionDeGaussLinq.CambiaAUno(s2[i], s2[i][e].Coeficiente); for (int j = 0; j < s2.Count; j++) if (i < j && s2[j].obtieneCoeficiente(s2[i][e].Literal) != 0) s2[j] = EliminacionDeGaussLinq.AplicacionDeSuma(s2[i], s2[j], -s2[j].obtieneCoeficiente(s2[i][e].Literal)).ordena(l); } e++; } } return s2; }
public static List<TerminoLineal> PresentaResultadoUnico(SistemaDeEcuaciones sis) { var lista = new List<TerminoLineal>(); for (int i = sis.Count - 1; i >= 0; i--) { TerminoLineal a = new TerminoLineal(); double suma = 0; int j = 0; foreach (TerminoLineal t in sis[i]) { foreach (TerminoLineal tt in lista) { if (t.Literal == tt.Literal) t.Valor = tt.Valor; } if (t.Literal == "_") { suma += t.Coeficiente; } else if (t.Coeficiente != 1) { suma += (-t.Coeficiente) * t.Valor; } else if (t.Coeficiente == 1 && t.Literal != "_" && t.Valor == 0 && i == j) { a.Literal = t.Literal; } j++; } a.Valor = suma; lista.Add(a); } return lista; }
public static List<TerminoLineal> PresentaResultadoInfinito(SistemaDeEcuaciones sis1, double parametro) { SistemaDeEcuaciones sis = sis1; var lista = new List<TerminoLineal>(); bool paso = false; for (int i = sis.Count - 1; i >= 0; i--) { if (sis[i].Where(x => x.Coeficiente == 0).Count() == sis[i].Count) continue; TerminoLineal a = new TerminoLineal(); double suma = 0; for (int j = sis[i].Count - 1; j >= 0; j--) { foreach (TerminoLineal tt in lista) { if (sis[i][j].Literal == tt.Literal) sis[i][j].Valor = tt.Valor; } if (sis[i][j].Coeficiente != 0 && i != j && sis[i][j].Literal != "_" && sis[i][j].Valor == 0) { sis[i][j].Valor = parametro; if (!paso) { lista.Add(sis[i][j]); paso = true; } } } int jj = 0; foreach (TerminoLineal t in sis[i]) { foreach (TerminoLineal tt in lista) { if (t.Literal == tt.Literal) t.Valor = tt.Valor; } if (t.Literal == "_") { suma += t.Coeficiente; } else if (t.Coeficiente != 1 || i != jj) { suma += (-t.Coeficiente) * t.Valor; } else if (t.Coeficiente == 1 && t.Literal != "_" && t.Valor == 0) { a.Literal = t.Literal; } jj++; } if (a.Literal != null) { a.Valor = suma; lista.Add(a); } } return lista; }