大家好,又见面了,我是你们的朋友全栈君。
学习matlab不久,遇到了多项式插值interp1,在网上没有找到研究其插值方法的文章,
在此,
对其中插值方法做了一些研究,属于matlab范畴之外,但是无聊研究一下总的来说不会有坏处。
interp1的具体运用也比较低,个人理解主要属于样本丢失,补充样本用,所以最后还介绍了傅里叶增值法。
正文:
首先介绍一个多项式插值函数:
Y=interp1(x,y,X,’mothod’) 本文主要讨论’mothod’的4个类型,
linear线性插值,默认。
nearst最近邻插值。
spline是三次样条插值。
cubic是三次多项式插值方式。%之后版本改为PCHIP
v5cubic是MATLAB5中使用的三次多项式插值,本文不做谈论,但是一同做出演示
先通过举例方法matlab代码看一下一维插值4个类型有什么不同吧:
首先给一组数
M代码,也可以直接输入在命令窗口
x0=-4:0.5:4;
y0=1./(2+x0.^3);
x=-4:0.2:4;
y1=interp1(x0,y0,x,’linear’);
y2=interp1(x0,y0,x,’nearst’);
y3=interp1(x0,y0,x,’spline’);
y4=interp1(x0,y0,x,’PCHIP’); %PCHIP和’cubic’是版本不同,老版本用y4=interp1(x0,y0,x,’cubic’);
y5=interp1(x0,y0,x,’v5cubic’);%MATLAB5中使用的三次多项式插值
subplot(2,3,1),plot(x0,y0,’r-p’);title(‘y=1/(x^3+2)’);
subplot(2,3,2),plot(x0,y0,’r-‘,x,y1);title(‘linear’);
subplot(2,3,3),plot(x0,y0,’r-‘,x,y2);title(‘nearst’);
subplot(2,3,4),plot(x0,y0,’r-‘,x,y3);title(‘spline’);
subplot(2,3,5),plot(x0,y0,’r-‘,x,y4);title(‘cubic’);
subplot(2,3,6),plot(x0,y0,’r-‘,x,y5);title(‘v5cubic’);
有matlab的同学不放敲一下代码,结果如下:
下面是几个函数的二维插值,举例看看有何不同
[x0,y0]=meshgrid(-3:0.8:3);%完成网格矢量
z0=peaks(x0,y0); %由平移和放缩高斯分布函数获得z0
[x,y]=meshgrid(-3:0.25:3);
z1=interp2(x0,y0,z0,x,y,’linear’);
z2=interp2(x0,y0,z0,x,y,’nearst’);
z3=interp2(x0,y0,z0,x,y,’spline’);
z4=interp2(x0,y0,z0,x,y,’cubic’);
subplot(2,3,1),surf(x0,y0,z0);title(‘原始数据’);
subplot(2,3,2),surf(x,y,z1);title(‘linear’);
subplot(2,3,3),surf(x,y,z2);title(‘nearst’);
subplot(2,3,4),surf(x,y,z3);title(‘spline’);
subplot(2,3,5),surf(x,y,z4);title(‘cubic’);
显示的不是很清晰,如果有matlab的朋友复制上面代码就可以显示了。
从上面图例可以看出这些插值方法还是有区别的,本文研究了一下具体的算法,在何种情况应用;
linear默认方法线性插值,就是线性回归,不懂的可以去看看http://t.cn/RtktoiB
nearst最近邻插值法,又称泰森多边形(Thiesen又叫Dirichlet或Voronoi多边形)分析法,是荷兰气象学家A.H.Thiessen提出的一种分析方法。简单的说,是求离散分布的气象站的降雨量数据,计算平均降雨量,现在GIS和地理分析中经常采用这种方法进行快速赋值。在泰森多边形的构建中,首先要将离散点构成三角网。这种三角网称为Delaunay三角网。北京奥运会的水立方即是基于此原理设计。首先创造网络,无数据的网络要被赋为空值,使最近相邻的数据点之间的距离相等。
查看很多百科,不去手动复制了,总体讲,这种方法适用于数据紧密完整,只有少数点无值。对均匀数据进行插值很有用,对填充无值区域很有效。
spline三次样条插值法。在用pchip插值的过程中,matlab会基于所给的函数值来帮你估算各导数值。估算的原则是保证导数值能够正确的反映散点图的形状和变化趋势。比如在散点图是单调递增的区间内,相应点的导数值就会是正的;在散点图表现出存在局部极值点的区间,相应的导数也会产生正负的变化。
样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。
原理:假设有以下节点
样条曲线
是一个分段定义的公式。给定n+1个数据点,共有n个区间,三次样条方程满足以下条件:
a. 在每个分段区间
(i = 0, 1, …, n-1,x递增), 都是一个三次多项式。
b. 满足
(i = 0, 1, …, n )
c. ,导数
,二阶导数
在[a, b]区间都是连续的,即曲线是光滑的。
所以n个三次多项式分段可以写作:
,i = 0, 1, …, n-1
其中ai, bi, ci, di代表4n个未知系数。
cubic立方插值法,matlab新版本叫做pchip三次hermite插值,与spline插值差不多,因为两者X(j)处斜率选择方法不同。spline函数s(x)在X(j)的二节数D^2s(x)也是连续的,导致了不同结果,也就是说,spline更加光滑,D^2s(x)是连续的。
只是spline更光滑一些,总的说,数据是更光滑的函数,spline更加准确,如果数据不光滑,PCBIC不会太震荡,也不会超过目标值,建立难度较小。pchip是保持形状的,而spline不一定保持形状。
总的来说,插值的类型要求数学功底比较深,纯编程朋友还是多多学习,否则随便用起来对数据产生不必要影响就不好了。 再遇到插值问题时,多问问数学专家为妙。
数据过少时,MATLAB可是实现利用傅里叶插值实现数据一维增值
%傅里叶增值
x0=0:1.2:10;
y0=sin(x0);
n=4*length(x0);%采样数据增加
y=interpft(y0,n);
x=0:0.3:10.5;
hold on
plot(x0,y0,’ro’);
plot(x,y,’b.-‘);
title(‘一维傅里叶插值’);
legend(‘原始数据’,’插值结果’);
MATLAB中效果如图:
傅里叶主要是波动,用在函数上非常准确,如果上面y换成,n=2,那么结果是这样的:
傅里叶变换是在数字信号处理方面很有用的一个方法,在通信和信息专业有很强的应用。
具体理论详见傅里叶分析,傅里叶变换
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132461.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...