Está en la página 1de 12

ETSI de Topografía, Geodesia y Cartografía

POLINOMIOS DE INTERPOLACIÓN
Polinomios oscilantes: Polinomio de Lagrange
• Polinomio de interpolación de grado n
>>polyfit(x,y,n)
n −1
Corresponde al polinomio p ( x)= p1 x + p2 x + .... + pn x + pn +1
n

Ejemplo:
xi 0 1 2 3 4 5 6 7
yi 0 25 34 72 115 92 71 65

>> x=[0:7]; y=[0 25 34 72 115 92 71 65]; polyfit(x,y,7)


ans =
-0.1079 2.4944 -22.1222 93.9861 -195.3722 181.5194 -35.3976 -0.0000
En este caso
p( x) =
−0.1079     2.4944 
x7 + x 6 − 22.1222  
x5 +93.9861x 4 − 195.3722x 3 +1 81.5194 x 2 − 35.3976x

• Evaluar en un punto particular x0


>> polyval(ans,x0)
>> polyval(ans,2.5)
ans =
47.3867
• Para representar los puntos y el polinomio
>> p=polyfit(x,y,7);
>> hold on
% Mantiene los ejes igual y se añade la gráfica
>> xx=0:0:7;
yy=polyval(p,xx);
plot(x,y,'*',xx,yy)
% Dibujo:
120

100

80

60

40

20

-20
0 1 2 3 4 5 6 7

U. D. de Matemáticas de la ETSITGC 15
ETSI de Topografía, Geodesia y Cartografía

Polinomios oscilantes: Polinomio de Hermite


• Polinomio de interpolación de grado n
• Para programar con MatLab hay que escribir un fichero con las instrucciones
necesarias. Para ello abrimos el editor con los siguientes pasos:
File>>>New>>>M-File, o bien, New Script
Ya podemos escribir las instrucciones:
function hp = hermite (x, y, yp)
n = length (x);
z = zeros (1, 2*n);
f = zeros (1, 2*n);
z(1:2:2*n-1) = x;
z(2:2:2*n) = x;
f(1) = y(1);
f(3:2:2*n-1) = (y(2:n) - y(1:n-1) ) ./ ( x(2:n) - x(1:n-1));
f(2:2:2*n) = yp;
for i = 3:2*n
f(i:2*n) = (f(i:2*n) - f(i-1:2*n-1) ) ./ ( z(i:2*n) - z(1:2*n-i+1));
end;
hp = zeros (1, 2*n);
p = [1];
for i = 1:2*n
hp = hp + f(i) * [zeros(1,2*n-i) p];
p = conv (p, [1 -z(i)]);
end;
% x: abscisas de los puntos a interpolar
% y: ordenadas de los puntos a interpolar
% yp: derivadas de los puntos a interpolar
% hp: coeficientes del polinomio de Hermite
% conv: convolución de dos vectores. Algebraicamente, la convolución es la misma
operación que la multiplicación de los polinomios cuyos coeficientes son los elementos
de los dos vectores.
w=con(u,v)
w(1) = u(1)*v(1)
w(2) = u(1)*v(2)+u(2)*v(1)
w(3) = u(1)*v(3)+u(2)*v(2)+u(3)*v(1)
...
w(n) = u(1)*v(n)+u(2)*v(n-1)+ ... +u(n)*v(1)
Si m es la longitud de u y n la longitud de v, entonces m+n-1 es la longitud de w.

Una vez guardado el archivo con el nombre de la función, escribimos los datos:
Ejemplo:
x 0 1 3
f (x) 1 5 -17
f ’(x) 3 5 -15

U. D. de Matemáticas de la ETSITGC 16
ETSI de Topografía, Geodesia y Cartografía
>> x=[0 1 3]; y=[1 5 -17]; yp=[3 5 -15];
hp=hermite(x,y,yp)
hp =
1 -6 9 -3 3 1
En este caso p ( x) = x − 6  9x
x + − 3x +3 x + 1
5 4 3 2

• Para representar los puntos y el polinomio


>> xx=[0:0.1:3];
yy=polyval(hp,xx);
plot(x,y,'*',xx,yy')

10

-5

-10

-15

-20
0 0.5 1 1.5 2 2.5 3

U. D. de Matemáticas de la ETSITGC 17
ETSI de Topografía, Geodesia y Cartografía

INTERPOLACIÓN POLINÓMICA SEGMENTARIA:


SPLINES CÚBICOS
• Spline “no nodo”
>> spline (x, y)
% Genera un registro llamado polinomio segmentario que, entre otros campos,
consta de uno que contiene los coeficientes de todos los polinomios del spline en
una matriz de dimensiones n x 4, ps.coefs
Ejemplo:
xi 0 1 2 3 4 5 6 7
yi 0 25 34 72 115 92 71 65

>> x=[0:7]; y=[0 25 34 72 115 92 71 65]; pp=spline (x, y)


ans =
form: 'pp'
breaks: [0 1 2 3 4 5 6 7]
coefs: [7x4 double]
pieces: 7
order: 4
dim: 1
% La evaluación del spline en puntos concretos se efectúa con ppval, que es el
análogo de polyval para polinomios
>>ppval (spline (x, y), xi).
>> ppval(spline(x,y),2.5)
ans =
48.8484
% Si sólo interesan los valores que tome el spline en ciertos puntos xi, se utiliza
la misma función en la forma: yi = spline (x, y, xi).
>> spline(x,y,2.5)
ans =
48.8484
% La matriz que contiene los coeficientes del spline.
>> pp.coefs
ans =

9.5319 -36.5957 52.0638 0


9.5319 -8.0000 7.4681 25.0000
-2.6595 20.5957 20.0638 34.0000
-22.8939 12.6172 53.2767 72.0000
23.2352 -56.0646 9.8293 115.0000
-2.0470 13.6411 -32.5941 92.0000
-2.0470 7.5000 -11.4530 71.0000
% Dibujo:
>> xx=0:0.2:7;
zz=spline(x,y,xx);
plot(x,y,'*',xx,zz)

U. D. de Matemáticas de la ETSITGC 18
ETSI de Topografía, Geodesia y Cartografía

120

100

80

60

40

20

0
0 1 2 3 4 5 6 7

• Spline “completo”:
Se calcula con la misma función que se utiliza para el spline “no nodo”, añadiendo al vector
“y” dos valores, uno al principio y otro al final, que son los valores de la derivada primera
del spline en los puntos inicial y final, a=S’(x0) y b=S’(xn), respectivamente. Sintaxis:
spline (x, [a y b]).
Ejemplo:
Se consideran los valores de la función y = arc tg x en los nodos x = -3, -2, …, 2, 3.
Interpolar estos puntos mediante un spline cúbico cuya derivada primera en los extremos
coincida con la derivada primera de la función.
1
y' ( x ) = ⇒ y' (−3) = 0.1, y' (3) = 0.1
1+ x2
x0 x1 x2 x3 x4 x5 x6
-3 -2 -1 0 1 2 3
>> x=-3:3;
>> y=atan(x);
>> ps=spline(x,[0.1 y 0.1]);
Los coeficientes de cada pieza del spline están dados en la siguiente matriz:
>> ps.coefs
ans =
-0.0011 0.0430 0.1000 -1.2490
0.0994 0.0397 0.1827 -1.1071
-0.1126 0.3378 0.5602 -0.7854
-0.1126 -0.0000 0.8980 0
0.0994 -0.3378 0.5602 0.7854
-0.0011 -0.0397 0.1827 1.1071

U. D. de Matemáticas de la ETSITGC 19
ETSI de Topografía, Geodesia y Cartografía
Dibujamos la función (trazo continuo rojo) y el polinomio segmentario (trazo discontinuo
verde):
1.5

>> xx=-3:0.1:3; 0.5

>> yy=ppval(ps,xx);
0
>> plot(x,y,'*',xx,atan(xx))
-0.5
>> hold on
>> plot(x,y,'*',xx,yy,'--') -1

-1.5
-3 -2 -1 0 1 2 3

• Spline cúbico natural o con frontera libre:


x=input('Ingrese Los valores de x [x0 ...xf] : ');
y=input('Ingrese Los valores de y [y0 ...yf] : ');
if length(y)~=length(x)
disp ('x e y no son de la misma longitud');
end
n = length(x)-1;
h = x(2:n+1)-x(1:n);
a=y;
for i=1:n l(i)=(a(i+1)-a(i))/h(i);
end
l(n+1)=0;
% revisar si es necesario
for i=2:n
m(i)=3*(l(i)-l(i-1));
end
% introducir condiciones de frontera
m(1)=0;
%condición inicio de frontera
m(n+1)=0;
%condición fin de frontera
% Armando matriz A
A(1,1) = 1;
for i=2:n
A(i,i-1:i+1) = [h(i-1) 2*(h(i-1)+h(i)) h(i)];
end
A(n+1,n+1) = 1;
c=(A\m')';
for i=1:n b(i)=l(i)-h(i)*(2*c(i)+c(i+1))/3;
end

U. D. de Matemáticas de la ETSITGC 20
ETSI de Topografía, Geodesia y Cartografía
for i=1: n
d(i)=(c(i+1)-c(i))/(3*h(i));
end
X=sym('X');
for i=1:n
s(i)=a(i)+b(i)*(X-x(i))+c(i)*(X-x(i))^2+d(i)*(X-x(i))^3;
end
% gráfica
figure(1)
grid on
plot(x,y,'o','MarkerSize',10,'MarkerEdgeColor','b','MarkerFaceColor','b')
for i=1:n
figure(2)
grid on
xx=x(i):1/100:x(i+1);
ezplot(s(i),xx)
hold on
end
axis([min(x) max(x) min(y) max(y)])
% diff(int(s(1)))
% Mostrar datos
x,y,A,h,l,m,a,b,c,d
% Para mostrar las ecuaciones interpoladoras
for i=1:n
disp('-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-__-_-_-_-_-_-')
disp('entre xi y xf:'),
x(i),x(i+1)
pretty((expand((vpa(s(i),5)))))
% decimales significativos
end
Ejemplo:
>> x=[2 2.7 3.8 6 8 10 13 16 18 21 25 30 36];
y=[5 7.8 9 10 10.2 10.3 10.4 14.5 15 15.4 15.5 14 5];
x=
2.0000 2.7000 3.8000 6.0000 8.0000 10.0000 13.0000 16.0000
18.0000 21.0000 25.0000 30.0000 36.0000
y=
5.0000 7.8000 9.0000 10.0000 10.2000 10.3000 10.4000 14.5000
15.0000 15.4000 15.5000 14.0000 5.0000
A=
1.0000 0 0 0 0 0 0 0 0 0 0 0 0
0.7000 3.6000 1.1000 0 0 0 0 0 0 0 0 0 0
0 1.1000 6.6000 2.2000 0 0 0 0 0 0 0 0 0
0 0 2.2000 8.4000 2.0000 0 0 0 0 0 0 0 0
0 0 0 2.0000 8.0000 2.0000 0 0 0 0 0 0 0
0 0 0 0 2.0000 10.0000 3.0000 0 0 0 0 0 0
0 0 0 0 0 3.0000 12.0000 3.0000 0 0 0 0 0

U. D. de Matemáticas de la ETSITGC 21
ETSI de Topografía, Geodesia y Cartografía
0 0 0 0 0 0 3.0000 10.0000 2.0000 0 0 0 0
0 0 0 0 0 0 0 2.0000 10.0000 3.0000 0 0 0
0 0 0 0 0 0 0 0 3.0000 14.0000 4.0000 0 0
0 0 0 0 0 0 0 0 0 4.0000 18.0000 5.0000 0
0 0 0 0 0 0 0 0 0 0 5.0000 22.0000 6.0000
0 0 0 0 0 0 0 0 0 0 0 0 1.0000
h=
0.7000 1.1000 2.2000 2.0000 2.0000 3.0000 3.0000 2.0000
3.0000 4.0000 5.0000 6.0000
l=
4.0000 1.0909 0.4545 0.1000 0.0500 0.0333 1.3667 0.2500
0.1333 0.0250 -0.3000 -1.5000 0
m=
0 -8.7273 -1.9091 -1.0636 -0.1500 -0.0500 4.0000 -3.3500
-0.3500 -0.3250 -0.9750 -3.6000 0
a=
5.0000 7.8000 9.0000 10.0000 10.2000 10.3000 10.4000
14.5000 15.0000 15.4000 15.5000 14.0000 5.0000
b=
4.5791 2.8418 0.3193 0.3096 0.0672 -0.1282 0.8655 0.8662
0.0190 0.1309 -0.0277 -0.8453
c=
0 -2.4819 0.1888 -0.1932 0.0720 -0.1697 0.5009 -0.5007
0.0771 -0.0398 0.0001 -0.1637 0
d=
-1.1819 0.8093 -0.0579 0.0442 -0.0403 0.0745 -0.1113 0.0963
-0.0130 0.0033 -0.0109 0.0091
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
2
ans =
2.7000
5.2970 - 9.6037 X - 1.1819 X3 + 7.0914 X2
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
2.7000
ans =
3.8000
-33.895469730000000 + 33.94366970000 X2 - 9.0373110 X3 + 0.80931 X
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
3.8000
ans =
6

U. D. de Matemáticas de la ETSITGC 22
ETSI de Topografía, Geodesia y Cartografía
13.688863360000000000 - 3.62292160000000 X2 + 0.8486320000 X3 -
0.057880 X
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
6
ans =
8
-8.359696 + 7.401318 X - 0.988738 X2 + 0.044196 X3
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
8
ans =
10
34.888592 - 8.816765 X + 1.038521 X2 - 0.040273 X3
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
10
ans =
13
-79.896000 + 25.618450 X - 2.405000 X2 + 0.074511 X3
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
13
ans =
16
328.30798 - 68.58244 X + 4.84123 X2 - 0.11129 X3
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
16
ans =
18
-521.952108 + 90.841314 X - 5.122754 X2 + 0.096293 X3
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
18
ans =
21
115.340056 - 15.373988 X + 0.778096 X2 - 0.012982 X3
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =

U. D. de Matemáticas de la ETSITGC 23
ETSI de Topografía, Geodesia y Cartografía
21
ans =
25
-35.6780720 + 6.2000590 X - 0.2492420 X2 + 0.0033250 X3
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
25
ans =
30
186.90038750 - 20.50933800 X + 0.81913342 X2 - 0.010920 X3
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_¬_-_-_-_-_-_-
entre xi y xf:
ans =
30
ans =
36
-353.4432000 + 33.5248900 X - 0.9820040 X2 + 0.0090926 X3
16

14

12

10

4
0 5 10 15 20 25 30 35 40

88630835302628377/2251799813685248-...+5241523402050519/576460752303423488 (X-30)3

15

14

13

12

11

10

5
5 10 15 20 25 30 35
X

U. D. de Matemáticas de la ETSITGC 24
ETSI de Topografía, Geodesia y Cartografía

Polinomio de Newton
clear;clc;
disp('métodos numéricos');
disp('interpolación');
n=input('ingrese el grado del polinomio, n=');
fprintf('Se necesitan %.0f puntos\n',n+1);
disp('ingrese los puntos');
for i=1:n+1
fprintf('x%.0f=',i-1);
X(i)=input(' ');
fprintf('y%.0f=',i-1);
Y(i)=input(' ');
end
DD=zeros(n+1);
DD(:,1)=Y;
for k=2:n+1
for J=k:n+1
DD(J,k)=[DD(J,k-1)-DD(J-1,k-1)]/[X(J)-X(J-k+1)];
end
end
disp('La matriz de diferencias divididas es:');
disp(DD);
disp('El polinomio de Newton es');
syms x;
polnew=DD(1,1);
P=1;
for i=1:n
P=P*(x-X(i));
polnew=polnew+P*DD(i+1,i+1);
end
polnew=expand(polnew);
pretty(polnew);
x=input('ingrese el valor de x a interpolar,x=');
vi=eval(polnew);
fprintf('el valor interpolado es %.2f\n',vi);
hold on;
ezplot(polnew,[X(1) X(n+1)]);
plot(x,vi,'r+');

Ejemplo:
xi 0 1 2 3 4 5 6 7
yi 0 25 34 72 115 92 71 65
métodos numéricos
interpolación
ingrese el grado del polinomio, n=7

U. D. de Matemáticas de la ETSITGC 25
ETSI de Topografía, Geodesia y Cartografía
Se necesitan 8 puntos
ingrese los puntos
x0= 0
y0= 0
x1= 1
y1= 25
x2= 2
y2= 34
x3= 3
y3= 72
x4= 4
y4= 115
x5= 5
y5= 92
x6= 6
y6= 71
x7= 7
y7= 65
La matriz de diferencias divididas es:
0 0 0 0 0 0 0 0
25.0000 25.0000 0 0 0 0 0 0
34.0000 9.0000 -8.0000 0 0 0 0 0
72.0000 38.0000 14.5000 7.5000 0 0 0 0
115.0000 43.0000 2.5000 -4.0000 -2.8750 0 0 0
92.0000 -23.0000 -33.0000 -11.8333 -1.9583 0.1833 0 0
71.0000 -21.0000 1.0000 11.3333 5.7917 1.5500 0.2278 0
65.0000 - 6.0000 7.5000 2.1667 -2.2917 -1.6167 -0.5278 -0.1079
El polinomio de Newton es
14867 35167 65347 6767 1991 449 34
- -------- x - -------- x + -------- x + ------ x - ------ x + ----- x6
3 2 4 5
- ---- x7
420 180 360 72 90 180 315
ingrese el valor de x a interpolar, x=2.5
el valor interpolado es 47.39
-14867/420 x-35167/180 x 3+65347/360 x 2+...-34/315 x 7

120

100

80

60

40

20

0 1 2 3 4 5 6 7
x

U. D. de Matemáticas de la ETSITGC 26

También podría gustarte