Interpolacion de Splines

Anuncio
Universidad Mayor de San Andrés
Facultad de Ciencias Puras y Naturales
Carrera de Informática
INTERPOLACION DE SPLINES
INTEGRANTES:
OMAR E. ESTEBAN AVENDAÑO
JHOEL D. TAPIA TIRINA
INTERPOLACIÓN DE SPLINES
Llamada interpolación segmentaria o interpolación por splines. La idea central es
que en vez de usar un solo polinomio para interpolar los datos, podemos usar
segmentos de polinomios y unirlos adecuadamente para formar nuestra
interpolación.
Una función spline está formada por varios polinomios, cada uno definido en un
intervalo y que se unen entre si bajo ciertas condiciones de continuidad.
Definición. (Splines de grado k)
Dada nuestra tabla de datos
donde x0<x1<….<xn , y dado k un número entero positivo, S(x) una
función de interpolación spline de grado k, para la tabla de datos.
Condiciones que debe cumplir la función:
i)
s( xi )  yi , para toda i  0,1,, n .
ii)
sx es un polinomio de grado  k en cada subintervalo
iii )
sx tiene derivada contínua hasta de orden k  1 en
xi 1, xi  .
x0 , xn  .
FUNCIONES SPLINES CUBICAS
Para este caso (k=3).
Dados los n+1 datos:
Una spline cúbica que interpola estos datos, es una función S(x) definida
como sigue :
 s0  x  si
 s  x  si

s x    1


sn 1  x  si
x  x0 , x1 
x  x1 , x2 
x  xn 1 , xn 
si x  es un polinomio cúbico; si xi   yi , para toda
i  0,1,, n y tal que sx  tiene primera y segunda derivadas continuas en
x0 , xn  .
donde cada
Ejemplo
Interpolar los siguientes datos mediante una spline cúbica :
Solución.
Definimos un polinomio cúbico en cada uno de los intervalos que se forman:
 a x3  b x 2  c x  d1
s x    1 3 1 2 1
a2 x  b2 x  c2 x  d 2
si
si
x  2,3
x  3,5
A continuación, hacemos que se cumpla la condición de que la spline debe pasar
por los puntos dados en la tabla. Así, tenemos que:
s2  1  8a1  4b1  2c1  d1  1
s3  2  27a1  9b1  3c1  d1  2
s5  7  125a2  25b2  5c2  d2  7
Ahora calculamos la primera derivada de sx  :
 3a1 x 2  2b1 x  c1



s x 
2
3a 2 x  2b2 x  c2
si
si
x  2,3
x  3,5
Al igual que en el caso de las splines cuadráticas, se presentan ecuaciones
que pueden presentar discontinuidad en los cambios de intervalo; las
posibles discontinuidades son los puntos donde se cambia de intervalo, en
este caso x  3 . Para evitar esta discontinuidad, evaluamos
dos polinomios e igualamos:
3a1 3  2b1 3  c1  3a2 3  2b2 3  c2
2
2
o lo que es lo mismo:
27a1  6b1  c1  27a2  6b2  c2
x  3 en los
Análogamente procedemos con la segunda derivada :
 6a x  2b1
s  x    1
6a 2 x  2b2
si
si
x  2,3
x  3,5

Para lograr que s  x  sea continua :
6a1 3  2b1  6a2 3  2b2
18a1  2b1  18a2  2b2
En este punto contamos con 6 ecuaciones y 8 incognitas, por lo tanto
tenemos 2 grados de libertad; en general, se agregan las siguientes 2
condiciones:
s  x0   0
s  xn   0
De lo cual vamos a obtener:
s2  0  6a1 2  2b1  0
12a1  2b1  0
s5  0  6a2 5  2b2  0
 30a2  2b2  0
Con lo cual, hemos completado un juego de 8 ecuaciones vs. 8 incógnitas, el
cual es el siguiente:
8a1  4b1  2c1  d1  1
27a1  9b1  3c1  d1  2
27a 2  9b2  3c 2  d 2  2
125a 2  25b2  5c 2  d 2  7
27a1  6b1  c1  27a 2  6b2  c 2
18a1  2b1  18a 2  2b2
12a1  2b1  0
30a 2  2b2  0
Cuya forma matricial es la siguiente :
8
27

0

0
27

18
12

 0
4
2
1
0
0
9
3
1
0
0
0
0
0
27
9
0
0
0
125
25
6
1
0
 27
6
2
0
0
 18
2
2
0
0
0
0
0
0
0
30
2
0  a1    1 
0 0  b1   2 
3 1  c1   2 
   
5 1  d1   7 

 1 0   a2   0 
   
0 0  b2   0 
0 0  c2   0 
   
0 0 d 2   0 
0
De donde obtenemos la siguiente solución:
a1
b1
c1
d1
a2
b2
c2
d2

 1.25

7.5
  10.75

0.5

0.625
  9.375
 39.875
  50.125
Sustituyendo estos valores en nuestra función inicial, vemos que la spline cúbica
para la tabla de datos dada, queda definida como sigue:
  1.25x3  7.5 x 2  10.75x  0.5
si
s x   
3
2
0.625x  9.375x  39.875x  50.125 si
x  2,3
x  3,5
Mostramos la gráfica correspondiente a este ejemplo.
Obsérvese la finura con la que se unen los polinomios cúbicos que conforman a la
spline. Prácticamente ni se nota que se trata de dos polinomios diferentes!. Esto es
debido a las condiciones que se impusieron sobre las derivadas de la función. Esta
finura casi artística, es la que permite aplicar las splines cúbicas, para cuestiones
como el diseño de letras por computadoras, o bien a problemas de aplicación donde
la interpolación que se necesita es de un carácter bastante delicado, como podría
tratarse de datos médicos sobre algún tipo de enfermedad.
Codigo del Programa
%Primero hay que introducir el vecto X e Y
clear all
X=[40
45 50 55 60 65 70];
Y=[390 340 290 250 210 180 160];
N=length(X)-1;
H=diff(X);
E=diff(Y)./H;
diagsupinf=H(2:N-1);
diagprinc=2*(H(1:N-1)+H(2:N));
U=6*diff(E);
% restricciones del spline natural
Minicial=0; Mfinal=0;
% construccion de la matriz de los coeficientes para el calculo de los
% momentos
A=diag(diagprinc)+diag(diagsupinf,1)+diag(diagsupinf,-1);
% construccion del vector independiente para el calculo de los momentos
B=U'; B(1)=B(1)-H(1)*Minicial; B(N-1)=B(N-1)-H(N)*Mfinal;
% resolvemos el sistema y hallamos los momentos
M=A\B;
% añadimos los dos momentos naturales extremos y lo escribimos como vector
% fila
M=[Minicial,M',Mfinal];
% calculo de los coeficientes del polinomio cubico i-esimo en potencias
% de (x-x_i)
for i=1:N
S(i,1)=(M(i+1)-M(i))/(6*H(i));
S(i,2)=M(i)/2;
S(i,3)=E(i)-H(i)*(M(i+1)+2*M(i))/6;
S(i,4)=Y(i);
end
% creamos los polinomios para cada intervalo
syms x
for i=1:N
s=0;
for j=1:size(S,2)
s=s+expand(S(i,j)*(x-X(j))^(4-j));
end
Es(i,:)=s;
end
% Es(1)--->f1---> Intervalo X [40,45)
% Es(2)--->f2---> Intervalo X [45,50)
% Es(3)--->f3---> Intervalo X [50,55)
% Es(4)--->f4---> Intervalo X [55,60)
% Es(5)--->f5---> Intervalo X [60,65)
% Es(6)--->f6---> Intervalo X [65,70)
%dibujamos los polinomios
figure(gcf)
hold on
c='rgbcmk';
for i=1:length(X)-1
F=vectorize(inline(Es(i)));
plot(linspace(X(i),X(i+1)),F(linspace(X(i),X(i+1))),c(i),'linewidth',5)
%fplot(F,[X(i) X(i+1)],'r',);
end
plot(X,Y,'linewidth',5,'color',rand(1,3))
axis([X(1) X(end) -200 500])
grid on
hold off
Corrida
Descargar