Parte de interpolación
Uno: surge la pregunta
Dos: existencia y singularidad
Tres: interpolación de Lagrange
(1) El polinomio se puede expresar como:
(2) Estimación del error de interpolación
Análisis de ejemplo
Análisis: Hay cinco puntos en total. Obviamente use (xi, yi) para representar cada punto, y luego escriba cada l (x), y luego escriba p (x);
function yi=lagrcz(x,y,xi)
n=length(x);
m=length(xi);
for s=1:m
yi(s)=0;
for i=i:n
w(i)=1;
dw(i)=1;
for j=1:n
if(j~=i)
w(i)=(xi(s)-x(j))*w(i);
dw(i)=(x(i)-x(j))*dw(i);
end
end
yi(s)=y(i)*w(i)/dw(i)+yi(s);
end
end
Explicación: lagrcz (x, y, xi) es una función de interpolación, que se llama directamente.
Por ejemplo: p punto (1,0) q punto (0,2)
Estos dos puntos determinan una línea recta, por lo que cuando x = 2, y debería ser -2
El código es usar estos dos puntos para interpolar, y luego xi como x = 2 llamar a la verificación de la función.
Por ejemplo: (1,2) (3,5) (5,9) estos tres puntos deben escribirse como la entrada de la función:
x = [1,3,5]
y =[2, 5, 9]
a=lagrange(x,y)
interpolación de newton
(1) Definición de cociente de diferencias
(2) Fórmula de interpolación
(3) Tabla de cocientes de diferencias
ejemplo:
Código
%newton.m
%求牛顿插值多项式、差商、插值及其误差估计的MATLAB主程序
%输入的量:X是n+1个节点(x_i,y_i)(i = 1,2, ... , n+1)横坐标向量,Y是纵坐标向量,
%x是以向量形式输入的m个插值点,M在[a,b]上满足|f~(n+1)(x)|≤M
%注:f~(n+1)(x)表示f(x)的n+1阶导数
%输出的量:向量y是向量x处的插值,误差限R,n次牛顿插值多项式L及其系数向量C,
%差商的矩阵A
function[y,R,A,C,L] = newton(X,Y,x,M)
n = length(X);
m = length(x);
for t = 1 : m
z = x(t);
A = zeros(n,n);
A(:,1) = Y';
s = 0.0; p = 1.0; q1 = 1.0; c1 = 1.0;
for j = 2 : n
for i = j : n
A(i,j) = (A(i,j-1) - A(i-1,j-1))/(X(i)-X(i-j+1));
end
q1 = abs(q1*(z-X(j-1)));
c1 = c1 * j;
end
C = A(n, n); q1 = abs(q1*(z-X(n)));
for k = (n-1):-1:1
C = conv(C, poly(X(k)));
d = length(C);
C(d) = C(d) + A(k,k);%在最后一维,也就是常数项加上新的差商
end
y(t) = polyval(C,z);
R(t) = M * q1 / c1;
end
L = poly2sym(C)
ejemplo:
Ejemplo: Utilice la interpolación de Lagrange para encontrar el valor de sinx en un punto determinado y estimar su error. Se sabe que sin0 ° = 0, sin30 ° = 0.5, sin45 ° = 0.7071, sin60 ° = 0.8660, sin90 ° = 1.
Código
>> X = [0 pi/6 pi/4 pi/3 pi/2];
>> Y = [0 0.5 0.7071 0.8660 1];
>> x = linspace(0,pi,50);
>> M = 1;
>> [y,R,A,C,L] = newton(X, Y, x, M);
>> y1 = sin(x);
>> errorbar(x,y,R,'.g')
>> hold on
>> plot(X, Y, 'or', x, y, '.k', x, y1, '-b');
>> legend('误差','样本点','牛顿插值估算','sin(x)');
resultado:
Interpolación de Hermite
Caso:
%求埃尔米特多项式和误差估计的MATLAB主程序
%输入的量:X是n+1个节点(x_i,y_i)(i = 1,2, ... , n+1)横坐标向量,Y是纵坐标向量,
%以f'(x_i)=y'_i(i = 1,2,...,n+1)为元素的向量Y1;
%x是以向量形式输入的m个插值点,M在[a,b]上满足|f~(2n+2)(x)|≤M
%注:f~(2n+2)(x)表示f(x)的2n+2阶导数
%输出的量:向量y是向量x处的插值,误差限R,2n+1阶埃尔米特插值多项式H_k及其系数向量
%H_c,误差公式wcgs及其系数向量Cw.
function[y,R,Hc,Hk,wcgs,Cw] = hermite(X,Y,Y1,x,M)
n = length(X);
m = length(x);
for t = 1 : m
z = x(t);
H = 0;
q = 1;
c1 = 1;
for k = 1 : n
s = 0;
V = 1;
for i = 1 : n
if k ~= i
s = s + (1/(X(k)-X(i)));
V = conv(V,poly(X(i)))/(X(k)-X(i));
end
end
h = poly(X(k));
g = ([0 1]-2 * h * s);%注意不要写成1-2*h*s,因为是多项式减法,低阶多项式前面必须用零填补,书上的错误,浪费我一晚上时间
G = g * Y(k) + h * Y1(k);
H = H + conv(G,conv(V,V));%hermite插值多项式
b = poly(X(k));
b2 = conv(b,b);
q = conv(q,b2);
end
Hc = H;
Hk = poly2sym(H);
Q = poly2sym(q);
for i = 1 : 2*n
c1 = c1 * i;
end
wcgs = M * Q / c1;
Cw = M * q / c1;
y(t) = polyval(Hc,x(t));
R(t) = polyval(Cw,x(t));
end
%hermite.m
%求埃尔米特多项式和误差估计的MATLAB主程序
%输入的量:X是n+1个节点(x_i,y_i)(i = 1,2, ... , n+1)横坐标向量,Y是纵坐标向量,
%以f'(x_i)=y'_i(i = 1,2,...,n+1)为元素的向量Y1;
%x是以向量形式输入的m个插值点,M在[a,b]上满足|f~(2n+2)(x)|≤M
%注:f~(2n+2)(x)表示f(x)的2n+2阶导数
%输出的量:向量y是向量x处的插值,误差限R,2n+1阶埃尔米特插值多项式H_k及其系数向量
%H_c,误差公式wcgs及其系数向量Cw.
function[y,R,Hc,Hk,wcgs,Cw] = hermite(X,Y,Y1,x,M)
n = length(X);
m = length(x);
for t = 1 : m
z = x(t);
H = 0;
q = 1;
c1 = 1;
for k = 1 : n
s = 0;
V = 1;
for i = 1 : n
if k ~= i
s = s + (1/(X(k)-X(i)));
V = conv(V,poly(X(i)))/(X(k)-X(i));
end
end
h = poly(X(k));
g = ([0 1]-2 * h * s);%注意不要写成1-2*h*s,因为是多项式减法,低阶多项式前面必须用零填补,书上的错误,浪费我一晚上时间
G = g * Y(k) + h * Y1(k);
H = H + conv(G,conv(V,V));%hermite插值多项式
b = poly(X(k));
b2 = conv(b,b);
q = conv(q,b2);
end
Hc = H;
Hk = poly2sym(H);
Q = poly2sym(q);
for i = 1 : 2*n
c1 = c1 * i;
end
wcgs = M * Q / c1;
Cw = M * q / c1;
y(t) = polyval(Hc,x(t));
R(t) = polyval(Cw,x(t));
end
A partir de esta imagen, es mejor que la interpolación de Lagrangiana y Newton, pero cuando la interpolación es mayor, es decir, el grado del polinomio de Hermite es mayor, el error será muy grande. Si no me cree, intentemos.
Seguimos usando sinx, pero esta vez usamos 5 puntos.
>> X = [0 pi/6 pi/4 pi/3 pi/2];Y = [0 0.5 0.7071 0.8660 1];Y1 = [1 0.8660 0.7071 0.5 0];
>> M = 1;
>> x = linspace(0, pi, 50);
>> [y,R,Hc,Hk,wcgs,Cw] = hermite(X,Y,Y1,x,M)
>> y1 = sin(x);
>> errorbar(x,y,R,'.g')
>> hold on
>> plot(X, Y, 'or', x, y, '.k', x, y1, '-b');
>> legend('误差','样本点','埃尔米特插值估算','sin(x)');
Principio de spline cúbico
Varios usos de interpolación
根据过去10年的中国人口数据,预测接下来三年的人口数据:
population=[133126,133770,134413,135069,135738,136427,137122,137866,138639, 139538];
year = 2009:2018;
p1 = pchip(year, population, 2019:2021) %分段三次埃尔米特插值预测
p2 = spline(year, population, 2019:2021) %三次样条插值预测
plot(year, population,‘o’,2019:2021,p1,‘r*-’,2019:2021,p2,‘bx-’)
legend(‘样本点’,‘三次埃尔米特插值预测’,‘三次样条插值预测’,‘Location’,‘SouthEast’)
¿Cómo usar matlab para el cálculo de interpolación?
x=1:12;
y=[5 8 9 15 25 29 31 30 22 25 27 24];
xi=1:0.1:12;
yi=interp1(x,y,xi,'spline');
plot(x,y,'+',xi,yi,'r')
Predicción de interpolación Mitte ',' predicción de interpolación spline cúbica ',' Ubicación ',' Sureste ')
[外链图片转存中...(img-lCsEVomy-1600091241625)]
# 如何使用matlab进行插值计算?
[外链图片转存中...(img-Lpictl7h-1600091241626)]
[外链图片转存中...(img-mE7XSMIS-1600091241627)]
x = 1:12 ;
y = [5 8 9 15 25 29 31 30 22 25 27 24];
xi = 1: 0.1: 12;
yi = interp1 (x, y, xi, 'spline');
plot (x, y, '+', xi, yi, 'r')
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200914215843231.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTgyMjYzOA==,size_16,color_FFFFFF,t_70#pic_center)