草庐IT

MATLAB-一维插值运算

学习不好的电气仔 2023-04-12 原文

一维插值是指对一维函数进行插值。已知n+1个结点(x,y,),其中x,互不相同(j=0,1,2,... n),求任意插值点x*处的插值y*。

求解一维插值问题的主要思想是:设结点由未知的函数g(x)产生,函数g(x)为连续函数且g(x)=y;(j=0,1,...,n);接着构造相对简单的且容易实现的函数f(x)来逼近函数g(x),使f(x)可以经过n+1个结点,即f(x)=y;(j=0,1,2,,n), 接着使用函数f(x)计算插值点x*处的插值,即y* =f(x*)。

在MATLAB中,使用interp1函数可以实现一维插值,该函数是利用多项式插值函数,将被插值的函数近似为一个多项式函数,其调用格式如下。

yi= interpl(x,y ,xi, method) %对数据向量x和y依次选用合适的方法进行插值函数的构造,并计算xi

%处的函数值,返回给yi, “method"为指定的插值方法。其中,x必须是矩

%阵,y既可以是向量也可以是矩阵。若y是向量,则长度必须与x相同,

%此时xi可以是标量、向量或任意维矩阵,yi与xi大小相同;若y是矩阵, %则其大小必须是[ n,d1 ,d2,.",dk],n为向量x的长度,函数对d1 *d2*

%...*dk组y值都进行插值

yi= interpl(x,y ,xi,method, 'extrap ' ) % 对数据向量x和y依次选用合适的方法进行插值函数的构

%造,并计算xi处的函数值,返回给yi,"method"为指定的插值

%方法,并对超出数据范围的插值数据指定外推方法

yi= interpl(x,y ,xi,method, extrapval) % 对数据向量x和y依次选用合适的方法进行插值函数的构

%造,并计算xi处的函数值,返回给yi," method"为指定的插 %值方法,并对超出数据范围的插值数据返回extrapval 值,一 %般设为NaN或者0

yi=iterp1(x,y,xi,'pp ') %对数据向量 x和y依次选用合适的方法进行插值函数的构造,并计算xi

%处的函数值,返回给yi,"method"为指定的插值方法,返回值pp为数据y

%的分段多项式形式

yi= interpl(y,xi) %ox 和method均为默认设置,即x=1:N,其中N=size( Y); method= linear

%此外,若数据点是不等间距分布式,则interplq函数比interp1函数执行的速度快,

%因为前者是不检查已知数据点是否等间距,但inteplq函数要求x必须是单调递增的

在一维插值方法中,具有多种不同的指定插值方法,每种插值方法在速度、平滑性、内存使用方面都是有所不同的,下面将对“method”中这些指定的插值方法进行介绍。

1)最邻近插值法( nearest): 在已知数据的最邻近点设置插值点,对插值点的数进行四舍五人,对超出范围的点将返回NaN。该插值方法速度最快,但结果的平滑性差。

2)线性插值法(linear): 对未指定插值方法时所采用的方法。直接连接相邻的两点,对超出范围的点将返回NaN,占用的内存比最邻近插值法多,运行时间略长,生成的结果是连续的且在顶点处存在坡度变化。

3)三次样条插值(spline):使用三次样条丽数获取插值点。在已知点为端点的情况下,插值函数至少具有相同的一阶和二阶导数,为非常有用的插值方法。该方法处理速度最慢,占用内存小于分段三次厄米多项式插值,产生最光滑的结果,但当输人的数据分布不均匀或数据点间距过近时将产生错误。

4)三次插值( eubic):该参数取值的特点可参考帮助文档,需要更多内存,运行时间比最邻近法和线性插值要长;需要插值数据及其导数都是连续的。

5)三次多项式插值( v5eubic):该参数取值的特点可参考帮助文档,相比线性插值,其处理速度慢、内存消耗较多,使用三次多项式函数对已知数据进行拟合。

6)分段三次厄米多项式插值(pchip): 该参数取值的特点可参考帮助文档,在处理速度和内存消耗方面比线性插值差,插值得到的数据和--阶导数是连续的。

在MATALAB中常用的4种插值方法分别是最邻近插值法.线性插值法、三次样条插值法和三次插值法,其特点见表。

通常,插值运算分为以下两种。

1)内插值是指只对已知数据点集内部的点进行插值。该插值方法可以根据已知的数据点分布,构建可以代表分布特性的函数关系,可以较为准确地估计插值点上的函数值。

2)外插值是指对已知数据点集外部的点进行插值。想要较为准确地估计外插丽数值是很难的。

例:使用不同的方法对cos函数进行插值。

输人以下代码,生成的结果如图所示。

>>x=0:10;

y=cos(x);

xi=0:.25:10;

yi= interp1(x,y,xi);

subplot(221);

plot(x,y,'o',xi,yi);

xlabel( '(a)linear插值算法');

yi = interp1(x,y,xi, nearest ');

subplo(222);

plot(x,y,'o' ,xi,yi);

xlabel('(b) nearest插值算法');

yi= interp1(x,y,xi, ' v5cubic ');

subplot(223) ;

plot(x,y,'o',xi,yi);

xlabel('(c) v5cubic插值算法');

yi= interp1(x,y,xi, ' spline ');

subplot( 224) ;

plot(x,y,'o',xi,yi);

xlabel( '(d) spline插值算法');

例:外插运算的方法。

输人以下代码,生成的结果如图所示。

x=0:15;

y=cos(x);

xi=0:.25:15;

yi=sin(xi);

y1=interp1(x,y,xi,'nearest','extrap');

y2=interpl(x,y,xi,'linear','extrap');

y3=interp1(x,y,xi,'spline','extrap');

y4=interp1(x,y,xi,'vScubic','extrap');

y4=interpl(x,y,xi,'pchip','extrap');

plot(x,y,'o',xi,yi,xi,yl,xi,y2,xi,y3,xi,y4);

legend('data','cos','nearest','linear','spline','pheip',2);

xlabel('x');

ylabel('y');

有关MATLAB-一维插值运算的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. ruby-on-rails - Ruby on Rails I18n 插值 - 2

    大家好!我对我的:username字段进行了一个小的验证,它应该是4到30个字符。我写了一个验证::length=>{:within=>4..30,:message=>I18n.t('activerecord.errors.range')-我想显示一个错误各种错误的消息(不像,太长或太短),但这里有一个问题-我可以将最小值和最大值都传递给翻译,以便有类似的东西:用户名应该在4到30个字符之间。目前我有:range:"shouldbebetween%{count}and%{count}characters",这显然不起作用(只是为了检查)。是否可以从范围中获取这些值?谢谢大家的指教!

  3. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  4. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  5. ruby - 带括号和 splat 运算符的并行赋值 - 2

    我明白了:x,(y,z)=1,*[2,3]x#=>1y#=>2z#=>nil我想知道为什么z的值为nil。 最佳答案 x,(y,z)=1,*[2,3]右侧的splat*是内联扩展的,所以它等同于:x,(y,z)=1,2,3左边带括号的列表被视为嵌套赋值,所以它等价于:x=1y,z=23被丢弃,而z被分配给nil。 关于ruby-带括号和splat运算符的并行赋值,我们在StackOverflow上找到一个类似的问题: https://stackoverflow

  6. ruby - 定义自定义 Ruby 运算符 - 2

    问题是:除了在“OperatorExpressions”?例如:1%!2 最佳答案 是的,可以创建自定义运算符,但有一些注意事项。Ruby本身并不直接支持它,但是superatorsgem做了一个巧妙的把戏,将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:$geminstallsuperators19然后:require'superators19'classArraysuperator"%~"do|operand|"#{self}percent-tilde#{operand}"endendputs[1]%~[2]#Out

  7. ruby - 如何转义 Ruby 字符串插值? - 2

    给定这段代码:has_many:foos,:finder_sql=#{id}部分被过早插入。我如何逃脱它? 最佳答案 在定界符两边加上单引号:has_many:foos,:finder_sql= 关于ruby-如何转义Ruby字符串插值?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2052724/

  8. ruby - Ruby 中 <=> 运算符的名称是什么?他们怎么调用它? - 2

    在Ruby中有运算符(operator)。在API中,他们没有命名它的名字,只是:Theclassmustdefinetheoperator...Comparableusestoimplementtheconventionalcomparison......theobjectsinthecollectionmustalsoimplementameaningfuloperator...它叫什么名字? 最佳答案 参见上面的@Tony。然而,它也被称为(俚语)“宇宙飞船运算符(operator)”。

  9. ruby - 将运算符传递给函数? - 2

    也许这听起来很荒谬,但我想知道这对Ruby是否可行?基本上我有一个功能...defadda,bc=a+breturncend我希望能够将“+”或其他运算符(例如“-”)传递给函数,这样它就类似于...defsuma,b,operatorc=aoperatorbreturncend这可能吗? 最佳答案 两种可能性:以方法/算子名作为符号:defsuma,b,operatora.send(operator,b)endsum42,23,:+或者更通用的解决方案:采取一个block:defsuma,byielda,bendsum42,23,

  10. ruby - OR 运算符和 Ruby where 子句 - 2

    可能真的很简单,但我很难在网上找到关于这个的文档我在Ruby中有两个activerecord查询,我想通过OR运算符连接在一起@pro=Project.where(:manager_user_id=>current_user.id)@proa=Project.where(:account_manager=>current_user.id)我是ruby​​的新手,但我自己尝试使用||@pro=Project.where(:manager_user_id=>current_user.id||:account_manager=>current_user.id)这没有用,所以1.我想知道如何在

随机推荐