一般插值方法
一维插值函数:
yi=interp1(x,y,xi,‘method’)
其中method有:
nearest——最临近插值
linear——线性插值
spline——三次样条插值
cubic——立方插值
二维插值:
zz=interp2(x,y,z,xx,yy,’method’)
该指令的意思是根据数据向量x,y,z按method指定的方法来做插值,然后将xx,yy处插值函数的插值结点向量,如果xx,yy在插值范围之内,则返回值在zz中,否则返回值为空——NaN。’method’是插值方法可选项,具体要求同一维插值的情况。
该命令还有以下几种省略格式:
zz=interp2(z,xx,yy)
zz=interp2(x,y,z,xx,yy)
zz=interp2(z,ntimes)
三维插值
vi=interp3(x,y,z,v,xi,yi,zi,’method’)
解释同一、二维插值。
样条插值
yy=spline(x,y,xx)
其等同于yy=interp1(x,y,xx,’cubic’)。
网格节点数据案例
1.一维插值
例1:在1-12的11小时内,每隔1小时测量一次温度,,测得的温度依次为:5,8,9,15,25,29,31,30,22,25,27,24。试估计每隔1/10小时的温度值。
代码:
clear
clc;
t=1:12;
tmp=[5 8 9 15 25 29 31 30 22 25 27 24];
h=1:0.1:12;
wd=interp1(t,tmp,h,'spline');
plot(t,tmp,'k+',h,wd,'b',t,tmp,'r:')
xlabel('时间')
ylabel('温度')
结果展示:
例2 在用外接电源给电容器充电时,电容器两端的电压V将会随着充电时间t发生变化,已知在某一次实验时,通过测量得到下列观测值,分别用拉格朗日插值法、分段线性插值法、三次样条插值法画出V随着时间t变化的曲线图,分别计算当时间t=7s时,三种插值法各自算得电容器两端电压的近似值。(具体数据见代码)
由于matlab没有提供拉格朗日插值的命令,因此需要编写程序。
%拉格朗日插值代码
function y=lglrcz(x_0,y_0,x)
n=length(x_0);
m=length(x);
for i=1:m
z=x(i);
s=0.0;
for k=1:n
q=1.0
for j=1:n
if j~=k
q=q*(z-x_0(j))/(x_0(k)-x_0(j));
end
end
s=q*y_0(k)+s;
end
y(i)=s;
end
%程序应用同时直接利用matlab中的命令。
clear
clc;
t=[1,2,3,4,6.5,9,12] ;
v=[6.2,7.3,8.2,9.0,9.6,10.1,10.4] ;
t_0=0.2:0.1:12.5;
lglr=lglrcz(t,v,t_0);
laglr=lglrcz(t,v,7) ;
fdxx=interp1(t,v,t_0) ;
fendxx=interp1(t,v,7) ;
scyt=interp1(t,v,t_0,'spline') ;
sancyt=interp1(t,v,7,'spline');
plot(t,v,'*',t_0,lglr,'r',t_0,fdxx,'g',t_0,scyt,'b')
gtext('lglr')%标记线条所属的方法
gtext('fdxx')
gtext('scyt')
2.二维插值案例:
z=interp2(x0,y0,z0,x,y,’method’)
要求x0,y0单调;x,y可取为矩阵,或x取行向量,y取为列向量,x,y的值分别不能超出x0,y0的范围
例:测得平板表面3*5网格点处的温度分别为:
82 81 80 82 84 79 63 61 65 81 84 84 82 85 86
试作出平板表面的温度分布曲面z=f(x,y)的图形。
clear
clc;
x=1:5;
y=1:3;
temps=[82 81 80 82 84;79 63 61 65 81;84 84 82 85 86];
mesh(x,y,temps)
%上面为原数据的图;下面为插值之后的温度分布
xi=1:0.2:5;
yi=1:0.2:3;
zi=interp2(x,y,temps,xi',yi,'cubic');
mesh(xi,yi,zi)
散点数据的插值
cz =griddata(x,y,z,cx,cy,‘method’)
要求cx取行向量,cy取为列向量。