Está en la página 1de 10

EJERCICIOS DE INTERPOLACIN

Ejercicio 1:
POLINOMIO DE LAGRANGE
Encontrar el polinomio de grado 3 que cumple p(1)=1, p(2)=1, p(3)=2,
p(4)=6.
x=[1, 2, 3, 4]
y=[1; 1; 2; 6]
vander(x)
x= 1 2 3 4

y= 1
1
2
6

ans = 1 1 1 1
8 4 2 1
27 9 3 1
64 16 4 1

Obtenemos la solucin del sistema vander(x)*p=y mediante la 'divisin


izquierda'. Para hacer esta divisin el vector y debe ser un vector columna.

p=vander(x)\y

p = 0.3333
-1.5000
2.1667
0.0000

Representamos el polinomio p evalundolo en los valores del vector xd

xd=[0:0.1:5];
yd=polyval(p,xd);
plot(xd,yd)
Para observar grficamente el polinomio de interpolacin representaremos
los datos de interpolacin (los vectores x e y) mediante crculos, y
representaremos el polinomio p mediante los vectores xd e yd.

plot(x,y,'o',xd,yd)

Ejercicio 2:
Diferencias divididas
A continuacin vamos a construir con Matlab la tabla de diferencias
divididas de una funcin en unos nodos x(0), x(1), ..., x(N-1), x(N). (Ref: Diez
lecciones de Clculo Numrico. J. M. Sanz Serna.) (Ref: Numerical methods
using Matlab. J. H. Mathews y K. D. Fink.)
Construiremos una tabla como la que se muestra, donde xN-1 es el nodo
x(N-1), xN-2 el nodo x(N-2), etc.
x0 f[x0]
x1 f[x1] f[x0,x1]
x2 f[x2] f[x1,x2] f[x0,x1,x2]
. . . . .
. . . . .
. . . . .
xN f[xN] f[xN-1,xN] f[xN-2,xN-1,xN] ... f[x0,...,xN]

Definimos los nodos, N y los valores de la funcin.

nodos=[1 2 3 4];
N=length(nodos)-1;
fnodos=[1, 1, 2, 6];
Inicializamos una matriz con NaN.

M=NaN(N+1,N+2);
% Rellenamos la primera columna
M(:,1)=nodos;
% Rellenamos la segunda columna
M(:,2)=fnodos;

Calcularemos las diferencias divididas de orden i=2, 3, ..., N+1 que


colocaremos en la columna i+1 de la matriz.
for i=2:N+1
% Las diferencias divididas de orden i comienzan en la fila i y acaban
% en la fila N+1.
for j=i:N+1
%
% Reproducimos una parte de la matriz M, necesaria para hallar el elemento
% M(j,i+1)
%
% M(j-i+1,1) M(j-i+1,2)
% .
% .
% .
% M(j-1,i)
% M(j,1) . . . . . M(j,i) M(j,i+1)
%
% Puede comprobarse que siguiendo el elemento M(j-i+1,2) en diagonal
(esto
% es, sumando i-2 al indice de las filas y de las columnas) se llega al
% elemento M(j-1,i) .

M(j,i+1)=(M(j,i) - M(j-1,i)) / (M(j,1) - M(j-i+1,1) );


end
end

La matriz M contiene la tabla de diferencias divididas.

M
M=

1.0000 1.0000 NaN NaN NaN


2.0000 1.0000 0 NaN NaN
3.0000 2.0000 1.0000 0.5000 NaN
4.0000 6.0000 4.0000 1.5000 0.3333

Ejercicio 3:

Forma de Newton
Con las diferencias divididas calculadas podemos construir el polinomio de
interpolacin en la forma de Newton, donde xN-1 es el nodo x(N-1): P(x)
=f[x0] + f[x0,x1]*(x-x0) + f[x0,x1,x2]*(x-x0)*(x-x1) + ... + f[x0,x1,...,xN]*(x-
x0)*(x-x1)* ... *(x-xN-1) .

En primer lugar veremos como construir el polinomio q(x)=(x-x0)*(x-x1)* ...


*(x-xN) a partir de los valores x=[x0, x1, x2, ..., xN]. Usaremos un
acumulador de producto, que comenzar valiendo el polinomio constante
[1], y le iremos multiplicando los monomios (x-xj) que se expresan en forma
de vectores como [1, -xj].

q=[1];
for i=2:N+1
monomio=[1, -nodos(i-2+1)]
q=conv(q,monomio)
end

monomio = 1 -1

q= 1 -1

monomio = 1 -2

q= 1 -3 2

monomio = 1 -3

q= 1 -6 11 -6

Sin embargo, la forma de Newton se expresa mediante una suma de


polinomios, cuyos sumandos son los polinomios q que se calculan en el
bucle, multiplicados por la correspondiente diferencia dividida. Observe en
el siguiente bucle cmo la forma de Newton se calcula mediante un
acumulador de suma.

newton=[fnodos(1)];
q=[1];
for i=2:N+1
monomio=[1, -nodos(i-2+1)]
q=conv(q,monomio)
newton=[0, newton] + M(i,i+1)*q
end

monomio = 1 -1
q= 1 -1

newton = 0 1

monomio = 1 -2

q= 1 -3 2

newton = 0.5000 -1.5000 2.0000

monomio = 1 -3

q= 1 -6 11 -6

newton = 0.3333 -1.5000 2.1667 0

Ejercicio 4:

x=[0.97 1.12 2.92 3.00 3.33 3.97 6.10 8.39 8.56 9.44];
y=[2.58 0.43 0.06 5.74 7.44 8.07 6.37 2.51 1.44 0.52];
n=length(x); %nmero de pares de datos
%A=vander(x);
A=zeros(n); %lneas equivalentes a utilizar vander(x)
for j=1:n
A(:,j)=(x').^(n-j);
end
p=A\y'; %sistema de ecuaciones lineales, y' es vector columna

p=polyfit(x,y,n-1) %n-1 es el grado del polinomio


xx=linspace(0.97,9.44,50); %interpolacin
yy=polyval(p,xx);
hold on
plot(x,y,'o','markersize',4,'markerfacecolor','r')
plot(xx,yy,'b')
xlabel('x')
ylabel('y')
title('Interpolacin de Lagrange');
hold of

Corremos el script interpola-1 en la ventana de comandos, obtenemos un


aviso, los coeficientes del polinomio y la representacin grfica de los datos
y del polinomio que pasa por dichos puntos.

p = 1.0e+004 *
0.0000 -0.0003 0.0057 -0.0595 0.3782 -1.4951 3.6430 -5.2142
3.9256 -1.1823
Ejercicio 5:
EJERCICIOS DE ECUACIONES NO LINEALES

Ejemplo 1:
xf(1)=input('Ingrese el valor inicial: ');
tol=input('Ingrese el porcentaje de error: ');
syms x;
f=input('Ingrese la funcin f(x), despejada g(f(x)): ');

i=1;
ea(1)=100;
while abs(ea(i))>=tol,
xf(i+1) = subs(f,x,xf(i));
ea(i+1) = abs((xf(i+1)-xf(i))/xf(i+1))*100;
i=i+1;
end
fprintf('i xf(i) Error aprox (i) \n');
for j=1:i;
fprintf('%2d \t %11.7f \t %7.3f \n',j-1,xf(j),ea(j));
end

Ejercicio 2:
% y = -x^2 + x + 0.5
% y + 5xy = x^2
%function

f= @(x) ...
[ -x(1)^2+x(1)+0.5-x(2) ;...
x(2)+5*x(1)*x(2)-x(1)^2 ];
%jacobian
J= @(x) ...
[ -2*x(1)+1 -1 ;...
5*x(2)-2*x(1) 1+5*x(1) ];
%initial guess:
x=[1.2; 1.2];
tol = 10e-9;
maximum_iter = 100;

% Newton?Raphson method for multidimensional methods


iter = 0;
error=1;
while (error>tol & iter<maximum_iter)
xold = x;

x = x - J(x)\f(x);
error = norm(x-xold)/norm(x);
iter = iter+1;
end
x_newton_raphson = x
Ejercicio 3:

fx(1)=input('Ingrese el intervalo inferior: ');


fx(2)=input('Ingrese el intervalo superior: ');
tol=input('Ingrese el porcentaje de error: ');
syms x;
f=input('Ingrese la funcin: ');

f1=subs(f,x,fx(1));
f2=subs(f,x,fx(2));
ea(1)=100;

i=1;
j=2;

while abs(ea(i))>=tol
xf(j+1)=(xf(j-1)*f2-xf(j)*f1)/(f2-f1); f1=f2; f2=subs(f,x,xf(j+1));
ea(i+1)=(xf(j+1)-xf(j))/xf(j+1)*100;
j=j+1;
i=i+1;
end

fprintf(' i xf(i) Error aprox (i) \n');


%fprintf('%2d\t%11.7f\t\n',0,x(1));
for k=2:j;
fprintf('%2d\t%11.7f\t%7.3f\n',k-1,xf(k),ea(k-1));
end

Ejercicio 4:

xai=input('Ingrese el intervalo inferior: ');


xbi=input('Ingrese el intervalo superior: ');
tol=input('Ingrese el porcentaje de error: ');
syms x;
f=input('Ingrese la funcin: ');
i=1;

f1=subs(f,x,xai);
f2=subs(f,x,xbi);

ea(i)=100;
if f1*f2 < 0
xa(i)=xai; f1=subs(f,x,xa(i));
xb(i)=xbi; f2=subs(f,x,xb(i));
xr(i)=(xa(i)+xb(i))/2; f3=subs(f,x,xr(i));

fprintf('It. Xa Xr Xb Error aprox \n');


fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \n',i,xa(i),xr(i),xb(i));
while abs(ea(i)) >= tol,
if f1*f3<0
xa(i+1)=xa(i);f1=subs(f,x,xa(i+1));
xb(i+1)=xr(i);f2=subs(f,x,xb(i+1));
end
if f1*f3> 0
xa(i+1)=xr(i);f1=subs(f,x,xa(i+1));
xb(i+1)=xb(i);f2=subs(f,x,xb(i+1));
end
xr(i+1)=(xa(i+1)+xb(i+1))/2; f3=subs(f,x,xr(i+1));
ea(i+1)=abs((xr(i+1)-xr(i))/(xr(i+1))*100);
fprintf('%2d \t %11.7f \t %11.7f \t %11.7f \t %7.3f \n',...
i+1,xa(i+1),xr(i+1),xb(i+1),ea(i+1));
i=i+1;
end
else
fprintf('No existe una raz en ese intervalo');
end

Ejercicio 5:

Sea la funcin: x3 + 4x2 10 = 0 tiene una raz en [1, 2]


Puede despejarse en:
a. x = g1(x) = x x3 4x2 +10
b. x = g2(x) = (10 x3)
c. x = g3(x) = (10/(4 + x))
d. x = g4(x) = x (x3 + 4x2 10)/(3x2 + 8x)

(a) (d) (b) (c)

1 1.5 1.5 1.5 1.5


2 -0.8751.3733333331.2869537 1.34839972
1.36526201467
3 6.732421875 4
4 1.3652300131.4025408 1.36737637
1.36523001303
-469.72001200 1
5 1.02754555E8 1.3454583 1.36495701
6 74 5
-1.084933870E2 1.3751702 1.36526474
4 52 8
7 1.3600941 1.36522559
1.277055591E7 92 4
2 1.3678469 1.36523057
8 67 5
-2.082712908E2 1.3638870 1.36522994
16 03 1
9 NaN 1.3659167 1.36523002
10 33 2
11 1.3648782 1.36523001
12 17 2
13 1.3654100 1.36523001
14 61 3
15 1.3651378 1.36523001
20 20 3
25 1.3652772
30 08
1.3652058
50
1.3652423
83
1.3652295
78
1.3652300
28
1.3652300
12

También podría gustarte