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