INDICE
Pág.
INTRODUCCION……………………………..... 3
DESARROLLO………………………………… 4
o PROBLEMA
o OBJETIVO
o DIFERENCAS DIVIDIDAS
TEORIA
EJEMPLO
GRAFICA
SEUDO CODIGO
CONCLUSIONES……………………………… 8
BIBLIOGRAFIA………………………………… 9
ANEXOS………………………………………… 10
INTRODUCCION
PROBLEMA
¿Cómo ayuda un programa para la interpolación a través del método de
diferencias dividías de Newton?
OBJETIVO
Evaluar a través de lenguaje C un programa para la interpolación a través del
método de diferencias divididas de Newton.
Diferencias divididas
(Interpolación de Newton)
Partiendo de n puntos (x; y), podemos obtener un polinomio de grado n - 1. El método que
se utilizará es el de las diferencias divididas para obtener los coeficientes, el cual facilita la
tarea de resolver un sistema de ecuaciones usando el cociente de sumas y restas.
Dada una colección de n puntos de x y sus imágenes f(x), se pueden calcular los
coeficientes del polinomio interpolante utilizando las siguientes expresiones:
Finalmente, a partir de los valores obtenidos, se pueden obtener dos formas de
representar el
Polinomio:
Progresivo (desde 0 hasta n - 1):
Regresivo (desde n hasta 1):
Ejemplo:
Dados los puntos (1,2), (3,3), (4,2) y (8,10), se quiere obtener el polinomio interpolante
que pasa por ellos. Hallar, por medio de las diferencias divididas, el polinomio progresivo
y regresivo.
Al tener cuatro puntos, sabemos que el grado del polinomio interpolante será tres. Por lo
tanto, necesitaremos de cuatro coeficientes para tener nuestro polinomio definido.
Aplicando los pasos de las diferencias divididas:
xk f[xk] f[xk; xk+1] f[xk; xk+1; xk+2] f[xk; xk+1; xk+2; xk+3]
De esta manera, podemos ver que los valores de la primera fila serán los coeficientes
obtenidos de forma progresiva y, si tomamos los últimos de cada columna, tendremos los
coeficientes obtenidos de forma regresiva.
Sin embargo, a medida que aumenta la cantidad de puntos, el método puede volverse
confuso debido a la cantidad de diferencias a obtener. Por lo tanto, aprovechando la
forma en la que se disponen los coeficientes y por la forma de realizar las operaciones, se
emplea una tabla más simple para seguir visualmente. Consiste en escribir los puntos x e
y en las dos primer columnas; luego, se realizan las diferencias de la columna de
diferencias anterior y los valores de x correspondientes. Dada la forma que tiene la tabla,
se denomina método piramidal.
Se puede ver fácilmente qué cálculo hacer para obtener el siguiente elemento. Cada uno
es la resta entre los valores que están en la columna anterior que están por encima y
debajo de la diferencia en cuestión de forma tal que el valor obtenido queda en el medio
de ambos valores. Luego, se divide por la diferencia entre dos valores de x que se
obtienen siguiendo la diagonal desde la diferencia actual, hasta primer diferencia (f[xk]),
hacia arriba y hacia abajo. Finalmente, se resta el inferior con el superior.
Volviendo al ejemplo, si tomamos la diagonal superior de la _ultima tabla, obtendremos
los coeficientes del polinomio progresivo; si lo tomamos por la diagonal inferior,
obtendremos al polinomio regresivo.
Ambos polinomios resultan ser iguales. Esto es lógico pues estamos buscando el
polinomio de grado tres que pasa por cuatro puntos. Dado que, si planteáramos un
sistema de ecuaciones, tendríamos cuatro ecuaciones con cuatro incógnitas, esta debe
ser la única posible solución.
Resta verificar que, efectivamente, el polinomio pase por los puntos. A continuación se
muestra la gráfica del polinomio junto con los puntos por los que deba pasar:
SEUDO CODIGO
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void dataGridView1_KeyPress(object sender, KeyPressEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex == 0)
{
if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back) &&
e.KeyChar != Convert.ToChar('.') && e.KeyChar != Convert.ToChar('-'))
{
MessageBox.Show("Solo se permiten números", "Advertencia",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
e.Handled = true;
return;
}
}
if (dataGridView1.CurrentCell.ColumnIndex == 1)
{
if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back) &&
e.KeyChar != Convert.ToChar('.') && e.KeyChar != Convert.ToChar('-'))
{
MessageBox.Show("Solo se permiten números", "Advertencia",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
e.Handled = true;
return;
}
}
}
private void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex == 1)
{
TextBox txt = e.Control as TextBox;
if (txt != null)
{
txt.KeyPress -= new
KeyPressEventHandler(dataGridView1_KeyPress);
txt.KeyPress += new
KeyPressEventHandler(dataGridView1_KeyPress);
}
}
if (dataGridView1.CurrentCell.ColumnIndex == 0)
{
TextBox txt = e.Control as TextBox;
if (txt != null)
{
txt.KeyPress -= new
KeyPressEventHandler(dataGridView1_KeyPress);
txt.KeyPress += new
KeyPressEventHandler(dataGridView1_KeyPress);
}
}
}
private void label1_Click(object sender, EventArgs e)
{
private void button2_Click(object sender, EventArgs e)
{
//
label3.Visible = true;
label4.Visible = true;
//prueba.Visible = true;
textBox1.Visible = true;
button3.Visible = true;
label5.Visible = true;
textBox3.Visible = true;
//declaro variables
float[] datos = new float[dataGridView1.Rows.Count - 1];
float[] funciones = new float[dataGridView1.Rows.Count - 1];
// Doy los valores que pertenecen
for (int c = 0; c <= (dataGridView1.Rows.Count-2); c++)
{
datos[c] = Convert.ToSingle(dataGridView1.Rows[c].Cells[0].Value);
funciones[c] =
Convert.ToSingle(dataGridView1.Rows[c].Cells[1].Value);
Console.WriteLine(datos[c] + " " + funciones[c]);
}
//programa
float[,] T;
int n = datos.Length;
int i = 0, m, j;
m = n - 1;
T = new float[n - 1, n - 1];
Console.WriteLine("primeras diferencias divididas");
while (i <= m - 1)
{
T[i, 0] = (funciones[i + 1] - funciones[i]) / (datos[i + 1] -
datos[i]);
Console.WriteLine("{0 }", T[i, 0]);
i = i + 1;
}
j = 1;
while (j <= m - 1)
{
i = j;
Console.WriteLine();
Console.WriteLine("Diferencias divididas de orden {0}", j + 1);
while (i <= m - 1)
{
T[i, j] = (T[i, j - 1] - T[i - 1, j - 1]) / (datos[i + 1] -
datos[i - j]);
Console.WriteLine("{0}", T[i, j]);
i = i + 1;
}
j = j + 1;
}
// fin programa
for (int a = 0; a <= n - 2; a++)
{
for(int b = 0; b <= n - 2; b++)
{
Console.WriteLine("Elemento ["+ b + ": "+ a + " ] = "+ T[b, a]);
}
}
//Sacar El polinomio
String polinomio = "" + funciones[0];
for (int coef = 0; coef <= n-2; coef++)
{
for (int contadorVariable = 0; contadorVariable <= coef-1;
contadorVariable++)
{
if(datos[contadorVariable] >= 0)
{
polinomio = polinomio + "( x " + (-datos[contadorVariable])
+ ")";
}
else
{
polinomio = polinomio + "( x +" + (-datos[contadorVariable])
+ ")";
}
}
polinomio = polinomio + " + " + T[coef, coef];
}
Console.WriteLine(polinomio);
textBox2.Text = polinomio;
//prueba
private void dataGridView1_CellContentClick(object sender,
DataGridViewCellEventArgs e)
{
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void prueba_KeyPress(object sender, KeyPressEventArgs e)
{
private void label3_Click(object sender, EventArgs e)
{
private void textBox3_TextChanged(object sender, EventArgs e)
{
private void textBox1_TextChanged_1(object sender, EventArgs e)
{
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back) &&
e.KeyChar != Convert.ToChar('.') && e.KeyChar != Convert.ToChar('-'))
{
MessageBox.Show("Solo se permiten números", "Advertencia",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
e.Handled = true;
return;
}
}
private void button3_Click(object sender, EventArgs e)
{
//declaro variables
float[] datos = new float[dataGridView1.Rows.Count - 1];
float[] funciones = new float[dataGridView1.Rows.Count - 1];
// Doy los valores que pertenecen
for (int c = 0; c <= (dataGridView1.Rows.Count - 2); c++)
{
datos[c] = Convert.ToSingle(dataGridView1.Rows[c].Cells[0].Value);
funciones[c] =
Convert.ToSingle(dataGridView1.Rows[c].Cells[1].Value);
Console.WriteLine(datos[c] + " " + funciones[c]);
}
//programa
float[,] T;
int n = datos.Length;
int i = 0, m, j;
m = n - 1;
T = new float[n - 1, n - 1];
Console.WriteLine("primeras diferencias divididas");
while (i <= m - 1)
{
T[i, 0] = (funciones[i + 1] - funciones[i]) / (datos[i + 1] -
datos[i]);
Console.WriteLine("{0 }", T[i, 0]);
i = i + 1;
}
j = 1;
while (j <= m - 1)
{
i = j;
Console.WriteLine();
Console.WriteLine("Diferencias divididas de orden {0}", j + 1);
while (i <= m - 1)
{
T[i, j] = (T[i, j - 1] - T[i - 1, j - 1]) / (datos[i + 1] -
datos[i - j]);
Console.WriteLine("{0}", T[i, j]);
i = i + 1;
}
j = j + 1;
}
// fin programa
for (int a = 0; a <= n - 2; a++)
{
for (int b = 0; b <= n - 2; b++)
{
Console.WriteLine("Elemento [" + b + ": " + a + " ] = " + T[b,
a]);
}
}
//Sacar El polinomio
String polinomio = "" + funciones[0];
for (int coef = 0; coef <= n - 2; coef++)
{
for (int contadorVariable = 0; contadorVariable <= coef - 1;
contadorVariable++)
{
if (datos[contadorVariable] >= 0)
{
polinomio = polinomio + "( x " + (-datos[contadorVariable])
+ ")";
}
else
{
polinomio = polinomio + "( x +" + (-datos[contadorVariable])
+ ")";
}
}
polinomio = polinomio + " + " + T[coef, coef];
}
Console.WriteLine(polinomio);
textBox2.Text = polinomio;
//prueba
float prueba = Convert.ToSingle(textBox1.Text);
float poli;
float poliprincipal = funciones[0];
for (int coef = 0; coef <= n - 2; coef++)
{
poli = T[coef, coef];
Console.WriteLine("poli eentrada:" + poli);
for (int contadorVariable = 0; contadorVariable <= coef ;
contadorVariable++)
{
poli = poli * (prueba + (-datos[contadorVariable]));
Console.WriteLine("poli es:" + poli);
}
poliprincipal = poliprincipal + poli;
Console.WriteLine("Resultado es asd:" + poliprincipal);
}
Console.WriteLine("Resultado es :" + poliprincipal);
textBox3.Text = Convert.ToString(poliprincipal);
CONCLUSIONES
La implementación del programa incidió positivamente en el desarrollo de los
problemas para los cuales se utiliza un programa para la interpolación a través del
método de diferencias divididas de Newton.
BIBLIOGRAFIA
http://www.dma.uvigo.es/~lino/Tema5.pdf
http://www3.fi.mdp.edu.ar/metodos/apuntes/diferencias%20divididas.pdf
Visual basic – grupo expeto Bucarelly.
Visual basic 2010 – Rafael Jesús Lozano.
ANEXOS