题目1:
下表是自然对数lnx的部分数表,利用拉格朗日插值求ln(0.6);
x | 0.4 | 0.5 | 0.7 | 0.8 |
---|---|---|---|---|
ln x | -0.916291 | -0.693147 | -0.356675 | -223144 |
通过表格可以看出共有n+1=4个插值点,所以n=3,通过拉格朗日插值定义建立拉格朗日插值多项式,代码块如下:
%n=3时拉格朗日插值
clc;
clear;
syms x;
x0=[0.4 0.5 0.7 0.8];
y0=[-0.916291 -0.693145 -0.356675 -0.223144];
L1(x)=(x-x0(2))*(x-x0(3))*(x-x0(4))/((x0(1)-x0(2))*(x0(1)-x0(3))*(x0(1)-x0(4)));
L2(x)=(x-x0(1))*(x-x0(3))*(x-x0(4))/((x0(2)-x0(1))*(x0(2)-x0(3))*(x0(2)-x0(4)));
L3(x)=(x-x0(1))*(x-x0(2))*(x-x0(4))/((x0(3)-x0(1))*(x0(3)-x0(2))*(x0(3)-x0(4)));
L4(x)=(x-x0(1))*(x-x0(2))*(x-x0(3))/((x0(4)-x0(1))*(x0(4)-x0(2))*(x0(4)-x0(3)));
L(x)=L1(x)*y0(1)+L2(x)*y0(2)+L3(x)*y0(3)+L4(x)*y0(4);
fprintf('利用拉格朗日插值求得ln(0.6)的值为:%0.8f\n',L(0.6))
plot(x0,y0,'b*')
hold on
plot(x0,L(x0),'r')
hold on
fprintf('3次polyfit多项式拟合由高到低系数为:\n')
p=polyfit(x0,y0,3)
y(x)=p(1)*x^3+p(2)*x^2+p(3)*x+p(4);
plot(x0,y(x0),'g--')
运行结果:
图形对比:
可以看出插值多项式和拟合多项式完全重合,其实在matlab中,polyfit函数就是插值函数;
注意,插值多项式一定经过插值点
题目2:
下表是二氧化碳在不同温度下在水中的溶解度,利用牛顿插值求t=4时的溶解度
t | 0 | 1 | 3 | 5 |
---|---|---|---|---|
s | 0.3346 | 0.3213 | 0.2978 | 0.2774 |
利用差商构建牛顿插值多项式,代码块如下:
%n=3时牛顿插值
clc;
clear;
syms x;
x0=[0 1 3 5];
y0=[0.3346 0.3213 0.2978 0.2774];
n12=(y0(2)-y0(1))/(x0(2)-x0(1));%n2
n13=(y0(3)-y0(1))/(x0(3)-x0(1));
n14=(y0(4)-y0(1))/(x0(4)-x0(1));
n123=(n13-n12)/(x0(3)-x0(2));
n124=(n14-n12)/(x0(4)-x0(2));
n1234=(n124-n123)/(x0(4)-x0(3));
p(x)=y0(1)+n12*(x-x0(1))+n123*(x-x0(1))*(x-x0(2))+n1234*(x-x0(1))*(x-x0(2))*(x-x0(3));
p4=vpa(p(4),8);
fprintf('利用newton插值求得4°时的溶解度为:%0.8f\n',p4)
plot(x0,y0,'b*')
hold on
plot(x0,p(x0),'r')
fprintf('3次polyfit多项式拟合由高到低系数为:\n')
p=polyfit(x0,y0,3)
y(x)=p(1)*x^3+p(2)*x^2+p(3)*x+p(4);
plot(x0,y(x0),'g--')
运行结果如下:
图形对比:
其实牛顿插值多项式和拉格朗日插值多项式只是构建形式不同,化为最简多项式后,二者完全一致,即插值多项式具有唯一性。
插值余项和误差估计挺重要的,是后面的插值型求积公式的基础。