Algoritmo de interpolación
01 Interpolación polinomial de Lagrange
Y luego obtén el polinomio lagrangiano:
Resolución de Matlab : no hay una función de resolución incorporada en matlab , debe implementarla usted mismo.
function f = Language(x,y,x0)
syms t;
if(length(x) == length(y))
n = length(x);
else
disp('x和y的维数不相等!');
return;
end %检错
f = 0.0;
for i = 1:n
l = y(i);
for j = 1:i-1
l = l*(t-x(j))/(x(i)-x(j));
end
for j = i+1:n
l = l*(t-x(j))/(x(i)-x(j)); %计算拉格朗日基函数
end
f = f + l; %计算拉格朗日插值函数
simplify(f); %化简
if(i==n)
if(nargin == 3)
f = subs(f,'t',x0); %计算插值点的函数值
else
f = collect(f); %将插值多项式展开
f = vpa(f,6); %将插值多项式的系数化成6位精度的小数
end
end
end
end
Ejemplo (e01) : utilice la interpolación polinomial de Lagrange para calcular los datos
x=-5:0.2:5;
y=-3*x.^2+2*x+x.^3-2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;
x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
tic
yl=Language(x,y,2.3);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;
resultado:
>> e01
时间已过 35.958879 秒。
理论值:7.3130,实际值-1.1030
02 Interpolación del método de Newton
Entonces puedes obtener:
function f = Newton(x,y,x0)
syms t;
if(length(x) == length(y))
n = length(x);
c(1:n) = 0.0;
else
disp('x和y的维数不相等!');
return;
end
f = y(1);
y1 = 0;
l = 1;
for(i=1:n-1)
for(j=i+1:n)
y1(j) = (y(j)-y(i))/(x(j)-x(i));
end
c(i) = y1(i+1);
l = l*(t-x(i));
f = f + c(i)*l;
simplify(f);
y = y1;
if(i==n-1)
if(nargin == 3)
f = subs(f,'t',x0);
else
f = collect(f); %将插值多项式展开
f = vpa(f, 6);
end
end
end
x=-5:0.2:5;
y=3*x+2*x.^2-x.^3+2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;
x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
tic
yl=Newton(x,y,2.3);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;
resultado:
>> e02
时间已过 16.260375 秒。
理论值:7.3130,实际值7.3130
03 interpolación lineal por partes
Implementación de Matlab : use la función y = interp1 (x, y, x0, 'método')
método especifica el método de interpolación, el valor predeterminado es la interpolación lineal. Su valor puede ser:
interpolación del término más cercano ' más cercano'
interpolación lineal 'lineal'
'spline' pieza a pieza interpolación de tercera spline
'cubic' conserva la convexidad y la convexidad de la 3ª interpolación.
Todos los métodos de diferencia requieren que x0 sea monótono.
Ejemplo (e03) : utilice la interpolación lineal por partes para calcular los datos
x=-5:0.2:5;
y=3*x+2*x.^2-3*x.^3+2*x.^4+2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;
x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
tic
yl=interp1(x,y,2.3);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;
resultado:
>> e03
时间已过 0.025925 秒。
理论值:7.3130,实际值39.3952
04 Interpolación de Emil
Definición: Si no solo se requiere que una función de interpolación tenga el mismo valor que la función en el nodo, sino que también se requiere que tenga el mismo valor derivado de primer, segundo o incluso mayor orden con la función, este es el problema de interpolación de Hermite . cual es:
El polinomio de interpolación de Emilt es:
Matlab no tiene una función de Hermite lista para usar, debe escribirla manualmente: Hermite
Ejemplo (e04) : utilice la interpolación de Emilt para calcular los datos
function f = Hermite(x,y,y_1,x0)
syms t;
f = 0.0;
if(length(x) == length(y))
if(length(y) == length(y_1))
n = length(x);
else
disp('y和y的导数的维数不相等!');
return;
end
else
disp('x和y的维数不相等!');
return;
end
for i=1:n
h = 1.0;
a = 0.0;
for j=1:n
if( j ~= i)
h = h*(t-x(j))^2/((x(i)-x(j))^2);
a = a + 1/(x(i)-x(j));
end
end
f = f + h*((x(i)-t)*(2*a*y(i)-y_1(i))+y(i));
if(i==n)
if(nargin == 4)
f = subs(f,'t',x0);
else
f = vpa(f,6);
end
end
end
x=-5:0.2:5;
y=3*x+5*x.^2-4*x.^3+2*x.^5+2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;
x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
y01=3+4*x0-9*x0.^2-8*x0.^3;
tic
y1=Hermite(x,y,y01,x0);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;
resultado:
>> e04
y和y的导数的维数不相等!
时间已过 0.071891 秒。
理论值:7.3130,实际值39.3952
05 interpolación spline
Definición: En matemáticas, un polinomio a trozos con cierta suavidad se llama función spline.
Definición de función spline de segundo orden:
Se define la función 3 spline:
La función spline de tercer orden en Matlab :
y = interp1 (x0, y0, x, 'spline') ;
y = spline (x0, y0, x) ;
pp = csape (x0, y0, conds) ,y = ppval ( pp, x ) 。
Se recomienda la función csape .
pp = csape (x0, y0) : utilice las condiciones de contorno predeterminadas, es decir, las condiciones de contorno de Lagrange . = PP csape (X0, yO, conds) en conds condiciones de contorno interpolación especificada, cuyo valor puede ser:
El límite 'completo' es la primera derivada, que es la condición de límite predeterminada
condición de no nudo ' no un nudo'
condición de período 'periódico'
El "segundo" límite es la segunda derivada, y el valor de la segunda derivada es [0, 0] .
'variacional' establece el valor de la segunda derivada del límite en [0,0] .
Ejemplo (e05) : La forma de la parte a procesar se dada por un conjunto de datos ( x, y ) de acuerdo con los requisitos del proceso (en el caso de un avión) Al procesar con una máquina fresadora controlada por programa, cada herramienta sólo puede. Ir muy pequeña en los x y Y direcciones Un paso, que requiere la obtención de coordenadas ( x, y ) con un pequeño paso requerido para procesar a partir de datos conocidos . Los datos xey dados en la tabla están ubicados en la línea de contorno inferior de la sección del ala Se asume que se requiere la coordenada y cuando la coordenada x cambia en 0.1 . Intente completar los datos de procesamiento, dibuje la curva y encuentre la pendiente de la curva en x = 0 y el valor mínimo de y en el rango de 13≤x≤15 . Requisitos para LAGRANGE , interpolación lineal por partes y spline cúbico: tres tipos de métodos de cálculo.
0 |
3 |
5 |
7 |
9 |
11 |
12 |
13 |
14 |
15 |
0 |
1.2 |
1,7 |
2.0 |
2.1 |
2.0 |
1.8 |
1.2 |
1.0 |
1,6 |
x0=[0 3 5 7 9 11 12 13 14 15];
y0=[0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6];
x=0:0.1:15;
y1=Language(x0,y0,x); %调用前面编写的Lagrange插值函数
y2=interp1(x0,y0,x);
y3=interp1(x0,y0,x,'spline');
pp1=csape(x0,y0); y4=ppval(pp1,x);
pp2=csape(x0,y0,'second'); y5=ppval(pp2,x);
fprintf('比较一下不同插值方法和边界条件的结果:\n')
fprintf('x y1 y2 y3 y4 y5\n')
xianshi=[x',y1',y2',y3',y4',y5'];
fprintf('%f\t%f\t%f\t%f\t%f\t%f\n',xianshi')
subplot(2,2,1), plot(x0,y0,'+',x,y1), title('Lagrange')
subplot(2,2,2), plot(x0,y0,'+',x,y2), title('Piecewise linear')
subplot(2,2,3), plot(x0,y0,'+',x,y3), title('Spline1')
subplot(2,2,4), plot(x0,y0,'+',x,y4), title('Spline2')
dyx0=ppval(fnder(pp1),x0(1)) %求x=0处的导数
ytemp=y3(131:151);
index=find(ytemp==min(ytemp));
xymin=[x(130+index),ytemp(index)]
%% 结果分析
%可以看出,拉格朗日插值的结果根本不能应用,分段线性插值的光滑性较差(特别
%是在 14 = x 附近弯曲处),建议选用三次样条插值的结果。
resultado:
Comparación de varios métodos de interpolación: https://blog.csdn.net/f2157120/article/details/80371214