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之间的无序数据,如有需要请评论区留言邮箱。
在这里插入图片描述

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

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

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

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

(0)


相关推荐

  • golang练手小项目系列(6)-使用map实现set

    golang练手小项目系列(6)-使用map实现set问题描述go没有提供set数据结构,请用map实现set要点需要支持方法:Add添加元素Remove删除元素Cardinality获取Set长度Clear清空SetContains检测元素是否在Set中Pop()随机删除一个元素并返回被删除的元素ToSlice()[]interface{}转换成slice返回拓展Clone复制SetDi…

    2022年10月29日
  • TOR架构_中国有多少大数据中心

    TOR架构_中国有多少大数据中心1、前言最近在看《云数据中心网络技术》,学习了企业数据中心网络建设过程,看到有ToR和EoR两种布线方式,之前没有接触过,今天总结一下。2、布线方式ToR:(TopofRack)接入方式就是

  • virus.win32.parite.H病毒的查杀方法

    virus.win32.parite.H病毒的查杀方法virus.win32.parite.H病毒的查杀方法昨天电脑中了virus.win32.parite.H病毒,搞了2个多小时最终搞定了。以下记录下我的解决方法。第一步:下载Win32.Parite病

  • 基础数论略讲

    基础数论略讲

  • EclipseSVN更新和提交

    EclipseSVN更新和提交EclipseSVN更新和提交阅读钱请先阅读前一篇文章:eclipse安装与SVN插件的安装以及分享和检出更多资源可关注好男人的微信公众号:“菜鸟资源分享”1、上部分结束后,此时我们在Tom_work中修改项目代码,完后提交到服务器端,在重新打开一个eclipse,工作空间选择Jeery_work,完后再Jeery_work点击更新(在点击更新前先将未修改的项目文件导入到eclipse中,…

    2022年10月10日
  • java 程序设计题库

    java 程序设计题库答题要求:单选题,每题只有一个正确答案,选择正确给分,不正确不给分。1、下面(A)数据类型可用于main()方法中传递的参数A、StringB、IntegerC、BooleanD、Variant2、以下的选项中能正确表示Java语言中的一个整型常量的是(B)A、12.B、-20C、1,000D、4563、下列的变量定义…

发表回复

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

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