matlab自带的插值函数interp1的几种插值方法

2022-07-01 18:34:01 浏览数 (1)

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

插值法

插值法又称“内插法”,是利用函数f (x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f (x)的近似值,这种方法称为插值法。如果这特定函数是多项式,就称它为插值多项式。

线性插值法

线性插值法是指使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的方法。

假设我们已知坐标(x0,y0)与(x1,y1),要得到[x0,x1]区间内某一位置x在直线上的值。根据图中所示,我们得到两点式直线方程:

假设方程两边的值为α,那么这个值就是插值系数—从x0到x的距离与从x0到x1距离的比值。由于x值已知,所以可以从公式得到α的值:

同样:

这样,在代数上就可以表示成为:

y = (1 − α)y0 αy1

或者,

y = y0 α(y1 − y0)

这样通过α就可以直接得到 y。实际上,即使x不在x0到x1之间并且α也不是介于0到1之间,这个公式也是成立的。在这种情况下,这种方法叫作线性外插—参见 外插值。

  已知y求x的过程与以上过程相同,只是x与y要进行交换。

MATLAB中的使用

[plain] view plain copy

  1. %{
  2. MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,’method’)
  3. 其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量,
  4. ‘method’表示采用的插值方法,MATLAB提供的插值方法有几种:
  5. ‘nearest’是最邻近插值, ‘linear’线性插值; ‘spline’三次样条插值; ‘pchip’立方插值.缺省时表示线性插值
  6. 注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。
  7. %}
  8. x = 0:2*pi;
  9. y = sin(x);
  10. xx = 0:0.5:2*pi;
  11. % interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值
  12. y1 = interp1(x,y,xx,’linear’);
  13. subplot(2,2,1);
  14. plot(x,y,’o’,xx,y1,’r’)
  15. title(‘分段线性插值’)
  16. % 临近插值
  17. y2 = interp1(x,y,xx,’nearest’);
  18. subplot(2,2,2);
  19. plot(x,y,’o’,xx,y2,’r’);
  20. title(‘临近插值’)
  21. %球面线性插值
  22. y3 = interp1(x,y,xx,’spline’);
  23. subplot(2,2,3);
  24. plot(x,y,’o’,xx,y3,’r’)
  25. title(‘球面插值’)
  26. %三次多项式插值法
  27. y4 = interp1(x,y,xx,’pchip’);
  28. subplot(2,2,4);
  29. plot(x,y,’o’,xx,y4,’r’);
  30. title(‘三次多项式插值’)

一个例子

[plain] view plain copy

  1. %{
  2. MATLAB中的插值函数为interp1,其调用格式为: yi= interp1(x,y,xi,’method’)
  3. 其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量,
  4. ‘method’表示采用的插值方法,MATLAB提供的插值方法有几种:
  5. ‘nearest’是最邻近插值, ‘linear’线性插值; ‘spline’三次样条插值; ‘pchip’立方插值.缺省时表示线性插值
  6. 注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。
  7. %}
  8. %{
  9. 例如:在一 天24小时内,从零点开始每间隔2小时测得的环境温度数据分别为
  10. 12,9,9,1,0,18 ,24,28,27,25,20,18,15,13,
  11. 推测中午12点(即13点)时的温度.
  12. %}
  13. x = 0:2:24;
  14. y = [12 9 9 10 18 24 28 27 25 20 18 15 13];
  15. a = 13;
  16. y1 = interp1(x,y,a,’spline’)
  17. % 结果为: 27.8725
  18. % 若要得到一天24小时的温度曲线,则:
  19. xi = 0:1/3600:24;
  20. % 插值点可以是向量,则返回的也就是对应的向量
  21. yi = interp1(x,y,xi, ‘spline’);
  22. plot(x,y,’o’ ,xi,yi);

[plain] view plain copy

  1. x=0:2*pi;
  2. y=sin(x);
  3. xx=0:0.5:2*pi;
  4. %interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值
  5. y1=interp1(x,y,xx);
  6. figure
  7. plot(x,y,’o’,xx,y1,’r’)
  8. title(‘分段线性插值’)
  9. %临近插值
  10. y2=interp1(x,y,xx,’nearest’);
  11. figure
  12. plot(x,y,’o’,xx,y2,’r’);
  13. title(‘临近插值’)
  14. %球面线性插值
  15. y3=interp1(x,y,xx,’spline’);
  16. figure
  17. plot(x,y,’o’,xx,y3,’r’)
  18. title(‘球面插值’)
  19. %三次多项式插值法
  20. y4=interp1(x,y,xx,’cubic’);
  21. figure
  22. plot(x,y,’o’,xx,y4,’r’);
  23. title(‘三次多项式插值’)

(1) Nearest方法速度最快,占用内存最小,但一般来说误差最大,插值结果最不光滑。

(2) Spline三次样条插值是所有插值方法中运行耗时最长的,插值函数及其一二阶导函数都连续,是最光滑的插值方法。占用内存比cubic方法小,但是已知数据分布不均匀的时候可能出现异常结果。

(3) Cubic三次多项式插值法中,插值函数及其一阶导数都是连续的,所以插值结果比较光滑,速度比Spline快,但是占用内存最多。

语法形式

说明

y=interp1(x,Y,xi)

由已知点集(x,Y)插值计算xi上的函数值

y=interp1(x,Y,xi)

相当于x=1:length(Y)的interp(x,Y,xi)

y=interp1(x,Y,xi,method)

用指定插值方法计算插值点xi上的函数值

y=interp1(x,Y,xi,method,’extrap’)

对xi中超出已知点集的插值点用指定插值方法计算函数值

y=interp1(x,Y,xi,method,’extrap’,extrapval)

用指定方法插值xi上的函数值,超出已知点集处函数值取extrapval

y=interp1(x,Y,xi,method,’pp’)

用指定方法插值,但返回结果为分段多项式

Method

方法描述

‘nearest’

最邻近插值:插值点处函数值与插值点最邻近的已知点函数值相等

‘liner’

分段线性插值:插值点处函数值由连接其最邻近的两侧点的线性函数预测。Matlab中interp1的默认方法。

‘spline’

样条插值:默认为三次样条插值。可用spline函数替代

‘pchip’

三次Hermite多项式插值,可用pchip函数替代

‘cubic’

同’pchip’,三次Hermite多项式插值

另:

【matlab】csape 和interp1有什么相同和区别?

代码语言:javascript复制
csape和interp1都是插值函数。
csape可以选择样条的边界条件,interp1无法使用边界条件;
csape只是Cubic spline插值,interp1可以选择几种不同的插值方法。

csape函数的用法如下:
pp = csape(x,y,conds,valconds)
其中(x,y)为数据向量,conds表示变界类型, valconds表示边界值。
边界类型(conds)可为:
'complete',给定边界一阶导数.
 'not-a-knot',非扭结条件,不用给边界值.
 'periodic',周期性边界条件,不用给边界值.
 'second',给定边界二阶导数. 
 'variational',自然样条(边界二阶导数为0)
边界类型(valconds)可为:
'complete',给定边界一阶导数.
'not-a-knot',非扭结条件,不用给边界值.
'periodic',周期性边界条件,不用给边界值.
'second',给定边界二阶导数. 
'variational',自然样条(边界二阶导数为0)

interp1函数的用法如下:
  yi=interp1(x,Y,xi):返回插值向量yi,每一元素对应于参量xi,同时由向量X与Y的内插值决定。参量x 指定数据Y的点。若Y为一矩阵,则按Y的每列计算。yi是阶数为length(xi)*size(Y,2)的输出矩阵。
  yi=interp1(Y,xi):假定x=1:N,其中N为向量Y的长度,或者为矩阵Y的行数。
  yi=interp1(x,Y,xi,method):用指定的算法计算插值。nearest为最近邻点插值,直接完成计算;linear为线性插值(默认方式),直接完成计算;spline为三次样条函数插值。
  yi=interp1(x,Y,xi,method,'extrap'):对于超出x范围的xi中的分量将执行特殊的外插值法extrap。
  yi=interp1(x,Y,xi,method,extrapval):确定超出x范围的xi中的分量的外插值extrapval,其值通常取NaN或0。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130783.html原文链接:https://javaforall.cn

0 人点赞