public Polinomio retornarPolinomio(List <List <float> > fs, List <float> xs) { String polinomioSinResolver = "P(x)="; Polinomio polInterpolante = new Polinomio(); for (int j = 0; j < fs.Count; j++) { if (fs[j].Count != 0)//sin este if rompe al tener solo un punto { Polinomio termino = new Polinomio(); termino.AgregarCoeficiente(1); polinomioSinResolver += fs[j].First().ToString(); for (int i = 0; i < j; i++) { Polinomio aux = new Polinomio(); aux.AgregarCoeficiente(-xs[i]); aux.AgregarCoeficiente(1); polinomioSinResolver += "(x-" + xs[i] + ")"; termino = termino.Multiplicar(aux); } if (j != fs.Count - 1) { polinomioSinResolver += "+"; } termino = termino.MultiplicarEscalar(fs[j].First()); polInterpolante = polInterpolante.Sumar(termino); pasos.Add(polinomioSinResolver); } } return(polInterpolante); }
public Polinomio Multiplicar(Polinomio polinomio) { List <float> coeficientes1 = coeficientes; List <float> coeficientes2 = polinomio.GetCoeficientes(); List <float> coeficientesProducto = new List <float>(); for (int i = 0; i < Grado() + polinomio.Grado() - 1; i++) { coeficientesProducto.Add(0); } for (int i = 0; i < Grado(); i++) { for (int j = 0; j < polinomio.Grado(); j++) { coeficientesProducto[i + j] += coeficientes1[i] * coeficientes2[j]; } } for (int i = 0; i < Grado() + polinomio.Grado() - 1; i++) { Console.WriteLine(coeficientesProducto[i]); } return(new Polinomio(coeficientesProducto)); }
public Polinomio aplicar(Dictionary <float, float> tablaValores) { reset(); int grado = tablaValores.Count() - 1; xs = tablaValores.Keys.ToList(); ys = tablaValores.Values.ToList(); ls = new List <Polinomio>(); int n = tablaValores.Count(); int a = 0; pasos.Add("Calcular los Li(Xi)"); foreach (var raiz in xs) { var xsNew = xs.Where(x => x != raiz).ToList(); var pol = new Polinomio(); pol.coeficientes.Add(1); foreach (var raizNew in xsNew) { List <float> coefAux = new List <float>(); coefAux.Add(-raizNew); coefAux.Add(1); pol = pol.Multiplicar(new Polinomio(coefAux)); } float denominador = 1; foreach (var raizNew in xsNew) { denominador *= (xs.First(x => x == raiz) - raizNew); } pol = pol.DividirEscalar(denominador); a++; ls.Add(pol); pasos.Add("L" + a + "(" + raiz + ") = " + pol.Formatear()); } int y = 0; Polinomio polInterpolante = new Polinomio(); pasos.Add("Calcular el polinomio interpolante"); foreach (var imagen in ys) { Polinomio polAux = ls[y].MultiplicarEscalar(imagen); polInterpolante = polInterpolante.Sumar(polAux); y++; } for (int b = 0; b < polInterpolante.coeficientes.Count; b++) { //polInterpolante.coeficientes[b] = (float) Math.Truncate(polInterpolante.coeficientes[b] * 10000) / 10000; polInterpolante.coeficientes[b] = (float)Math.Round(polInterpolante.coeficientes[b], 4); } pasos.Add("P(X)=" + polInterpolante.Formatear()); return(polInterpolante); }
private void Button1_Click(object sender, EventArgs e) { if (interpolador.tablaPuntosVacia()) { MessageBox.Show("Error: Debe agregar al menos un punto para continuar", "Error al calcular polinomio interpolante", MessageBoxButtons.OK); } else { if (!polinomioCalculado) { if (metodos.Text == "") { MessageBox.Show("Error: Debe seleccionar un método para continuar", "Error al calcular polinomio interpolante", MessageBoxButtons.OK); } else { polInterpolante = interpolador.obtenerPolinomioInterpolador(); ContainerPolinomioInterpolante.Text = polInterpolante.Formatear(); if (mostrarPasosBox.Checked) { CargarPasos(); } ContainerGrado.Text = polInterpolante.getGrado().ToString(); ContainerEquiespaciados.Text = interpolador.Equiespaciados(); polinomioCalculado = true; } } else { if (interpolador.necesitaRecalcular(polInterpolante)) { ContainerPasos.Text += "El polinomio interpolante no es el mismo calculado anteriormente, se va a recalcultar..." + Environment.NewLine; polinomioCalculado = false; Button1_Click(sender, e); } else { ContainerPasos.Text += "El polinomio interpolante se mantiene igual con los nuevos puntos, no se necesita recalcular" + Environment.NewLine; } } } }
public bool necesitaRecalcular(Polinomio polInterpolante) { bool respuesta = false; if (polInterpolante.getGrado() >= tablaPuntos.Count) { return(true); } foreach (var par in tablaPuntos) { float key = par.Key; float value = par.Value; respuesta = polInterpolante.Evaluar(key) != value; if (respuesta == true) { return(respuesta); } } return(respuesta); }
public Polinomio aplicar(Dictionary <float, float> tablaValores) { xs = tablaValores.Keys.ToList(); ys = tablaValores.Values.ToList(); fs = new List <List <float> >(); int contadorf = 1; fs.Add(ys); calcularF(ys, contadorf); Polinomio polInter = formula.retornarPolinomio(fs, xs); pasos.Add("Armamos el polinomio interpolante: "); pasos.AddRange(formula.obtenerPasos()); for (int b = 0; b < polInter.coeficientes.Count; b++) { //polInter.coeficientes[b] = (float)Math.Truncate(polInter.coeficientes[b] * 10000) / 10000; polInter.coeficientes[b] = (float)Math.Round(polInter.coeficientes[b], 4); } pasos.Add("P(x) = " + polInter.Formatear()); return(polInter); }
public Polinomio Sumar(Polinomio polinomio) { Polinomio resultado = new Polinomio(); for (int i = 0; i < Grado(); i++) { resultado.AgregarCoeficiente(coeficientes[i]); } for (int i = 0; i < polinomio.Grado(); i++) { if (i < resultado.GetCoeficientes().Count) { resultado.GetCoeficientes()[i] += polinomio.GetCoeficientes()[i]; } else { resultado.AgregarCoeficiente(polinomio.GetCoeficientes()[i]); } } return(resultado); }