从已知的一些离散数据点及其函数值,即函数的列表法表示,推求出未知点上函数值的所谓插值方法,在科技工作中应用十分广泛,如查对数表、三解函数表中都会遇到这类插值问题。MATLAB中设有许多插值命令,以下介绍最常用的一元函数插值命令。

一元函数的插值命令

    该命令的调用格式为:

一维数据的cnn代码 matlab的一维cnn_线性插值

  (1)  输入参数x和y为已知的两个同维向量,满足函数

一维数据的cnn代码 matlab的一维cnn_一维数据的cnn代码_02

  关系,它们是“造表”的根据。

  (2)输出量一维数据的cnn代码 matlab的一维cnn_线性插值_03 是与一维数据的cnn代码 matlab的一维cnn_样条_04 对应的函数值。插值点一维数据的cnn代码 matlab的一维cnn_一维数据的cnn代码_05 可以是数值、向量、矩阵,一维数据的cnn代码 matlab的一维cnn_线性插值_03一维数据的cnn代码 matlab的一维cnn_样条_04维数相同。

其中y可以是矩阵,x,可以缺省,如果x缺省的话,那么默认x为自然数1到n,n为y矩阵的维数。

   如果y为矩阵,那么y的各列将以x为公共的横坐标,计算多个(等于y的列数,size(y,2))插值函数。

输出值一维数据的cnn代码 matlab的一维cnn_线性插值_03将是一维数据的cnn代码 matlab的一维cnn_样条_04维数× size(y,2)矩阵。超出范围

一维数据的cnn代码 matlab的一维cnn_样条_10

一维数据的cnn代码 matlab的一维cnn_样条_04值,一维数据的cnn代码 matlab的一维cnn_线性插值_03将返回NaN。对于nearest与linear方法,如果插值点一维数据的cnn代码 matlab的一维cnn_样条_04在区间范围之外,则系统返回NaN(不是一个数),对于其他方法,系统将对超出范围的值进行外推运算。

yi=interp1(x,y,xi,method,'extrap')    利用指定的方法对超出范围的值进行外推计算

yi=interp1(x,y,xi,method,extrapval)   返回标量extrapval为超处范围值

pp=interp1(x,y,method,'pp')    利用指定的方法产生分段多项式

  (3)用单引号括起来的method有五种方法可供选择:

     ① nearest:线性最近项插值,用直角折线连接各样本点

     ② linear:线性插值(默认),用直线依次连接各样本点,形成折线。省略‘method’时,即默认此项。

     ③ spline:三次样条插值,用分段三次多项式曲线光滑地连接相邻样本点,整体上具有函数、一阶和二阶导数连续性。

     ④ pchip:分段三次埃尔米特(Hermite)插值,用分段三次多项式Hermite插值曲线,依次连接相邻样本点。

     ⑤ cubic:双三次插值
     

这几种方法在速度、平滑性、内存使用方面有所区别,在使用时可以根据实际需要进行选择。包括:

    1)最临近插值是最快的方法,但是使用它得到的结果平滑性最差。

    2)线性插值要比最邻近插值占用更多的内存,运行时间略长。与最近邻插值不同,它生成的结果是连续的,但在顶点处会有坡度变化。

    3)三次插值需要更多的内存,而且运行时间比最邻近法和线性插值要长。但是,在使用此法时,插值数据及其导数都是连续的。

    4)三次样条插值的运行时间相对来说最长,内存消耗比三次插值略少。它生成的结果平滑性最好。

    

     例1.利用interp1函数对y=sin(x)进行线性及样条插值。

       

clear all;
x=0:pi/4:2*pi;
y=sin(x);
xi=0:pi/16:2*pi;
figure
yi=interp1(x,y,xi);     %默认线性插值
plot(x,y,'o',xi,yi,':.');  
xlim([0 2 *pi]);
title('默认线性插值');
%实现样条插值
figure
yi2=interp1(x,y,xi,'spline');    %样条插值
plot(x,y,'o',xi,yi2,':.');
xlim([0 2 *pi]);
title('样条插值');

 

线性插值效果:

一维数据的cnn代码 matlab的一维cnn_插值_14

 

 

样条插值效果:

一维数据的cnn代码 matlab的一维cnn_样条_15

例2.对下表的7个离散数据点分别进行最邻近插值、三次样条插值、分段三次插值,并画出相应的折线图。

x

1

2

3

4

5

6

7

y

3.5

2.1

1.3

0.8

2.9

4.2

5.7

x = [1 2 3 4 5 6 7];
y = [3.5 2.1 1.3 0.8 2.9 4.2 5.7];
xi=1:0.5:7;
y1=interp1(x,y,xi,'nearest');
y2=interp1(x,y,xi,'spline');
y3=interp1(x,y,xi,'cubic');
plot(x,y,'ro',xi,y1,xi,y2,xi,y3);
legend('插值节点','最近邻插值','三次样条插值','分段三次插值')

 

运行程序效果图:

一维数据的cnn代码 matlab的一维cnn_一维数据的cnn代码_16