MATLAB实现线性插值interp1的功能

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

猜你喜欢

转载自blog.csdn.net/weixin_45915507/article/details/110423627
今日推荐