Lagrange插值
参考书目:张德丰,MATLAB数值计算方法,机械公业出版社,P122
原理:
l
i
(
x
)
=
(
x
−
x
0
)
…
(
x
−
x
i
−
1
)
(
x
−
x
i
+
1
)
…
(
x
−
x
n
)
(
x
i
−
x
0
)
…
(
x
i
−
x
i
−
1
)
(
x
i
−
x
i
+
1
)
…
(
x
i
−
x
n
)
l_{i}(x)=\frac{(x-x_{0})\dots(x-x_{i-1})(x-x_{i+1})\dots(x-x_n)} {(x_i-x_0)\dots(x_i-x_{i-1})(x_i-x_{i+1})\dots(x_i-x_n)}
li(x)=(xi−x0)…(xi−xi−1)(xi−xi+1)…(xi−xn)(x−x0)…(x−xi−1)(x−xi+1)…(x−xn)
插值函数
function f = Lagrange(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); %将t替换成x0进行计算
else
f = collect(f);
f = vpa(f,6);
end
end
end
主调函数
x = [1,1.2,1.8,2.5,4]
y = [0.8415,0.9320,0.9738,0.5985,-0.7568]
f = Lagrange(x,y)
f1 = Lagrange(x,y,1.6);
f1 = vpa(f1,4)
x = 1:0.01:4;
y = 0.0328112*x.^4 - 0.204917*x.^3 - 0.0145485*x.^2 + 1.05427*x - 0.0261189;
x1 = [1,1.2,1.8,2.5,4];
y1 = [ 0.8415,0.9320,0.9738,0.5985,-0.7568];
plot(x,y,x1,y1,'ro');grid
运算结果
>> Lagrange_Main
x =
1.0000 1.2000 1.8000 2.5000 4.0000
y =
0.8415 0.9320 0.9738 0.5985 -0.7568
f =
0.0328112*t^4 - 0.204917*t^3 - 0.0145485*t^2 + 1.05427*t - 0.0261189
f1 =
0.9992