【转】线性插值(Linear Interpolation)基本原理
转:https://blog.csdn.net/u010312937/article/details/82055431
今天在阅读大牛代码的时候,发现了Linear Interpolation一次,百度之,学习之,记录于此。
1.关于插值:
插值,是根据已知的数据序列(可以理解为你坐标中一系列离散的点),找到其中的规律,然后根据找到的这个规律,来对其中尚未有数据记录的点
进行数值估计。
应用有:
1)对数据中的缺失进行合理补偿
2)对数据进行放大或缩小
3)其他 (围笑(* ̄︶ ̄))
2.线性插值:
线性插值是针对一维数据的插值方法。它根据一维数据序列中需要插值的点的左右临近两个数据来进行数值估计。当然了它不是求这两个点数据大小的
平均值(在中心点的时候就等于平均值)。而是根据到这两个点的距离来分配比重的。
维基百科上图:
已知点(x0,y0)、(x1,y1)求取插值点x处的y.推导过程如下:
我在大牛的代码里发现他是这样写的,很有美感:
由于( y-y0)/(x-x0)=(y1-y0)/(x1-x0)
所以变换一下:(x-x0)/(x1-x0)=(y-y0)/(y1-y0)=k
那么:y=(1-k)*y0+k*y1
比较方便记忆
3.线性插值举例:
问: 假如一天中,我测得了其中7个时间点的温度。1点、3点、8点、12点、15点、20点、24点摄氏度分别是8、9、16、23、22、18、10。请问用线性插值的方法得到这一天中1点到24点之间其他时间点的温度该怎么做?
注:线性插值是属于内插法,要去求这一天1点到24点以外的数据就不行了
法一:matlab有插值函数,interp1()
time = [1 3 8 12 15 20 24]; tem = [8 9 16 23 22 18 10]; time_i = 1:0.01:24; tem_i = interp1(time,tem,time_i,\'linear\'); plot(time,tem,\'o\',time_i,tem_i);
运行结果:
其中,如果你想知道其中的几个点的温度,修改变量time_i就可以了。对应于time_i的温度值存放着在tem_i变量中。
或者是根据插值原理自己来写函数:
%自己写一个interp1类似功能的接口 %在这个接口中参数x需要从大到小排列,y随意 function [yi]=self_interp1(x,y,xi,method) % 初始化yi,给它xi对应的列 col_xi = size(xi,2); yi = zeros(1,col_xi); % 检测使用的插值方法 这里期望的是\'linear\' if strcmp(method,\'linear\') % 找到每个xi在x序列中的位置 col_x = size(x,2); for i = 1:col_xi, for j = 1:col_x-1, % 假如需要计算插值公式 if x(j+1) > xi(i), yi(i) = y(j)+(y(j+1)-y(j))/(x(j+1)-x(j))*(xi(i)-x(j)); break; end % 假如插值处的数据已经测得了,就直接把值给它,节约计算资源 if x(j) == xi(i), yi(i) = y(j); break; end end % 以上没有把最后一个数据点考虑进去,需要加上 yi(col_xi) = y(col_x); end else error(\'插值方法请选择(linear)\n\'); end end
然后进行调用:
time = [1 3 8 12 15 20 24]; tem = [8 9 16 23 22 18 10]; time_i = 1:0.01:24; tem_i = self_interp1(time,tem,time_i,\'linear\'); plot(time,tem,\'o\',time_i,tem_i);
结果跟上图一样。