插值和拟合
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
插值和拟合的定义
1.定义:若x为自变量,y为因变量,则x与y之间有一个确定的函数表达式f(x),现实中,这个函数关系式很难确定,运用逼近的方法处理:取得一组数据点(xi,yi,i=1,2,3...n),构造一个简单函数p(x)作为f(x)的近似表达式,且p(x)满足:
p(xi)=f(xi)=yi i=1,2,3,4...n
这就是插值问题。
若不要求p(x)通过所有数据点,而是要求曲线在某种准则下整体与数据点接近,例如运用最小二乘法得到p(x),这种问题称为拟合。
2插值类型:一维插值是指对一维函数y=f(x)进行插值,二维插值就是对二维函数y=f(x,y)进行插值.
3.插值的matlab函数及其应用
(1).一维插值:yi=interp1(x,Y,xi,’method’),对一组节点(x,Y)进行插值,计算插值点xi 的函数值。method包括了一下几种类型:
Nearest:线性最邻近插值(速度最快,平滑性最差)
Linear:线性插值(默认项)(生成效果连续,但是顶点处有坡度变化)
Spline:三次样条插值(运行时间较长,插值数据和导数均连续)
Pchip:分段三次艾米尔特(hermite)插值
Cubic:双三次插值(较高版本的matlab不能运用,v5cubic能够运行)
运行的代码及插值效果:
clear;
clc;
x=0:0.2:2;
y=(x.^2-3*x+5).*exp(-3*x).*sin(x);
xi=0:0.03:2;
yi_nearest=interp1(x,y,xi,'nearest');
yi_linear=interp1(x,y,xi,'linear');
yi_spline=interp1(x,y,xi,'spline');
yi_pchip=interp1(x,y,xi,'pchip');
yi_cubic=interp1(x,y,xi,'v5cubic');
figure;
hold on;
subplot(2 ,3, 1);
plot(x,y,'r*');
title('已知数据值');
subplot(2, 3 ,2);
plot(x,y,'r*',xi,yi_nearest,'b-');
title('最邻近插值');
subplot(2,3,3);
plot(x,y,'r*',xi,yi_linear,'b-');
title('线性插值');
subplot(2,3,4);
plot(x,y,'r*',xi,yi_spline,'b-');
title('三次样条插值');
subplot(2,3,5);
plot(x,y,'r*',xi,yi_pchip,'b-');
title('分段三次艾尔米特插值');
subplot(2,3,6);
plot(x,y,'r*',xi,yi_cubic,'b-');
title('三次多项式插值');
(2).二维插值:第一类,二维网格数据插值zi=interp2(x,y,z,xi,yi,’method’),其中x,y为数据采样点,即为真实所测得的数据,返回值为xi,yi的插值函数值。
method与一维插值相同。
各个方法所得的插值效果和代码如下:
clear;clc;
[x,y]=meshgrid(-3:0.25:3);
z=peaks(x,y);
[xi,yi]=meshgrid(-3:0.125:3);
z1=interp2(x,y,z,xi,yi,'linear');
z2=interp2(x,y,z,xi,yi,'nearest'); z3=interp2(x,y,z,xi,yi,'spline'); z5=interp2(x,y,z,xi,yi,'cubic'); subplot(2,2,1);
mesh(x,y,z);
hold on;
mesh(xi,yi,z1+15);
axis([-3,3,-3,3,-8,25]);
title('二维网格双线性插值');
subplot(2,2,2);
mesh(x,y,z);
hold on;
mesh(xi,yi,z2+15);
axis([-3,3,-3,3,-8,25]);
title('二维网格最邻近插值');
subplot(2,2,3);
mesh(x,y,z);
hold on;
mesh(xi,yi,z3+15);
axis([-3,3,-3,3,-8,25]);
title('二维网格样条插值');
subplot(2,2,4);
mesh(x,y,z);
hold on;
mesh(xi,yi,z5+15);
axis([-3,3,-3,3,-8,25]);
title('二维网格双三次插值');
第二类:二维散点数据插值:zi=griddata(x,y,z,xi,yi,’method’),各个输入值与interp2 的相同,不再赘述。Method为Cubic不能运行,应采用v4方法进行插值。运行代码的效果图如下:
clear;clc;
rand('seed',0);
x=rand(100,1)*4-2;
y=rand(100,1)*4-2;
z=x.*exp(-x.^2-y.^2);
ti=-2:0.25:2;
[xi,yi]=meshgrid(ti,ti);
z1=griddata(x,y,z,xi,yi,'linear');
z2=griddata(x,y,z,xi,yi,'cubic');
z3=griddata(x,y,z,xi,yi,'nearest');
z4=griddata(x,y,z,xi,yi,'v4');
subplot(2,2,1);
mesh(xi,yi,z1);
hold on;
title('线性插值');
plot3(x,y,z,'o');
subplot(2,2,2);
mesh(xi,yi,z2);