赞
踩
今天我们来谈谈数据插值以及它在matlab中的应用。
实际问题中观察到的数据点,譬如不同时间段的温度,湿度,在力的作用下物体的变形程度等,常常是客观的,真实发生的数据,具有客观世界的准确性,然而一般情况下无法满足我们建模的需要。
比如说,某观测站每隔半个小时测量一次外界温湿度并记录,一天二十四小时如下图所示(只列出一部分)。
时间 | 温度 |
---|---|
6:00 | 15 |
6:30 | 18 |
7:00 | 20 |
7:30 | 21 |
8:00 | 22 |
… | … |
但假如我们要分析早晨六点到八点的气温变化程度,仅有图表中的五个数据往往是不够的,又比如我们已经得到了步进为一分钟的湿度的详实数据,却无法与温度的少量数据相匹配,有没有一种办法,能科学的获取某一区间上的大量相关数据呢?
这里我们可以采用插值的方法。
插值,即是根据一组数据构造一个函数作为近似,当我们需要观察节点之间的函数值时,往往可以通过该构造函数来代替。
简单地说,就是根据已知数据点构建一个函数,使其能够很好地代替某一区间内未能观测的真实数据。
听起来是不是与函数拟合有点儿像呢?其实二者都是根据有限数据点,求近似函数,然而拟合不要求过已知数据点,只要求在某种意义下他在这些点上的总偏差是最小的。
分段线性插值,简单地说,就是把相邻节点用直线连接,所形成的直线就是分段线性插值函数,实际计算插值时,只用到了左右两个节点(两点成一条直线嘛),所以计算量与节点数n无关,但n越大,其误差越小。
分段线性插值在某些特殊函数,或统计学中的概率分布问题上有所应用,但直愣愣的线条在工程技术上想必是大煞风景了,如汽车车轮,飞机机翼,都对函数的光滑性有相当程度的要求,各位观众老爷也不希望看到温度预测表直接连线这么没技术含量吧。
那么,为了解决以上问题,样条插值应运而出,样条原本是工程设计中使用的一种绘图工具,是富有弹性的细木条或者细金属条,绘图员利用它们把一些已知点连成光滑的曲线,想想都很有画面感对不对,真的有那么丝滑吗?
废话不多说直接上代码。
// clear,clc x0 = [0 3 5 7 9 11 12 13 14 15]; y0 = [0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6]; t=0:0.1:15; %一维插值 y2=interp1(x0,y0,t,'nearest');%最近项插值 Y2=interp1(x0,y0,t);%默认linear,线性插值 subplot(2,2,1); plot(t,y2) legend('边条'); title('最近项插值'); legend('最近项'); subplot(2,2,2); plot(t,Y2);%画出曲线 title('线性插值'); legend('线性');%显示图形图例 %三次线条插值A pp1=csape(x0,y0);%默认的边界条件,即给定边界一阶导数 y4=ppval(pp1,t); subplot(2,2,3); plot(t,y4);%画出曲线 title('三次线条插值A'); legend('一阶'); %三次线条插值B pp2=csape(x0,y0,'second');%给定边界二阶导数 Y4=ppval(pp2,t); subplot(2,2,4); plot(t,Y4);%画出曲线 title('三次线条插值B'); legend('二阶');
比较结果如下。
可以明显看出,三次样条插值比较与分段线性插值更光滑,具有连续的曲率,这是由于其对边界导数的要求实现的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。