![MATLAB/Simulink权威指南:开发环境、程序设计、系统仿真与案例实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/629/27111629/b_27111629.jpg)
4.2 数据插值
在工程测量与科学实验中,通常得到的数据都是离散的。如果要得到这些离散数据点以外的其他数据值,就需要根据这些已知数据进行插值。假设测量得到n个点数据,(x1,y1),(x2,y2),…,(xn,yn),满足某一个未知的函数关系y=f(x),数据插值的任务就是根据已知的n个数据,构造一个函数y=p(x),使得yi=p(xi)(i=1,2,…,n)成立,就称p(x)为f(x)关于点x1,x2,…,xn的插值函数。求插值函数p(x)的方法为插值法。插值函数p(x)一般可以用线性函数、多项式或样条函数实现。
根据插值函数的自变量的个数,数据插值可以分为一维插值、二维插值和多维插值等;根据插值函数的不同,可以分为线性插值、多项式插值和样条函数插值等。MATLAB提供了一维插值interp1、二维插值interp2、三维插值interp3和N维插值interpn函数,以及三次样条插值spline函数等。
4.2.1 一维插值
所谓一维插值是指被插值函数的自变量是一个单变量的函数。一维插值采用的方法一般有一维多项式插值、一维快速插值和三次样条插值。
1.一维多项式插值
MATLAB中提供了interp1函数进行一维多项式插值。interp1函数使用了多项式函数,通过已知数据点计算目标插值点的数据。interp1函数的调用格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P163_29114.jpg?sign=1738890071-F1jwuVFmJnvGbnJa9clgvYANGWrMQ1Zi-0-ca57afe24de89e3dcb8939e21ad38971)
其中,Y是在默认自变量x选为1:n的值。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P163_29115.jpg?sign=1738890071-9ANuKHsWpIDBY8Z4MGv5WfodJoQSYGgL-0-52d86dda66b2bc746e2233ffbc037e86)
其中,X和Y是长度一样的已知向量数据,xi可以是一个标量,也可以是向量。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P163_29116.jpg?sign=1738890071-ovwtELbRp1MfArvfeTMG0k3aTHaamN4e-0-911b5e4a52163c2a6509b53a78f6be70)
其中,method是插值方法,其取值有下面几种:
(1)linear线性插值:这是默认插值方法,它是把与插值点靠近的两个数据点以直线连接,在直线上选取对应插值点的数据。这种插值方法兼顾速度和误差,插值函数具有连续性,但平滑性不好。
(2)nearest最邻近点插值:根据插值点和最接近已知数据点进行插值,这种插值方法速度快,占用内存小,但一般误差最大,插值结果最不平滑。
(3)next下一点插值:根据插值点和下一点的已知数据点插值,这种插值方法的优缺点和最邻近点插值一样。
(4)previous前一点插值:根据插值点和前一点的已知数据点插值,这种插值方法的优缺点和最邻近点插值一样。
(5)spline三次样条插值:采用三次样条函数获得插值点数据,要求在各点处具有光滑条件。这种插值方法连续性好,插值结果最光滑,缺点为运行时间长。
(6)cubic三次多项式插值:根据已知数据求出一个三次多项式进行插值。这种插值方法连续性好,光滑性较好,缺点是占用内存多,速度较慢。
需要注意,xi的取值如果超出已知数据X的范围,就会返回NaN错误信息。
MATLAB还提供interp1q函数用于一维插值。它与interp1函数的主要区别是,当已知数据不是等间距分布时,interp1q插值速度比interp1快。需要注意,interp1q执行的插值数据x必须是单调递增的。
【例4-9】 某气象台对当地气温进行测量,实测数据如表4-1所示,用不同的插值方法计算t=12时的气温。
表4-1 某地不同时间的气温
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-T164_28566.jpg?sign=1738890071-9EfWp3XYWYYhzK1Eqfx1VkdqZl9F2me3-0-0bf087c8e8e2b2b78f323e9fd9146375)
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P164_29118.jpg?sign=1738890071-WhhggkwitpElUBK28vF0VIis24uoTnVz-0-8876a0837b711c81bfd32aadba6887d3)
程序运行结果:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P164_29119.jpg?sign=1738890071-NXjObkIjMpSwSygTF7ubfDTTWPQhR1VK-0-e4882310c0747cb00f2e36121925bf99)
【例4-10】 假设测量的数据来自函数f(x)=e﹣0.5xsinx,试根据生成的数据,用不同的方法进行插值,比较插值结果。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P164_29121.jpg?sign=1738890071-gqPjyTkzU8C59JqmreMLL6MsUPEgrCGY-0-c3948d092d506debdfc679e73f28660b)
程序运行结果如下,插值效果如图4-2所示。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P165_29123.jpg?sign=1738890071-ZXryk5AMc8iKbnqK2H6UBfjiOFWC2Vg9-0-858189583a7d327d5723e32a5165c6b9)
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P165_10535.jpg?sign=1738890071-HTXfu5caCWE574McO9sm8uLgVuSE4fQl-0-49481a2e50d7950054a7ae409f38f4dc)
图4-2 各种插值结果比较
由上面的结果可知,interp1q实现插值的速度比interp1要快;最接近点拟合误差大,直线拟合得到曲线不平滑;采用三次样条插值效果最好,曲线平滑,误差很小,基本逼近真实值。
2.一维快速傅里叶插值
在MATLAB中,一维快速傅里叶插值可以用interpft函数实现。该函数利用傅里叶变换将输入数据变换到频率域,然后用更多点实现傅里叶逆变换,实现对数据的插值。函数调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P166_29124.jpg?sign=1738890071-b2sGx3Y8frGuHrnhgHsGiK0mY7H9IOVT-0-2831a9b424ca533b84d1a99b7f631757)
【例4-11】 假设测量的数据来自函数f(x)=sinx,试根据生成的数据,用一维快速傅里叶插值,比较插值结果。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P166_29125.jpg?sign=1738890071-0JViwKurbrdNN0ignjLQY3pCoffEIFD6-0-01f1920fcc7f823655a2789883eea6fb)
程序运行结果如下,插值效果如图4-3所示。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P166_29126.jpg?sign=1738890071-2k1EK4A2aLrgZ1LOlebXpfFfwOYXsDNS-0-6c8a32aef409e079485ff0d77067699c)
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P166_10564.jpg?sign=1738890071-ec5y9znAjfvXRDTARbxkSfl69Gf8N7ul-0-0946089e22b397067abf6089cafe61db)
图4-3 一维快速傅里叶插值及比较
由上述结果可知,一维快速傅里叶插值interpft实现插值的速度比较快,曲线平滑,误差很小,基本逼近真实值。
3.三次样条插值
三次样条插值利用多段多项式逼近插值,降低了插值多项式的阶数,使得曲线更为光滑。在MATLAB中,interp1插值函数的method选为spline样条插值选项,就可以实现三次样条插值。另外,MATLAB专门提供了三次样条插值函数spline,其格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P167_29127.jpg?sign=1738890071-8TAa9BToXg95Wx00etIzUK25gq0ZIdup-0-a93d61c287916e9e76028a33eab6fcfa)
【例4-12】 已知数据x=[﹣5﹣4﹣3﹣2﹣1 0 1 2 3 4 5],y=[26 16 9 4 1 0 1 4 9 16 25],对xi=﹣5:0.5:5,用spline进行三次样条插值,并比较用interp1实现三次样条插值的结果。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P167_29128.jpg?sign=1738890071-gix6FyHzflmUenXsiqr0p87acKP1DRzF-0-19cc0730bd3b82f82f0d2a6f853b142b)
程序运行结果如下,插值效果如图4-4所示。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P167_29129.jpg?sign=1738890071-1Gt6paQvU6cbUgMaNZRnRpHTIwuxhcN7-0-b86599b14da41d08c04012342e3bd8cd)
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P167_10594.jpg?sign=1738890071-UUOBXJzYHPUXJKOLHtbV7eNhBVUfkFgf-0-46bed30ce30e63189792c565f42e09df)
图4-4 三次样条插值及比较
由程序结果可知,三次样条插值spline函数实现插值的效果和interp1(x,y,xi,'spline')一样。
4.2.2 二维插值
二维插值是指已知一个二元函数的若干个采用数据点x、y和z(x,y),求插值点(x1,y2)处的z1的值。在MATLAB中,提供了interp2函数用于实现二维插值,其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P168_29130.jpg?sign=1738890071-P2PUDjBHA0Fqv1Zt0x6Njnsin9EwGaAi-0-6e567fc957068fccb40c68bc307b57da)
其中,X和Y是两个参数的采样点,一般是向量,Z是参数采样点对应的函数值。X1和Y1是插值点,可以是标量也可以是向量。Z1是根据选定的插值方法(method)得到的插值结果。插值方法method和一维插值函数相同,linear为线性插值(默认算法),nearest为最近点插值,spline为三次样条插值,cubic为三次多项式插值。需要注意,X1和Y1不能超出X和Y的取值范围,否则会得到NaN错误信息。
【例4-13】 某实验对计算机主板的温度分布做测试。用x表示主板的宽度(cm),y表示主板的深度(cm),用T表示测得的各点温度(℃),测量结果如表4-2所示。
表4-2 主板各点温度测量值
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-T168_28567.jpg?sign=1738890071-uisAgAKSNuAbWXpl6wQusHzyQvYzaYji-0-04611bde28fcd70392c57d45f82a9771)
(1)分别用最近点二维插值和线性二维插值法求(12.6,7.2)点的温度。
(2)用三次多项式插值求主板宽度每1cm、深度每1cm处各点的温度,并用图形显示插值前后主板的温度分布图。
程序代码如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P168_29132.jpg?sign=1738890071-NT3NC7rx6a7CSZrMVeY6auUX1QqQIF8c-0-dd000ba1d3662a4591fb76b731b8deea)
运行程序,结果如下,图4-5是插值前后主板温度分布图。由图4-5可知,用插值技术处理数据,可以使得温度分布图更加光滑。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P169_29134.jpg?sign=1738890071-wC1fMEvmpM0e5E0z52omf8eGehUQSqLv-0-9f1c1c1d9fdee88307e695f1c25f7136)
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P169_10733.jpg?sign=1738890071-zBrkrYS9rKAzeE609Kvk3okb0aaSxKZV-0-c3867eb2cbb3e0ab31abc68745f0a9c9)
图4-5 插值前后主板温度分布图
4.2.3 多维插值
1.三维插值
在MATLAB中,还提供了三维插值的函数interp3,其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P169_29135.jpg?sign=1738890071-EVtFful1sBGZvabXhUI1fkjmfwIGyAtI-0-5b8a053525728dc0255a7cf210e9c558)
其中,X、Y、Z是三个参数的采样点,一般是向量,U是参数采样点对应的函数值。X1、Y1、Z1是插值点,可以是标量也可以是向量。U1是根据选定的插值方法(method)得到的插值结果。插值方法method和一维插值函数相同,linear为线性插值(默认算法),nearest为最近点插值,spline为三次样条插值,cubic为三次多项式插值。需要注意,X1、Y1和Z1不能超出X、Y和Z的取值范围,否则会得到NaN错误信息。
2.n维插值
在MATLAB中,还可以实现更高维的插值,interpn函数用于实现n维插值。其调用格式为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P170_29137.jpg?sign=1738890071-iQNAeWlSQd7iDhjt1leuDo80nrBaasoN-0-3a398f5933cea4b6b31727300fa1b828)
其中,X1,X2,…,Xn是n个参数的采用点,一般是向量,U是参数采样点对应的函数值。Y1,Y2,…,Yn是插值点,可以是标量也可以是向量。U1是根据选定的插值方法(method)得到的插值结果。插值方法method和一维插值函数相同,linear为线性插值(默认算法),nearest为最近点插值,spline为三次样条插值,cubic为三次多项式插值。需要注意,Y1,Y2,…,Yn不能超出X1,X2,…,Xn的取值范围,否则会得到NaN错误信息。