大家好,又见面了,我是你们的朋友全栈君。
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账号...