matlab interp1 pchip,matlab多项式插值interp1深入研究(1)「建议收藏」

matlab interp1 pchip,matlab多项式插值interp1深入研究(1)「建议收藏」学习matlab不久,遇到了多项式插值interp1,在网上没有找到研究其插值方法的文章,在此,对其中插值方法做了一些研究,属于matlab范畴之外,但是无聊研究一下总的来说不会有坏处。interp1的具体运用也比较低,个人理解主要属于样本丢失,补充样本用,所以最后还介绍了傅里叶增值法。正文:首先介绍一个多项式插值函数:Y=interp1(x,y,X,’mothod’)本文主要讨论’mothod…

大家好,又见面了,我是你们的朋友全栈君。

学习matlab不久,遇到了多项式插值interp1,在网上没有找到研究其插值方法的文章,

在此,

对其中插值方法做了一些研究,属于matlab范畴之外,但是无聊研究一下总的来说不会有坏处。

interp1的具体运用也比较低,个人理解主要属于样本丢失,补充样本用,所以最后还介绍了傅里叶增值法。

正文:

首先介绍一个多项式插值函数:

Y=interp1(x,y,X,’mothod’) 本文主要讨论’mothod’的4个类型,

linear线性插值,默认。

nearst最近邻插值。

spline是三次样条插值。

cubic是三次多项式插值方式。%之后版本改为PCHIP

v5cubic是MATLAB5中使用的三次多项式插值,本文不做谈论,但是一同做出演示

先通过举例方法matlab代码看一下一维插值4个类型有什么不同吧:

首先给一组数a4c26d1e5885305701be709a3d33442f.png

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的同学不放敲一下代码,结果如下:

a4c26d1e5885305701be709a3d33442f.png

下面是几个函数的二维插值,举例看看有何不同

[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的朋友复制上面代码就可以显示了。

a4c26d1e5885305701be709a3d33442f.png

从上面图例可以看出这些插值方法还是有区别的,本文研究了一下具体的算法,在何种情况应用;

linear默认方法线性插值,就是线性回归,不懂的可以去看看http://t.cn/RtktoiB

nearst最近邻插值法,又称泰森多边形(Thiesen又叫Dirichlet或Voronoi多边形)分析法,是荷兰气象学家A.H.Thiessen提出的一种分析方法。简单的说,是求离散分布的气象站的降雨量数据,计算平均降雨量,现在GIS和地理分析中经常采用这种方法进行快速赋值。在泰森多边形的构建中,首先要将离散点构成三角网。这种三角网称为Delaunay三角网。北京奥运会的水立方即是基于此原理设计。首先创造网络,无数据的网络要被赋为空值,使最近相邻的数据点之间的距离相等。

查看很多百科,不去手动复制了,总体讲,这种方法适用于数据紧密完整,只有少数点无值。对均匀数据进行插值很有用,对填充无值区域很有效。

spline三次样条插值法。在用pchip插值的过程中,matlab会基于所给的函数值来帮你估算各导数值。估算的原则是保证导数值能够正确的反映散点图的形状和变化趋势。比如在散点图是单调递增的区间内,相应点的导数值就会是正的;在散点图表现出存在局部极值点的区间,相应的导数也会产生正负的变化。

样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。

原理:假设有以下节点

a4c26d1e5885305701be709a3d33442f.png

样条曲线a4c26d1e5885305701be709a3d33442f.png

是一个分段定义的公式。给定n+1个数据点,共有n个区间,三次样条方程满足以下条件:

a. 在每个分段区间a4c26d1e5885305701be709a3d33442f.png

(i = 0, 1, …, n-1,x递增), a4c26d1e5885305701be709a3d33442f.png 都是一个三次多项式。

b. 满足a4c26d1e5885305701be709a3d33442f.png

(i = 0, 1, …, n )

c. a4c26d1e5885305701be709a3d33442f.png ,导数a4c26d1e5885305701be709a3d33442f.png

,二阶导数a4c26d1e5885305701be709a3d33442f.png

在[a, b]区间都是连续的,即a4c26d1e5885305701be709a3d33442f.png曲线是光滑的。

所以n个三次多项式分段可以写作:

a4c26d1e5885305701be709a3d33442f.png

,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中效果如图:

a4c26d1e5885305701be709a3d33442f.png

傅里叶主要是波动,用在函数上非常准确,如果上面y换成a4c26d1e5885305701be709a3d33442f.png,n=2,那么结果是这样的:

a4c26d1e5885305701be709a3d33442f.png

傅里叶变换是在数字信号处理方面很有用的一个方法,在通信和信息专业有很强的应用。

具体理论详见傅里叶分析,傅里叶变换

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132461.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 史上最全 PyCharm(Mac+Windows版) 快捷键整理,建议收藏备用「建议收藏」

    史上最全 PyCharm(Mac+Windows版) 快捷键整理,建议收藏备用「建议收藏」PyCharm应该是最常用的Python编辑器之一了,今天整理了一份PyCharm快捷键大全,包含了Mac和Windows版本,建议收藏备用。Mac版快捷键大全符号说明…

  • 阿里巴巴Java开发手册(终极版)[通俗易懂]

    不知不觉间,2020年已经过了一大半了,作为技术圈中你,准备好迎接最新的变化了吗?在本文中,我们将以编程界最常用的编程语言Java为例,分享最为主流的技术与工具。2020年最流行的Java开发技术Java几乎无处不在,无论在智能手机、台式机、游戏设备还是科学超级计算机上,处处都有Java的影子。全世界有数百万的Java程序员在开发基于Java的产品。然而,如此激烈的竞争,意味着Java开发人员必须时刻保持领先地位。为此,他们必须随时了解和洞悉Java生态系统中的最新动..

  • java properties读取配置文件_jdk的path变量应该怎么设置

    java properties读取配置文件_jdk的path变量应该怎么设置JettywarNamewarWEB-INFjetty-webxmlTomcatMETA-INFcontextxmlServerxml默认contextxmlURL:http://hostname.com/contextPath/servletPath/pathInfoJetty如果没有contextPath,则默认使用root上下文,root上下文的路

  • java request get 请求乱码解决

    java request get 请求乱码解决

    2020年11月19日
  • Eclipse的代码自动补全功能「建议收藏」

    Eclipse的代码自动补全功能「建议收藏」Eclipse的代码自动补全功能学习Java已有两个月的时间了,今天鼓起勇气尝试写第一篇CSDN博客,希望在帮助自己记录的同时能够帮助到有需要的朋友。众所周知Eclipse是一款非常智能的IDE工具,那么我们如何设置才能让它更为智能呢?本文主要介绍以下两点内容。Eclipse代码自动补全功能只按回车键来达到自动补全代码的目的要实现Eclipse的代码自动补全功能,我们需要这样设置…

  • word2vec 中的数学原理详解(一)目录和前言

    word2vec 中的数学原理详解(一)目录和前言word2vec是Google于2013年开源推出的一个用于获取wordvector的工具包,它简单、高效,因此引起了很多人的关注。由于word2vec的作者TomasMikolov在两篇相关的论文[3,4]中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感。一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟,出于好奇,我也成为了他们中的一员。读完代码后,觉得收获颇多,整理成文,给有需要的朋友参考。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号