Interpolación: funciones

Anuncio
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
ab
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
1
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);
2
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
3
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
xi
F(xi) = yi
0
2
0.69315
1
2.5
0.91629
2
3
1.09861
Realizando el cálculo para: X = 2.3
RESULTADO = 0.8319324
EJEMPLO 2:
i
xi
F(xi) = yi
0
0
1.00000
1
0.1
1.10517
2
0.3
1.34986
3
0.6
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! =
= 0.00175
4
Teniendo en cuenta que el peor caso es : x0= 2 ( x " [a,b] )
5
Descargar