MATLAB插值函数interp1

这篇具有很好参考价值的文章主要介绍了MATLAB插值函数interp1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

插值操作

插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其它点处的近似值。
插值可以实现对数据的平滑,或对缺失间断等部分的补偿。
与拟合不同的是,插值要求曲线通过所有的已知数据。计算插值有两种基本的方法:

  • 对一个完整的数据集去拟合一个函数;
  • 仿样内插法:对数据集的不同部分拟合出不同的函数,而函数之间的曲线平滑对接。

MATLAB插值函数interp1

参考链接:interp1

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

yq = interp1(x, y, xq, method, extrapolation)
  • x和y为已知输入样本;
  • xq为需要预测的自变量序列,yq为相对应预测的变量序列;
  • method为插值方法,包括’linear’、‘nearest’、‘next’、‘previous’、‘pchip’、‘cubic’、‘v5cubic’、‘makima’ 或 ‘spline’。默认方法为 ‘linear’;
  • extrapolation为外插相关设置。来计算落在 x 域范围外的点。如果希望使用 method 算法进行外插,可将 extrapolation 设置为 ‘extrap’。您也可以指定一个标量值,这种情况下,interp1 将为所有落在 x 域范围外的点返回该标量值。

注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。

举例1:

%{
    例如:在一 天24小时内,从零点开始每间隔2小时测得的环境温度数据分别为
            129910182428272520181513,
    推测中午12点(即13点)时的温度.
%}
x = 0:2:24;
y = [12   9   9   10   18  24   28   27   25   20  18  15  13];
a = 13;
y1 = interp1(x,y,a,'spline')
% 结果为:  27.8725

% 若要得到一天24小时的温度曲线,则:
xi = 0:1/3600:24;
% 插值点可以是向量,则返回的也就是对应的向量
yi = interp1(x,y,xi, 'spline');
plot(x,y,'o' ,xi,yi);

结果:
matlab interp1,MATLAB,matlab,算法,开发语言

举例2:基于粗略采样的正弦函数进行插值

clear
clc

x = 0:pi/4:2*pi;%一个正弦函数
y = sin(x);
xq = 0:pi/10:2*pi;%将查询点定义为 x 范围内更精细的采样点。

figure
yq1 = interp1(x,y,xq); % 线性
yq2 = interp1(x,y,xq,'nearest'); % 邻近
yq3 = interp1(x,y,xq,'spline'); % 三次样条

subplot(3,1,1);
plot(x,y,'ro',xq,yq1,'r-*','LineWidth',1);
xlim([0 2*pi]);
subplot(3,1,2);
plot(x,y,'ro',xq,yq2,'r-*','LineWidth',1);
xlim([0 2*pi]);
subplot(3,1,3);
plot(x,y,'ro',xq,yq3,'r-*','LineWidth',1);
xlim([0 2*pi]);

结果:
matlab interp1,MATLAB,matlab,算法,开发语言

举例3:在不指定样本点的情况下进行插值

v = [0  1.41  2  1.41  0  -1.41  -2  -1.41 0];%定义一组函数值。
xq = 1.5:8.5;%定义一组介于默认点 1:9 之间的查询点。在这种情况下,默认点为 1:9,因为 v 包含 9 个值。
vq = interp1(v,xq);%计算 xq 处的 v

figure
plot((1:9),v,'o',xq,vq,'*');
legend('v','vq');

结果:
matlab interp1,MATLAB,matlab,算法,开发语言
举例4:使用两种不同方法进行外插

x = [1 2 3 4 5];
v = [12 16 31 10 6];

xq = [0 0.5 1.5 5.5 6 8 10];%指定查询点 xq,这些查询点延伸到 x 的定义域以外。
vq1 = interp1(x,v,xq,'pchip');
vq2 = interp1(x,v,xq,'linear');
vq3 = interp1(x,v,xq,'linear','extrap');

结果:
matlab interp1,MATLAB,matlab,算法,开发语言
‘pchip’ 默认外插,但 ‘linear’ 不会。

举例5:


x = 0:2*pi;  
y = sin(x);  
xx = 0:0.5:2*pi;  

% interp1对sin函数进行分段线性插值,调用interp1的时候,默认的是分段线性插值  
y1 = interp1(x,y,xx,'linear');  
subplot(2,2,1);
plot(x,y,'o',xx,y1,'r')  
title('分段线性插值')  
  
% 临近插值  
y2 = interp1(x,y,xx,'nearest');  
subplot(2,2,2);
plot(x,y,'o',xx,y2,'r');  
title('临近插值')  
  
%球面线性插值  
y3 = interp1(x,y,xx,'spline');  
subplot(2,2,3);
plot(x,y,'o',xx,y3,'r')  
title('球面插值')  
  
%三次多项式插值法  
y4 = interp1(x,y,xx,'pchip');  
subplot(2,2,4);
plot(x,y,'o',xx,y4,'r');  
title('三次多项式插值')  

结果:
matlab interp1,MATLAB,matlab,算法,开发语言

python插值方法

我们一般用scipy库,里面的scipy.interpolate是插值模块。
SciPy的interpolate模块提供了许多对数据进行插值运算的函数,范围涵盖简单的一维插值到复杂多维插值求解。

当样本数据变化归因于一个独立的变量时,就使用一维插值;反之样本数据归因于多个独立变量时,使用多维插值。

这里简单介绍一维数据的插值。

内插值 interp1d():
一维数据的插值运算可以通过函数interp1d()完成。其调用形式如下,它实际上不是函数而是一个类:

interp1d(x, y, kind='linear', ...)

其中,x和y参数是一系列已知的数据点,kind参数是插值类型,可以是字符串或整数,它给出插值的B样条曲线的阶数,候选值及作用下表所示:
matlab interp1,MATLAB,matlab,算法,开发语言
interp1d比Matlab的interp有些优势,因为返回的是函数,不需要在事先设定需要求解的点,而是在需要使用时调用函数。

import numpy as np
from scipy import interpolate
from matplotlib import pyplot as plt

x=np.linspace(0,10,5)
y=np.sin(x)
xnew=np.linspace(0,10,101)
plt.plot(x,y,'ro', label="interpolating point")
list1=['linear','nearest']

for kind in list1:
    f=interpolate.interp1d(x,y,kind=kind)
    #f是一个函数,用这个函数就可以找插值点的函数值了:
    ynew=f(xnew)
    plt.plot(xnew,ynew,label=kind)
plt.plot(xnew,np.sin(xnew),label="real f(x)",linestyle="--")
plt.legend(loc='lower right')
plt.show()

结果:
matlab interp1,MATLAB,matlab,算法,开发语言

外插值:
可以使用UnivariateSpline进行外插值。
调用方式如下:

UnivariateSpline(x,y,w=None,bbox=[None,None],k=3,s=None)

x,y是X-Y坐标数组
w是每个数据点的权重值
k为样条曲线的阶数
s为平滑参数(s=0,样条曲线强制通过所有插值点)

x1=np.linspace(0,10,20)
y1=np.sin(x1)

sx1=np.linspace(0,15,100)
func1=interpolate.UnivariateSpline(x1,y1,s=0)
sy1=func1(sx1)
plt.plot(x1,y1,'o', label="interpolation points")
plt.plot(sx1,sy1, label="interpolation function")
plt.plot(sx1,np.sin(sx1), label="real function")
plt.legend()
plt.show()

结果:

matlab interp1,MATLAB,matlab,算法,开发语言
我们可以发现,在插值区间 [0,10] 之间,interpolation function 和 real function极为接近,但是一旦超出该区间,即外插值,插值的效果就会非常差。文章来源地址https://www.toymoban.com/news/detail-651290.html

到了这里,关于MATLAB插值函数interp1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Fluent UDF中调用Matlab矩阵运算函数(以二维插值为例)

    Fluent UDF中经常需要用到一些常见算法,例如插值、拟合、矩阵运算等等,这些在UDF中是没有现成函数实现的,理论上需要我们自己去写函数。另一方面我们又注意到这些运算恰恰是Matlab的强项,几乎调用一个现成的函数就完成了目的。所以我们有什么办法把Matlab函数给UDF直接

    2024年02月09日
    浏览(91)
  • 19.matlab数据分析插值(matlab程序)

    1. 简述        数据插值的计算机制 数据插值是一种函数逼近的方法。 一维插值 Y1=interp1(X,Y,X1,method) 二维插值 interp2():二维插值函数。 调用格式: Z1=interp2(X,Y,Z,X1,Y1,method) 其中,X、Y是两个向量,表示两个参数的采样点, Z是采样点对应的函数值。X1、 Y1是两个标量或向量,表示

    2024年02月16日
    浏览(35)
  • 22matlab数据分析 拉格朗日插值(matlab程序)

    1. 简述        第一部分:问题分析 (1)实验题目:拉格朗日插值算法 具体实验要求:要求学生运用拉格朗日插值算法通过给定的平面上的n个数据点,计算拉格朗日多项式Pn(x)的值,并将其作为实际函数f(x)的估计值。用matlab编写拉格朗日插值算法的代码,要求代码实现用户

    2024年02月15日
    浏览(40)
  • MATLAB-拉格朗日插值运算

    在结点上给出结点基函数,接着做该基函数的线性组合,组合的系数为结点的函数值,这种插值多项式称为拉格朗日插值公式。通俗地说,就是通过平面上的两个点确定一条直线。该插值方法是一种较为基础的方法,同时该方法也较容易理解与实现。 拉格朗日插值多项式的表

    2024年02月06日
    浏览(43)
  • MATLAB-三维插值运算

    MATLAB中是支持三维及三维以上的高维插值的。三维插值的基本原理与一维插值和二维插值是一样的,但三维插值是对三维函数进行的插值。在MATLAB中,使用interp3函数实现插值,其调用格式如下。 vi= interp3(x,y,z,v,xi,yi,zi) %返回值 vi是三维插值网格(xi,yi,zi)上的函数值估计,其中

    2023年04月10日
    浏览(31)
  • MATLAB-二维线性插值运算

    二维插值在图像处理和数据可视化方面得到了大量的应用,二维插值的基本原理与一维插值一样,但二维插值是对两个变量进行函数的插值。在MATLAB中,主要使用interp2()函数进行二维插值的实现,其调用格式如下, zi =interp2(z,xi,yi) %表示若 z=mxn,则x=1,y=1:m zi = interp2(z, ntimes) % 在

    2024年02月05日
    浏览(37)
  • Matlab的插值与拟合

    插值:在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。 拟合:拟合是指已知某函数的若干离散函数值,通过调整该函数中若干

    2024年02月03日
    浏览(30)
  • matlab抽取与插值

    什么是抽取? 我们假设一个数字信号 x ( n ) , n = 1 , 2 , . . . , N x(n),n=1,2,...,N x ( n ) , n = 1 , 2 , ... , N 共有 N N N 个点,抽取就是每个几个点抽1个点,比如2倍抽取,那么抽取后的信号为 y ( n ) , y ( 1 ) = x ( 1 ) , y ( 2 ) = x ( 3 ) , y ( 3 ) = x ( 5 ) , . . . , y ( N / 2 ) = x ( N − 1 ) y(n),y(1)=x(1),y

    2024年01月21日
    浏览(29)
  • 数学建模-插值算法(Matlab)

    注意:代码文件仅供参考,一定不要直接用于自己的数模论文中 国赛对于论文的查重要求非常严格,代码雷同也算作抄袭 如何修改代码避免查重的方法:https://www.bilibili.com/video/av59423231   //清风数学建模 简单来说是根据已知点进行线性数据预测,但数据太少需要通过数学方

    2023年04月26日
    浏览(58)
  • matlab使用教程(20)—插值基础

            插值是在位于一组样本数据点域中的查询位置进行函数值估算的方法。函数值是根据最接近查询点的样本数据点计算的。MATLAB 根据样本数据的结构,可以执行两种插值。样本数据可以形成网格,也可以是分散的。         网格化的样本数据使得插值更加高效,

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包