MATLAB实现线性插值interp1的功能

MATLAB实现线性插值interp1的功能1.关于插值插值,它根据已知的数据序列(也可以理解为坐标中一连串离散的点),找到其中的规律;然后根据找到的这个规律,来对其中尚未有数据记录的点进数值的估计。2.关于线性插值线性插值是一种针对一维数据的插值方法,它根据一维数据序列中需要插值的点的左右邻近两个数据点来进行数值的估计。当然了它不是求这两个点数据大小的平均值(当然也有求平均值的情况),而是根据到这两个点的距离来分配它们的比重的。而对于一些边缘处的点也需要使用到外插:即通过找出最近的两个点,通过建立该两点之间的一元一次线性方程通过带入x即可以得

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

1.关于插值

插值,它根据已知的数据序列(也可以理解为坐标中一连串离散的点),找到其中的规律;然后根据找到的这个规律,来对其中尚未有数据记录的点进数值的估计。

2.关于线性插值

线性插值是一种针对一维数据的插值方法,它根据一维数据序列中需要插值的点的左右邻近两个数据点来进行数值的估计。当然了它不是求这两个点数据大小的平均值(当然也有求平均值的情况),而是根据到这两个点的距离来分配它们的比重的。而对于一些边缘处的点也需要使用到外插:即通过找出最近的两个点,通过建立该两点之间的一元一次线性方程通过带入x即可以得到相应的y值。由于比较简单,以下代码没有用到太多matlab自带的内置函数。

函数说明:x0,y0为原始无序数据,但x0和y0的顺序是一一对应的,yq为需要对应于x求的线性插值。

function yq = linear_me(x0,y0,x)
 len_x =length(x);
 a = [x0,y0];
yq = zeros(len_x,1);
for i=1:len_x
    % 初始化距离x0中距离x最近的个点
    min_pos = inf;
    min_next_pos =inf;
    min_neg = -inf;
    min_next_neg = -inf;
    for j=1:length(a)
        if x0(j)-x(i) >=0   % 此时x0在x的右边
            if min_pos > x0(j)-x(i)
                min_pos = x0(j)-x(i);% 找出距离x0中距离x(i)中右方最近的数
                pos_y = y0(j);
            end
        else                  % 此时x0在x的左边
            if min_neg < x0(j)-x(i) % 找出距离x0中距离x(i)中左方最近的数
                min_neg = x0(j)-x(i);
                neg_y = y0(j);
            end
        end
    end
    %% 内插
    if min_pos~=inf && min_neg~=-inf
        k = (pos_y-neg_y)/(min_pos-min_neg);
        yq(i) = pos_y-k*min_pos;
        
    else
        %% 外插
        % --------------右外插 ------------- %
        if min_pos == inf
            for j=1:length(a)
                if min_next_neg < x0(j)-x(i) && x0(j)-x(i) ~= min_neg % 找出距离x0中距离x(i)中左方第二近的数
                    min_next_neg = x0(j)-x(i);
                    neg_next_y = y0(j);
                end
            end
            k1 = (neg_y-neg_next_y)/(min_neg-min_next_neg);
            yq(i) = neg_y-k1*min_neg;
            % ----------右外插 ----------------- %
            % -----------左外插----------------- %
        else
            for j=1:length(a)
                if min_next_pos > x0(j)-x(i) && x0(j)-x(i) ~= min_pos % 找出距离x0中距离x(i)中左方第二近的数
                    min_next_pos = x0(j)-x(i);
                    pos_next_y = y0(j);
                end
            end
            k2 = (pos_y-pos_next_y)/(min_pos-min_next_pos);
            yq(i) = pos_y+k2*min_pos;
            % -----------左外插 --------------- %
        end
    end
end
end

实现效果的检验:
编写test.m脚本进行测试:

% test.m
a=load('data_input.txt');
x0=a(:,1);
y0=a(:,2);
x=(0:0.01:1)';
y=interp1(x0,y0,x,'linear','extrap');
yq=linear_me(x0,y0,x);
figure
subplot(1,3,1)
plot(x0,y0,'bp')
title("原始数据图")
subplot(1,3,2)
plot(x,y,'*')
title("使用interp1-linear插值")
subplot(1,3,3)
plot(x,yq,'ro')
title("自编函数插值")

所得结果如下图所示,其中data.input.txt中x为0-1之间的无序数据,如有需要请评论区留言邮箱。
在这里插入图片描述

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 递归算法php,php递归算法经典实例「建议收藏」

    递归算法php,php递归算法经典实例「建议收藏」PHP递归算法就是函数调用函数了操作非常的简单了,我们下面来给各位介绍PHP递归算法及实际的一些关于递归的用法。递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲解,还是很难明白,直接上例子functiontest($n){echo$n.”…

    2022年8月11日
  • js删除数组中的一个元素_js数组包含某个元素

    js删除数组中的一个元素_js数组包含某个元素目录第一种:删除最后一个元素pop删除slice删除splice删除for删除length删除第二种:删除第一个元素shift删除slice删除splice删除第三种:删除数组中某个指定下标的元素splice删除for删除第四种:删除数组中某个指定元素splice删除filter删除forEach、m…

    2022年10月1日
  • Unity3d菜鸟入门的学习路线–笔记1

    Unity3d菜鸟入门的学习路线–笔记1最近刚刚开始接触unity3d,因此想把自己的学习路线记录下来,方便自己以后总结。由于毕业论文的关系,需要使用Unity3D开发,做虚拟现实的应用,使用的设备是HTCvivepro产品。初始学习,由于没有基础,因此一团乱,总结一下目前看过的教程和书籍。1、开始看的是b站上极客学院讲解的unity3d的入门课程,对操作的界面有了初步的了解,不需要看完,看到编程之前就可以。2、由于需要使用C#编程…

    2022年9月13日
  • eclipse代码自动补全设置_eclipse怎么运行安卓项目

    eclipse代码自动补全设置_eclipse怎么运行安卓项目打开Eclipse->Window->Perferences->Java->Editor->Content,最下面一栏auto-Activation会看到只有一个”.”存在。表示:只有输入”.”之后才会有代码提示,我们要修改的地方就是这里,可是Eclipse默认只允许输入4个自定义字符。先把上图中”.”的地方输入几个随便的字符,例如”aaaa…

    2022年10月15日
  • python3中urlopen_Python3 urlopen()用法示例[通俗易懂]

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家jb51.cc的小编两巴掌来看看吧!一.简介urllib.request.urlopen()函数用于实现对目标url的访问。函数原型如下:urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=N…

    2022年4月7日
  • 适配器模式详解

    适配器模式详解适配器模式,显而易见,灵感来源于笔记本电脑一类的适配器 模式动机 在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式。 通常情况下,客户端可以通过目标类的接口访问它所提供的服务。有时,现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。 在这…

    2022年7月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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