Métodos de Neville y Aitken
Una de las dificultades de la interpolación de Lagrange, es que el error es difícil (o imposible) de calcular. La forma habitual de trabajar es ir incrementando el orden de los polinomios, hasta que se obtiene un valor deseado. Sin embargo, cada cálculo es independiente del previo, perdiéndose contacto entre uno y otro. Los polinomios de Legendre también se pueden generar aprovechando los cálculos previos, en forma iterativa.
Calcularemos, usando los valores dados en table.dat, los polinomios de Lagrange de distinto orden y con distinta combinaciones de puntos adyacentes, para x=1.5. Llamaremos Pi,j,k(x) al polinomio de Lagrange de orden 2, que pasa por los puntos adyacentes x=xi, x=xj y x=xk. Se puede demostrar que el polinomio de Lagrange que pasa por los puntos adyacentes x=xi, x=xj, x=xk y x=xl se obtiene haciendo:
(x-xi)Pjkl - (x-xl)Pijk
P(x)(:htl:)<center>
<script type="text/javascript"><!--
google_ad_client = "pub-8555952394632395";
google_ad_width = 300;
google_ad_height = 250;
google_ad_format = "300x250_as";
google_ad_type = "text_image";
google_ad_channel = "";
google_color_border = "ffffff";
google_color_bg = "ffffff";
google_color_link = "000000";
google_color_url = "990000";
google_color_text = "000000";
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js
"></script>
<script type="text/javascript"><!--
google_ad_client = "pub-8555952394632395";
google_ad_width = 300;
google_ad_height = 250;
google_ad_format = "300x250_as";
google_ad_type = "text_image";
google_ad_channel = "";
google_color_border = "ffffff";
google_color_bg = "ffffff";
google_color_link = "000000";
google_color_url = "990000";
google_color_text = "000000";
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js
"></script>
</center>(:htend:) = Pijkl(x) = ---------------------------
(xl-xk)
Por ejemplo:
(r-x1)P2 - (r-x2)P1
P12(r) = -----------------------------
( x2 - x1 )
en el caso de r=1.5 :
(1.5 - 1.0)0.6200860 - (1.5 - 1.3)0.7651977
P12(1.5) = ---------------------------------------------- = 0.5233449
( 1.3 - 1.0 )
o
(1.5 - 1.3)0.4554022 - (1.5 - 1.6)0.6200860
P23(1.5) = ---------------------------------------------- = 0.5102968
( 1.6 - 1.3 )
@] y en orden mas elevado:
(1.5 - 1.0)0.5102968 - (1.5 - 1.6)0.5233449
P123(1.5) = ---------------------------------------------- = 0.5124715
( 1.6 - 1.0 )
Escribiendo los polinomios Pijkl en una matriz A
x1 A11
x2 A21 A22
x3 A31 A32 A33
x4 A41 A42 A43 A44
x5 A51 A52 A53 A54 A55
el algoritmo de Neville se puede simplificar en el siguiente esquema:
Interpolación de la función f(x) dada en n puntos x1, x2, … ,xn
INPUT: xi en el array X(i) y f(xi) en la matriz A(i,1)
• Paso 1: For i=2,...,n • for j=2,...,i • (x-xi-j+1)Ai,j-1 - (x-xi)Ai-1,j-1 • Ai,j = ------------------------------------ • xi - xi-j+1 • • Paso 2: Output A•
PROGRAMA DE AIKTEN DE JAVA
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.math.BigDecimal;
public class Aitken extends JFrame
{
//GUI
private JLabel tituloLabel, x0Label, datoTolLabel, aLabel, bLabel;
private JTextField x0Campo, datoTolCampo, aCampo, bCampo;
private JButton comenzarBoton, limpiarBoton, ayudaBoton;
private JTextArea salidaArea;
private JScrollPane desplazador;
//DATOS
private BigDecimal x0;
private BigDecimal pn;
private BigDecimal pnMas1;
private BigDecimal pnMas2;
private BigDecimal qn;
private BigDecimal A;
private BigDecimal B;
private BigDecimal tolerancia;
public Aitken()
{
super("Programa que utiliza el metodo de Aitken.");
Container contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
x0Label = new JLabel("X0");
contenedor.add( x0Label );
x0Campo = new JTextField( 10 );
contenedor.add( x0Campo );
datoTolLabel = new JLabel("TOLERANCIA: .5 X 10");
contenedor.add( datoTolLabel );
datoTolCampo = new JTextField( 10 );
contenedor.add( datoTolCampo );
aLabel = new JLabel("A");
contenedor.add( aLabel );
aCampo = new JTextField( 10 );
contenedor.add( aCampo );
bLabel = new JLabel("B");
contenedor.add( bLabel );
bCampo = new JTextField( 10 );
contenedor.add( bCampo );
salidaArea = new JTextArea( 20,60 );
salidaArea.setFont( new Font( "Monospaced", Font.PLAIN, 12) );
salidaArea.setEditable( false );
desplazador = new JScrollPane( salidaArea );
contenedor.add( desplazador );
comenzarBoton = new JButton("Comenzar");
comenzarBoton.addActionListener(
new ActionListener()//Clase interna anonima
{
public void actionPerformed( ActionEvent evento )
{
//Valida entrada, si resive false algo en la entrada esta mal else continua.
if( validaEntrada() == false )
System.out.println("Error en la entrada" );
else
{
//Construir X0,A,B
x0 = new BigDecimal( x0Campo.getText() );
A = new BigDecimal( aCampo.getText() );
B = new BigDecimal( bCampo.getText() );
int n = 1; //Iteraciones
String salida = "n\t Xn\t g(Xn)\t |Xn-g(Xn)|\n";
salida += "----------------------------------------------------\n";
//Asignamos 10 cifras significativas
x0 = x0.setScale( 10,x0.ROUND_HALF_DOWN );
A = A.setScale( 10,A.ROUND_HALF_DOWN );
B = B.setScale( 10,B.ROUND_HALF_DOWN );
tolerancia = calculaTolerancia( Integer.parseInt( datoTolCampo.getText() ));
tolerancia = tolerancia.setScale( 10,tolerancia.ROUND_HALF_DOWN );
//Calcular 3 Pn
pn = PN( x0 );
pnMas1 = PN( pn );
pnMas2 = PN( pnMas1 );
pn = pn.setScale( 10,pn.ROUND_HALF_DOWN );
pnMas1 = pnMas1.setScale( 10,pnMas1.ROUND_HALF_DOWN );
pnMas2 = pnMas2.setScale( 10,pnMas2.ROUND_HALF_DOWN );
qn = QN();
qn = qn.setScale( 10,qn.ROUND_HALF_DOWN );
}
}
}
);
contenedor.add( comenzarBoton );
limpiarBoton = new JButton("Limpiar");
limpiarBoton.setEnabled( false );
limpiarBoton.addActionListener(
new ActionListener()//Clase interna anonima
{
public void actionPerformed( ActionEvent evento )
{
}
}
);
contenedor.add( limpiarBoton );
ayudaBoton = new JButton("Ayuda");
ayudaBoton.addActionListener(
new ActionListener()//Clase interna anonima
{
public void actionPerformed( ActionEvent evento )
{
String salida = "APLICACION PARA OBTENER LA RAIZ CUADRADA\n\n\n" ;
salida += "1) Recive un valor para X y un valor para Q\n\n";
salida+= "2) X puede tener como maximo la siguiente forma: 9999999999.999999\n";
salida += "tambien puede ser asi 9999999999 \n\n";
salida += "3) Q puede tener como la maximo la siguiente forma: 9999999999.999999\n";
salida += "tambien puede ser asi 9999999999.\n\n";
salida += "4) Esta aplicacion tiene 6 cifras significativas, por lo tanto los resultados son con 6 digitos como decimales\n\n";
salida += "5) El programa puede recibir digitos con 6 digitos como decimales, si tiene mas marcara una esepcion.\n";
JOptionPane.showMessageDialog( null, salida, "Ayuda",
JOptionPane.INFORMATION_MESSAGE );
}
}
);
contenedor.add( ayudaBoton );
//Configuracion ventana
setSize( 520,510 );
setVisible( true );
setResizable( false );
}//Fin contructor
//Funcion que evalua Pn( x )
// pn( xn ) = A/B * E ala -x
private BigDecimal PN( BigDecimal x )
{
BigDecimal xTmp;
BigDecimal division;
BigDecimal resultado;
BigDecimal eAlaX;
double x2;
division = new BigDecimal( 0 );
division = division.setScale( 10,division.ROUND_HALF_DOWN );
division = A.divide( B, division.ROUND_HALF_DOWN );
xTmp = x.negate( );
xTmp = xTmp.setScale( 10,xTmp.ROUND_HALF_DOWN );
x2 = xTmp.doubleValue();
eAlaX = new BigDecimal( Math.exp( x2 ) );
eAlaX = eAlaX.setScale( 10,eAlaX.ROUND_HALF_DOWN );
resultado = division.multiply( eAlaX );
resultado = resultado.setScale( 10,resultado.ROUND_HALF_DOWN );
resultado = resultado.negate();
return resultado;
}//fin PN()
// pn -( ( pn+1 - pn )ALA2) / (pn+2 - pn+1 + pn ) )
private BigDecimal QN()
{
BigDecimal resultado = new BigDecimal( 0 );
//Parte 1
BigDecimal resta = pnMas1.subtract( pn ) ;
resta = resta.pow( 2 );
//Parte 2
BigDecimal suma = pnMas2.subtract( pnMas1 );
suma = suma.add( pn );
//Division
BigDecimal division = new BigDecimal( 0 );
division = resta.divide( suma, division.ROUND_HALF_DOWN );
resultado = pn.subtract( division );
return resultado;
}
//Funcion ke calcla la tolerancia. .5 X 10 a la -n
private BigDecimal calculaTolerancia( final int n )
{
double valor = .5 * Math.pow( 10,-1 * n );
BigDecimal t = new BigDecimal( valor );
return t;
}//Fin funcion calcularTolerancia()
//Funcion que permite validar la entrada, devueve un false en caso de un error
private boolean validaEntrada( )
{
boolean validos = true;
//Leer datos de las campos de la ventana.
String x0Cadena, datoTolCadena, aCadena, bCadena;
x0Cadena = x0Campo.getText();
datoTolCadena = datoTolCampo.getText();
aCadena = aCampo.getText();
bCadena = bCampo.getText();
//VALIDAR ENTRADA DE DATOS
if( setX0( x0Cadena ) == false )
{
validos = false;
JOptionPane.showMessageDialog( null, "X0 contiene dato invalido!!", "ERROR",
JOptionPane.ERROR_MESSAGE );
}
if( setDatoTol( datoTolCadena ) == false )
{
validos = false;
JOptionPane.showMessageDialog( null, "Tolerancia contiene dato invalido!!", "ERROR",
JOptionPane.ERROR_MESSAGE );
}
if( setA( aCadena ) == false )
{
validos = false;
JOptionPane.showMessageDialog( null, "A contiene dato invalido!!", "ERROR",
JOptionPane.ERROR_MESSAGE );
}
if( setB( bCadena ) == false )
{
validos = false;
JOptionPane.showMessageDialog( null, "B contiene dato invalido!!", "ERROR",
JOptionPane.ERROR_MESSAGE );
}
return validos;
}//Fin de funcion validaEntrada()
//Funcion que valida el X0. EJEMPLO: 99, .99 99 99 99 99
private boolean setX0( String dato )
{
boolean valido = true;
//Validar x0
//valida ke sea un expresion de punto flotante 9999999999.999999
if( !( dato.matches( "\\d{1,1}[.]\\d{1,10}") ) )
//Valida ke sean puros digitos. 9999999999
if( !( dato.matches( "\\d{1,1}") ) )
valido = false;
return valido;
}//Fin funcion setX0()
//Funcion que valida el exponente de la .5 X 10 a la n sea valido. EJEMPLO: 1 a 5
private boolean setDatoTol( String dato )
{
boolean valido = true;
//Validar x0
//Valida ke sean puros digitos. 9
if( !( dato.matches( "\\d{1,1}") ) )
valido = false;
return valido;
}//setDatoTol()
//Funcion que valida el a. EJEMPLO: 999, -999, 999.99 99 99 99 99, -999.99 99 99 99 99
private boolean setA( String dato )
{
boolean valido = false;
//Validar x0
//Valida +999
if( dato.matches( "\\[+]d{1,3}") )
valido = true;
else
//Valida -999
if( dato.matches( "\\[-]d{1,3}") )
valido = true;
else
//Valida ke sean puros digitos. 999
if( dato.matches( "\\d{1,3}") )
valido = true;
else
//Valida +999.99 99 99 99 99
if( dato.matches( "\\[+]d{1,3}[.]//d{1,10}") )
valido = true;
else
//Valida -999.99 99 99 99 99
if( dato.matches( "\\[-]d{1,3}[.]//d{1,10}") )
valido = true;
else
//valida ke sea un expresion de punto flotante 999.99 99 99 99 99
if( dato.matches( "\\d{1,3}[.]\\d{1,10}"))
valido = true;
return valido;
}//Fin funcion setA()
private boolean setB( String dato )
{
boolean valido = false;
//Validar x0
//Valida +999
if( dato.matches( "\\[+]d{1,3}") )
valido = true;
else
//Valida -999
if( dato.matches( "\\[-]d{1,3}") )
valido = true;
else
//Valida ke sean puros digitos. 999
if( dato.matches( "\\d{1,3}") )
valido = true;
else
//Valida +999.99 99 99 99 99
if( dato.matches( "\\[+]d{1,3}[.]//d{1,10}") )
valido = true;
else
//Valida -999.99 99 99 99 99
if( dato.matches( "\\[-]d{1,3}[.]//d{1,10}") )
valido = true;
else
//valida ke sea un expresion de punto flotante 999.99 99 99 99 99
if( dato.matches( "\\d{1,3}[.]\\d{1,10}"))
valido = true;
//Validar que sea diferente de 0
if( valido == true )
{
double datoTmp = Double.parseDouble( dato );
if( datoTmp == 0 )
{
System.out.println( "B es zero " );
valido = false;
}
}
return valido;
}//Fin funcion setB()
public static void main( String args[] )
{
Aitken aplicacion = new Aitken();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
}//Fin de la clase
Competencias Digitales (Tic’s Basicas) a practicar con este TEMA:
- Usar (click en )www.Google.com para buscar y localizar UN material academico apropiado y que se pueda recomendar para el tema, ver VIDEO BUSQUEDAS abajo en esta pagina.
- En el post ( o tema ) apropiado en el Libro de Blogger, pegar el material localizado y que se recomienda para este tema, ver VIDEO BLOGGER abajo en esta pagina.
pd: Recordar incluir la fuente del tema usando el formato de citacion apropiado, ver VIDEO WIKIPEDIA abajo en esta pagina.
- En el editor de Blogger usar colores para destacar los parrafos mas importantes y usar subrayados para las citas mas relevantes.
- En el post ( o tema ) apropiado en el libro en Blogger, para incluir ecuaciones o notacion matematica se debera usar el icono del editor de Blogger IMAGE y construir esta notacion matematica con imagenes Latex, ver VIDEO LATEX ABAJO.
- Construir al final y despues de la fuente del material, un breve resumen ( no mas de 2–3 parrafos) explicando palabras propias el contenido del tema.
pd: Se pueden usar alguna de las citas que encontradas dentro del tema, solo recordar encerrarla entre comillas.
pd: Se pueden usar tambien cambios en fonts para darle mas visibilidad, consistencia y relevancia al resumen del tema.
- PUNTOS EXTRAS Si se usa una segunda fuente valiosa de informacion y recordar encadenar los dos materiales mediante uno o dos parrafos apropiados.
- Enviar a el maestro o compañeros un correo electronico que incluya la liga a el tema en blogger para revision, recomendacion, sugerencias y evaluacion, ver VIDEO LIGAS GMAIL abajo.
- Sacar una cuenta (click en)http://docs.google.com, usando el correo de Gmail y tratar de conseguir el mismo usuario que se construyo en Gmail y Blogger ver VIDEO GOOGLE DOCS abajo en esta pagina.
pd: Si ya se tiene una cuenta ignorar esta competencia digital.
pd: Google Docs es el equivalente a OFFICE pero con la caracteristica que todos sus componentes ( procesador de palabras, presentacion electronica y hoja de calculo) estan completamente en internet, es decir todos los archivos o material estaran en linea, seguros y siempre disponibles, ademas de que se pueden trabajarlos desde cualquier pc, ya sea la personal, la del laboratorio de la escuela o la de un lugar publico como la biblioteca o un cafe internet.
- Construir una Presentacion Electronica ( usando muy pocos slides) del tema en GOOGLE DOCS e incrustrarla en el tema de bloger ver VIDEO GOOGLE DOCS en esta pagina abajo.
pd: Recordar que una presentacion electronica, es solamente un resumen muy condensado del tema ( o mapa o guia mental ), que ayuda a recordar los elementos y conceptos mas basicos del tema, cuando se estan exponiendo frente a un grupo.
pd: No olvidar incluir un primer slide con el titulo de la presentacion electronica, un segundo slide con un indice de la presentacion electronica y un ultimo slide con dos o tres parrafos de conclusiones y bibliografia.
- Buscar en Google Imagenes o www.Flickr.com o www.PhotoBucket.com una galeria de fotos o de imagenes apropiadas al tema actual,
- Para los casos de Photobucket y Flicker, ambos sitios proporcionan ligas a sus imagenes y tambien objetos (los recuerdan??), que se pueden incluir en el tema del libro apropiado en Blogger.
pd: para estos sitios deberan obtener una cuenta usando el correo de gmail y de preferencia obtener el mismo usario que se ha venido manejando a lo largo del curso.
pd: Tratar de usar resoluciones y tamaños de imagenes chicos o medianos, recordar que todo este material termina en el post del tema en Blogger y esa pagina no tiene mucho espacio para desplegar fotos o imagenes.
pd: El formato apropiado para fotos o imagenes es JPG, tratar de no usar otros formatos.
pd: Se puede construir y conseguir esta coleccion o galeria de imagenes con:
1) Usando Google Imagenes, recordar conseguir solo imagenes que tengan permiso de publicacion abierto, no usar imagenes o fotos que tengan derechos reservados.
pd: Estas fotos almacenarlas en un folder en el desktop o escritorio de su computadora y subirlas a el post en blogger usando el icono IMAGE del editor de Blogger.
2) Flickr y Photo Bucket tambien tienen una gran cantidad de imagenes que se pueden usar o mejor dicho enlazar a el tema o post en Blogger.
3) Tambien se puede usar la camaras digitales o las camaras de sus telefonos celulares.
4) Tambien se puede usar el programa o aplicacion llamado Srip32.exe( solo buscar srip32 en google) bajarlo e instalarlo, este programa permite capturar una pantalla de la pc, es decir si se encuentra un sitio con imagenes o incluso texto apropiado o relevante al tema, capturar la pantalla con srip32 y ya se tendra la imagen, ver VIDEO Srip32 abajo.
- Incluir al menos una imagen de cada uno de los dos sitios (flickr y Photobucket) en el tema o post que se esta construyendo en Blogger.
- PUNTOS EXTRAS Si se incluyen una galeria completa de imagenes apropiadas desde cualquiera de estos sitios de FLICKR o Photobucket.
- Sacar una cuenta (click en)www.DivShare.com, usando el correo de Gmail y tratar de conseguir el mismo usuario que se consiguio en Gmail y Blogger y Flickr ver VIDEO DIVSHARE abajo en esta pagina.
pd: Si ya se tiene una cuenta ignorar esta competencia digital.
pd: Usar Divshare para almacenar material en audio (MP3) apropiado a el tema ( no usarlo para almacenar material comercial o les suspenden la cuenta)
pd: El material en Audio, con formato MP3 se debera producir usando un microfono en la pc y programas de aplicacion apropiados, llamados editores de audio, un ejemplo de ellos es el SOUND RECORDER que ya viene en Windows, pero se recomienda usar mejor AUDACITY ( solo buscar en google AUDACITY) bajarlo e instalarlo, ver VIDEO AUDACITY abajo.
- Crear al menos dos archivos de audio mp3:
1) El primero de ellos sera la lectura completa de este tema en voz apropiada. ( o aprender a editar con audacity la voz)
2) El segundo de ellos sera un resumen del tema. ( buena voz o editarla con audacity)
3) Ambos archivos subirlos a Div Share (recordor que tienen que ser MP3) y el reproductor que proporciona gratis Div Share, ver VIDEO DIVSHARE abajo e insertarlo en el lugar apropiado del tema que se esta construyendo en Blogger.
4) Ejemplo del reproductor incrustado en una pagina:
- Sacar una cuenta (click en)www.YouTube.com, usando el correo de Gmail y tratar de conseguir el mismo usuario que se consiguio en Gmail y Blogger y Flickr.
pd: Si ya se tiene una cuenta ignorar esta competencia digital.
- Para producir video se pueden usar tres fuentes:
1) Localizar Videos apropiados en Youtube.
2) Usar nuestras camaras digitales o nuestros telefonos celulares para producir video.
3) Producir un video de la propia pantalla de la computadora ( muy similar a lo que se hizo con Srip32) pero usando un programa especializado en video, tal como CAMSTUDIO (click en www.CamStudio.org) bajar e instalar ( no olvidar bajar e instalar el CODEC que esta abajo en el mismo sitio.
3.1) para Usar Camstudio solo recordar que es muy similar a Srip32 Solo que el resultado final es un archivo de video AVI.
- Producir un video de resumen del tema (usar camstudio con el fondo de la pagina con el tema e irlo comentando en voz apropiada)
- Producir un video en vivo con la exposicion del tema ( pueden usar la presentacion electronica de fondo o cualquier otro material, pizarron, filminas, rotafolios, etc.)
- Subir los videos a su cuenta en Youtube e incluirlos o ligarlos en la pagina en Blogger, tambien los pueden subir directamente a BLOGGER ver VIDEO BLOGGER VIDEO abajo.
Saludos y suerte prof Lauro Soto, Ensenada, BC, Mexico.