-
Notifications
You must be signed in to change notification settings - Fork 0
/
ProgramaInterpolacion.m
106 lines (91 loc) · 3.35 KB
/
ProgramaInterpolacion.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
% 1 Escribir un programa que calcule el polinomio de interpolación de Lagrange de una función en unos puntos dados
% mediante la fórmula de Newton, y que permita añadir nuevos puntos de interpolación (de uno en uno). Dibujar la función
% y el polinomio de interpolación obtenido. Hacer una versión que sirva para interpolar los valores de una tabla dibujando,
% en este caso, el polinomo de interpolación y los valores interpolados.
function ProgramaInterpolacion()
%Pedir puntos
vecp = input('Introduce un vector con los puntos a evaluar: ');
%Pedir tabla o funcion
ok = true;
while ok == true
opcion = input('Introduce f para funcion o t para tabla: ', 's');
if opcion == 'f'
ok = false;
fstr=input('Dame la función con ''x'' como variable: ','s');
fvec=vectorize(fstr);
f=eval(['@(x) ' fvec]);
figure
hold on
fplot(f, [min(vecp),max(vecp)]);
vecf = f(vecp);
[pol, prodAcum, vecp, vecf] = InterpolacionFuncion(vecp, vecf);
elseif opcion == 't'
ok = false;
vecf = input('Introduce un vector con la imagen de los puntos: ');
figure
hold on
[pol, prodAcum, vecp, vecf] = InterpolacionFuncion(vecp, vecf);
end
end
ok = true;
while ok == true
opcionp = input('Quieres introducir otro punto?:','s');
if opcionp == 's'
p = input('Introduce el punto: ');
if opcion == 'f'
figure
hold on
fplot(f, [min([vecp, p]),max([vecp, p])]);
[pol, prodAcum, vecp, vecf] = InterpolacionFuncionPunto(p, f(p), pol, prodAcum, vecp, vecf);
elseif opcion == 't'
fp = input('Introduce su imagen: ');
figure
hold on
[pol, prodAcum, vecp, vecf] = InterpolacionFuncionPunto(p, fp, pol, prodAcum, vecp, vecf);
end
elseif opcionp == 'n'
ok = false;
end
end
hold off
close ALL;
end
function [pol, prodAcum, vectp, fvectp] = InterpolacionFuncion(vectp, fvectp)
prodAcum = 1;
pol = fvectp(1);
%Actualizamos la tabla de diferencias divididas
for j = 1 : length(vectp) - 1
k = length(vectp) - j;
for i = 1 : k
fvectp(i) = (fvectp(i) - fvectp(i + 1))/(vectp(i) - vectp(i + j));
end
%Calculamos el polinomio acumulado mediante vectores
aux = prodAcum;
prodAcum = [prodAcum, 0];
prodAcum = prodAcum - [0, aux*vectp(j)];
pol = [0, pol] + fvectp(1)* prodAcum ;
end
x = linspace(min(vectp),max(vectp));
y = polyval(pol, x);
plot(x, y);
plot(vectp, polyval(pol, vectp), 'o')
end
function [pol, prodAcum, vectp, fvectp] = InterpolacionFuncionPunto(p, fp, pol, prodAcum, vectp, fvectp)
%Añadimos una nueva diagonal a la tabla, que en nuestro caso sera un ultimo
%elemento del vector
fvectp = [fvectp, fp];
vectp = [vectp, p];
%Subimos escalonadamente
for i = length(fvectp) - 1 : -1 : 1
fvectp(i) = (fvectp(i) - fvectp(i + 1))/(vectp(i) - vectp(end));
end
%Calculamos el polinomio acumulado mediante vectores
aux = prodAcum;
prodAcum = [prodAcum, 0];
prodAcum = prodAcum + [0, aux.*(-1*vectp(end - 1))];
pol = [0, pol] + fvectp(1).* prodAcum ;
x = linspace(min(vectp),max(vectp));
y = polyval(pol, x);
plot(x, y);
plot(vectp, polyval(pol, vectp), 'o')
end