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ó
 }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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;
        }