CÁLCULO NUMÉRICO (521230)

LABORATORIO 4 - 2017-2

Interpolación

Contents

EJERCICIO 1

1.1 Calcule con ayuda del comando polyfit los polinomios que mejor ajustan por mínimos cuadrados los datos en la tabla.

clc; close all; clear all
x = [-2;-1;0;1;2];
fx = [-25;-4;-1;8;47];

p_1 = polyfit(x,fx,1);
p_2 = polyfit(x,fx,2);
p_3 = polyfit(x,fx,3);
p_4 = polyfit(x,fx,4);
p_5 = polyfit(x,fx,5);
Warning: Polynomial is not unique; degree >= number of data points. 

1.2 Por cada uno de los polinomios determinados antes, grafique, en una misma figura, al polinomio evaluado en 100 puntos entre -2 y 2 y los puntos en la tabla.

k = linspace(-2,2,100);
figure
hold on
plot(x,fx,'bx','MarkerSize',15);
plot(k,polyval(p_1,k),'r');
plot(k,polyval(p_2,k),'g');
plot(k,polyval(p_3,k),'b');
plot(k,polyval(p_4,k),'m');
plot(k,polyval(p_5,k),'y');
hold off
legend('datos','$p_1$','$p_2$','$p_3$','$p_4$','$p_5$','location','Northwest');

1.3 Haga un nuevo gráfico con los puntos en la tabla y el polinomio q(x) evaluado en 100 puntos entre -2 y 2.

figure
q = [1 0 -1 3 6 -1];
hold on
plot(x,fx,'rx');
plot(k,polyval(q,k),'b');
hold off
legend('datos','$q(x)$');

EJERCICIO 2

Considere f(x) = ln(x)

2.1 Determine, mediante el comando polyfit de MATLAB un polinomio que interpole a f en los puntos 1,2,3. Escoja el grado de este polinomio de forma que su existencia y unicidad estén aseguradas.

clc;clear all;close all
x = [1; 2; 3];
fx = log(x);
P = polyfit(x,fx,2);

2.2 Grafique, en un mismo gráfico, a la función f y al polinomio calculado, evaluados en 200 puntos entre 1 y 3. Recuerde que puede utilizar el comando polyval para evaluar al polinomio..

k = linspace(1,3,200);
figure
hold on
plot(k,log(k),'r');
plot(k,polyval(P,k),'b');
plot(x,fx,'x');
hold off
legend('$\log(x)$','$p(x)$');

2.3 Grafique, en un mismo gráfico, los valores $|f(x_i) - p(x_i)|$ y

$$\frac{1}{3!} \max_{x \in [1,3]} |f'''(x)| |(x_i-1)(x_i-2)(x_i-3)|$$

con $x_i = 1 + ih, \quad i = 0,1,2,\ldots,100$, $h = \frac{1}{50}$. ¿Se cumple la cota?

h = (1/50);
for i=0:100
    x(i+1) = 1 + i*h;
end
err = abs(log(x) - polyval(P,x));
cot = (1/factorial(3)) * max( abs(2 ./(x.^3)) ) * abs((x-1).*(x-2).*(x-3));

figure
hold on
plot(x,err,'r');
plot(x,cot,'b');
hold off
legend('Error','Cota');

EJERCICIO 3

3.1 Encuentre el polinomio que interpola a los datos en la tabla anterior, escoja el grado del mismo de forma que su existencia y unicidad estén garantizadas.

clc;clear all;close all
x = [0.9;1.3;1.9;2.1;2.6;3;3.9;4.4;4.7;5;6;7;8;9.2;10.5;11.3;11.6;12;12.6;13;13.3];
y = [1.3;1.5;1.85;2.1;2.6;2.7;2.4;2.15;2.05;2.1;2.25;2.3;2.25;1.95;1.4;0.9;0.7;0.6;0.5;0.4;0.25];
P = polyfit(x,y,20);
Warning: Polynomial is badly conditioned. Add points with distinct X values,
reduce the degree of the polynomial, or try centering and scaling as described
in HELP POLYFIT. 

3.2 Grafique, en un mismo gráfico, los puntos de interpolación y el polinomio antes determinado, evaluado en 100 puntos entre 0.9 y 13.3. ¿Cree usted que este polinomio proporcione una buena aproximación a la curva que se quiere aproximar?

k = linspace(0.9,13.3,100);
figure
hold on
plot(x,y,'bx','MarkerSize',12);
plot(k,polyval(P,k),'r');
title('Aproximaci\''on polinomial');

3.3 Determine, con ayuda del comando spline, un spline cúbico que interpole los pares de valores dados. Grafique nuevamente los valores en la tabla y el spline cúbico obtenido, evaluado en 100 puntos entre 0.9 y 13.3. ¿Se obtiene con éste una mejor aproximación al contorno superior del pato en la figura 1?

ss = spline(x,y,k);
figure
hold on
plot(x,y,'bx','MarkerSize',12);
plot(k,ss,'r');
hold off
title('Spline c\''ubico');

EJERCICIO 4

4.1 Encuentre el polinomio de grado menor o igual a 20 que interpola los pares ordenados en la tabla 2. Grafique los puntos en la tabla y el polinomio obtenido, evaluado en 200 puntos entre 0 y 10. ¿Es este polinomio una buena aproximación a la frontera superior del jardín?

clc;clear all;close all
x = (0:0.5:10)';
y = [2.5;2.8;3;3.3;3.8;4.8;4.8;5;4.8;4.7;4.7;4.5;4.5;4.4;4.3;4.4;4.2;4;4.1;4.3;3.5];
P = polyfit(x,y,20);
k = linspace(0,10,200);
figure
hold on
plot(x,y,'x','MarkerSize',12);
plot(k,polyval(P,k),'r');
hold off
Warning: Polynomial is badly conditioned. Add points with distinct X values,
reduce the degree of the polynomial, or try centering and scaling as described
in HELP POLYFIT. 

4.3 Llame a la función escrita antes para evaluar a un spline cúbico que interpole a la función en la tabla en 200 puntos entre 0 y 10. Añada al gráfico en 4.1 del spline calculado. ¿Describe esta función la frontera superior del jardín de mejor manera que el polinomio de interpolación?

hold on
v = linspace(0,10,200);
plot(v,lab3_ejer4_2(v),'g');
hold off
legend({'Datos','Polinomio Interpolante','Spline'},'location','southwest');

4.2 Escriba una función en MATLAB que dado un vector v de entrada, determine un spline cúbico $s$ que interpole los pares en la tabla y devuelva $s(\verb|v|)$.

function s = lab3_ejer4_2(v)
x = (0:0.5:10)';
y = [2.5;2.8;3;3.3;3.8;4.8;4.8;5;4.8;4.7;4.7;4.5;4.5;4.4;4.3;4.4;4.2;4;4.1;4.3;3.5];
spl = spline(x,y);
s = ppval(spl,v);
end