Interpolación: funciones

Informática. Ajuste. Lagrange: polinomio. Programa

  • Enviado por: El remitente no desea revelar su nombre
  • Idioma: castellano
  • País: España España
  • 4 páginas
publicidad
publicidad

APROXIMACIÓN DE FUNCIONES DISCRETAS (Ajuste de Funciones)

FUNCIÓN DE INTERPOLACIÓN

Será una función que pasará exactamente por los puntos que optendremos como datos, tal y como se representa en la siguiente gráfica:

P(x)

P2

P4

P1

P3

a b

Este tipo de funciones se utilizan en temas relacionados con el control, debido a que minimizo el error en un punto concreto (error mínimo puntual).

INTERPOLACIÓN DE LAGRANGE

Queremos optener una función P(x) que pase por los puntos que tenemos.

Pn(xi) = yi

En un principio , nos centraremos en allar una función de primer grado: P1(x)

P1(x) = a0 +a1x

y0 = a0 +a1x0

y1 = a0 + a1x1 ! a0 = ( y1- a0) / x1

a1 = ( y1-y0) / (x1-x0)

P1(x) = (x-x1)y0/(x0-x1) - (x-x0)y1/(x1-x0) !

P1(x) = L0y0 + L1y1 Polinomio de 1º de Lagrange

Generalizando dicha función para un grado `n' obtendríamos lo siguiente:

n

Pn(x) =  Li(x) yi

i=0

n

Li(x) =  (x-xj) / (xi-xj)

j=0

j"i

!

POLINOMIO DE LAGRANGE

Para el cálculo de dicho polinomio utilizaremos el siguiente programa:

program int_lagrange;

type

lista=array [1..10] of real;

var

lista1,lista2,lista3:lista;

punto,i:integer;

valor:real;

procedure introducir_datos (var lista1,lista2:lista;punto:integer);

var

punto1,punto2:real;

i:integer;

begin

for i:=1 to punto do

begin

writeln ('Introduce el valor de X',i-1,':');

readln (punto1);

lista1 [i]:=punto1;

writeln ('Introduce el valor de Y',i-1,':');

readln (punto2);

lista2 [i]:=punto2;

end;

end;

procedure calcular (var lista3:lista;lista1,lista2:lista;punto:integer;valor:real);

var

i,j:integer;

cal,cal1,resultado:real;

begin

for i:=1 to punto do

begin

cal:=1;

cal1:=1;

for j:=1 to punto do

if (j<>i) then

begin

cal:=cal*(valor-(lista1 [j]));

cal1:=cal1*(lista1 [i]-lista1 [j]);

end;

lista3 [i]:=cal/cal1;

end;

resultado:=0.0;

for i:=1 to punto do

resultado:=resultado+(lista3 [i]*lista2 [i]);

writeln ('EL RESULTADO ES: ',resultado);

end;

begin

writeln ('Introduce la cantidad de puntos:');

readln (punto);

writeln ('Introduce el valor donde quieres realizar el calculo:');

readln (valor);

introducir_datos (lista1,lista2,punto);

calcular (lista3,lista1,lista2,punto,valor);

end.

Para probar el funcionamiento del programa introduciremos los siguientes ejemplos logrando resultados satisfactorios:

EJEMPLO 1:

i

0

1

2

xi

2

2.5

3

F(xi) = yi

0.69315

0.91629

1.09861

Realizando el cálculo para: X = 2.3

RESULTADO = 0.8319324

EJEMPLO 2:

i

0

1

2

3

xi

0

0.1

0.3

0.6

F(xi) = yi

1.00000

1.10517

1.34986

1.82212

Realizando el cálculo para: X = 0.14

RESULTADO = 1.15025136

El intervalo [a,b] contiene todos los ordenados Xi ,además, la f(x) y todas sus derivadas hasta (n+1) son sus continuas. El error cometido al reemplazar f(x) por P(x) de grado n para cualquier valor X en [a,b].

|f(x) - Pn(x)| " (x-x0)(x-x1)... (x-xn)f(n+1)()/(n+1)!

Tomando  como el caso más desfavorable. (  " [a,b] )

Siguiendo con el EJEMPLO 1 ,el calculo del error se realizaría del siguiente modo:

|lnx - P2(x)| = (x-2)(x-2.5)(x-3) f '''() / 3!

X = 2.3 ! |lnx - P2(x)| = (2.3-2)(2.3-2.5)(2.3-3) 2 / 3 3! =

= 0.00175

Teniendo en cuenta que el peor caso es : x0= 2 ( x " [a,b] )