Ejemplo n.º 1
0
        // Agrupar terminos de igual grado
        public static void ReducirPol(List <Global.Termino> pol)
        {
            List <Global.Termino> polAux = new List <Global.Termino>(pol);

            pol.Clear();
            foreach (Global.Termino o in polAux)
            {
                int index = pol.FindIndex(x => x.grado == o.grado);
                if (index != -1)
                {
                    Global.Termino aux = pol[index];
                    aux.coef  += Redondear(o.coef);
                    pol[index] = aux;
                }
                else
                {
                    pol.Add(o);
                }
            }
        }
Ejemplo n.º 2
0
        public void CalcPolNewton(List <Global.Termino> polinomio, List <string> pasos)
        {
            int i, j;

            string polAux1;
            string aux1;

            polAux1 = "" + b.ElementAt(0);//pasos string
            polinomio.Add(new Global.Termino(b.ElementAt(0), 0));
            for (i = 1; i < orden; i++)
            {
                aux1 = " + " + b.ElementAt(i);//pasos string

                List <Global.Termino> terms = new List <Global.Termino>();
                terms.Add(new Global.Termino(b.ElementAt(i), 0));
                for (j = 0; j < i; j++)
                {
                    List <Global.Termino> newTerm = new List <Global.Termino>(); //Termino (x - xi)
                    newTerm.Add(new Global.Termino(1, 1));                       // x

                    if (progresivo)
                    {
                        aux1 += "* (x - (" + x_k.ElementAt(j) + "))";          //pasos string
                        newTerm.Add(new Global.Termino(-x_k.ElementAt(j), 0)); // -xi
                    }
                    else
                    {
                        aux1 += "* (x - (" + x_k.ElementAt(x_k.Count() - 1 - j) + "))";          //pasos string
                        newTerm.Add(new Global.Termino(-x_k.ElementAt(x_k.Count() - 1 - j), 0)); // -xi
                    }

                    List <Global.Termino> terminosParciales = new List <Global.Termino>();
                    for (int k = 0; k < terms.Count; k++)
                    {
                        Global.Termino aux = new Global.Termino(Util.Redondear(terms[k].coef * newTerm[0].coef), terms[k].grado + newTerm[0].grado);
                        terminosParciales.Add(aux);
                        aux = new Global.Termino(Util.Redondear(terms[k].coef * newTerm[1].coef), terms[k].grado + newTerm[1].grado);
                        terminosParciales.Add(aux);
                    }

                    terms = terminosParciales;
                }
                polAux1 += aux1;//pasos string
                polinomio.AddRange(terms);
            }

            // Reducir Polinomio Final
            Util.ReducirPol(polinomio);

            // Polinomio Formateado
            string polString = Util.PolToString(polinomio, "P", "x");

            // Pasos finales
            pasos.Add("Calculo del polinomio");
            pasos.Add("P(x) = " + polAux1);
            pasos.Add("");
            pasos.Add(polString);

            foreach (string p in pasos)
            {
                Console.WriteLine(p);
            }
        }
Ejemplo n.º 3
0
        // Calcular polinomio de Lagrange (Lista de puntos(x,y)) => Polinomio
        public static void CalcPolLagrange(List <Global.Punto> puntos, List <Global.Termino> polinomio, List <string> pasos)
        {
            List <Global.Termino> li;
            string auxStr1 = "";
            string auxStr2 = "";
            string polString;


            for (int i = 0; i < puntos.Count; i++)
            {
                string sNum = "";
                string sDen = "";

                List <Global.Termino> numLi = new List <Global.Termino>();
                numLi.Add(new Global.Termino(1, 0));
                double denomLi = 1;
                for (int j = 0; j < puntos.Count; j++)
                {
                    if (i != j)
                    {
                        // Acumular denominador para dividir a Li
                        denomLi = denomLi * (puntos[i].x - puntos[j].x);
                        List <Global.Termino> nuevoTermino = new List <Global.Termino>();
                        nuevoTermino.Add(new Global.Termino(-puntos[j].x, 0));
                        nuevoTermino.Add(new Global.Termino(1, 1));

                        // Multiplicar nuevo termino para determinar nuevo Li
                        List <Global.Termino> numLiParcial = new List <Global.Termino>();
                        for (int k = 0; k < numLi.Count; k++)
                        {
                            Global.Termino aux = new Global.Termino(Util.Redondear(numLi[k].coef * nuevoTermino[0].coef), numLi[k].grado + nuevoTermino[0].grado);
                            numLiParcial.Add(aux);
                            aux = new Global.Termino(Util.Redondear(numLi[k].coef * nuevoTermino[1].coef), numLi[k].grado + nuevoTermino[1].grado);
                            numLiParcial.Add(aux);
                        }

                        numLi = numLiParcial;

                        // Armar numerador Li
                        sNum += "(x" + " - " + puntos[j].x + ")";
                        // Armar denominador Li
                        sDen += "(" + puntos[i].x + " - " + puntos[j].x + ")";
                    }
                }

                // Reducir numerador Li
                Util.ReducirPol(numLi);
                // Armar Li
                li = Util.MultPolPorCte(numLi, (puntos[i].y / denomLi));
                // Mostrar Li formateado
                String liString = Util.PolToString(li, "", "x");
                //Console.WriteLine(liString);

                // Agregar Li al Polinomio Final
                polinomio.AddRange(li);

                // Pasos
                pasos.Add("Calculo de L" + i);
                pasos.Add("L" + i + "(x) = " + sNum + " / " + sDen);
                pasos.Add("f" + i + "(x)L" + i + "(x) = " + puntos[i].y + "(" + sNum + " / " + sDen + ")");
                pasos.Add("f" + i + "(x)L" + i + "(x) = " + (puntos[i].y / denomLi) + "(" + sNum + ")");
                pasos.Add("f" + i + "(x)L" + i + "(x) = " + liString);
                pasos.Add("");
                if (i == 0)
                {
                    auxStr1 += "f" + i + "(x)L" + i + "(x)";
                    auxStr2 += liString;
                }
                else
                {
                    auxStr1 += " + f" + i + "(x)L" + i + "(x) ";
                    auxStr2 += " + " + liString;
                }
            }

            // Reducir Polinomio Final
            Util.ReducirPol(polinomio);

            // Polinomio Formateado
            polString = Util.PolToString(polinomio, "P", "x");

            // Pasos finales
            pasos.Add("Calculo del polinomio");
            pasos.Add("P(x) = " + auxStr1);
            pasos.Add("");
            pasos.Add("P(x) = " + auxStr2);
            pasos.Add(polString);

            foreach (string p in pasos)
            {
                Console.WriteLine(p);
            }
        }