插值是在已知数据之间寻找估计值的过程
对于一维函数y=f(x)进行插值,主要分为
- 基于多项式插值
- 基于快速傅里叶插值
线性插值:
两个数据点之间的中间值都落在这两个数据点连成的直线上。数据点数目增多和数据点之间的距离缩短,都会使插值越来越精确。
inter1(x,y,x x,metstr)
返回长度和向量x相同的向量x x。函数f由向量x,y决定,形式y=f(x)。向量x必须按升序或者降序排列。
metstr的不同插值方法
- linear 线性插值
- nearest 最邻近插值
- spline 三次样条插值,外推法
- cubic 三次插值
对于sin($x^2$
)在区间[0,2]上20个函数值的表
x = linspace(0,2,20);
y = sin(x.^2);
valuve = interp1(x,y,[0 1/2 2],'spline')
plot(x,y)
hold on
plot([0 1/2 2],valuve,'r')
三次插值和样条插用于满足三阶多项式的数据之间的插值
原理:利用傅里叶变换把输入数据变换到频域,然后用更多的点进行傅里叶逆变换,结果是对数据的增采样
函数
interpft()函数
y = interpft(x,n)
对x进行傅里叶变换,然后采用n点的傅里叶逆变换回到时域。
x的长度为m,采样间隔为dx,则y的采样间隔是 dx∗m/n d x ∗ m / n
n值必须大于m。x为矩阵,函数在x的列上,返回结果与x列数相同,行数为n的向量
0到20对于y=cos(x)进行快速傅里叶插值
%一维快速傅里叶插值实现数据增采样
x = 0:2:20;
y = cos(x);
n = 2*length(x) - 1;
yi = interpft(y,n);
xi = 0:1:20;
hold on
plot(x,y,'r-*');
plot(xi,yi,'bo-.');
legend('原始数据','插值数据');
二维插值是对于两变量函数z=f(x,y)进行插值
matlab中的二维插值函数interp2
zi = interp2(x,y,z,xi,yi)
x,y,z决定z=f(x,y),返回值zi为xi,yi在函数f(x,y)上的值
zi = interp2(z,xi,yi)
若 z=n×m z = n × m ,则 x=1:n x = 1 : n , y=1:m y = 1 : m
zi = zi = interp2(z,ntimes)
在两点之间递归插值ntimes次
zi = interp2(x,y,z,xi,yi,method)
zi = interp2(x,y,z,xi,yi,method,extrapval)
method为插值方法,extropval为当数据超出原始数据范围时的一种外推方法
常用的插值方法
- 最邻近插值
method = 'nearest'
在已知数据的最邻近点设置插值点,对于插值点的数进行四舍五入。超出范围的点返回同一个NAN(Not a Number)
双线性插值
method = ‘linear’
未声明方法时,matlab的默认方法。插值点的值仅取决于最邻近的四个点的值
- 三次样条插值
method = 'spline'
采用三次样条函数来获得插值函数
- 双三次多项式插值
method = 'cubic'
例子:采用二次插值对于三维高斯型分布进行插值
[x,y] = meshgrid(-2:0.4:2);
z = peaks(x,y);
[xi,yi] = meshgrid(-1:0.2:1);
zi_nearest = interp2(x,y,z,xi,yi,'nearset');
zi_linear = interp2(x,y,z,xi,yi);
zi_spline = interp2(x,y,z,xi,yi,'spline');
zi_cubic = interp2(x,y,z,xi,yi,'cubic');
hold on;
subplot(2,3,1);
surf(x,y,z);
title('原始数据');
subplot(2,3,2);
surf(xi,yi,zi_nearest);
title('最邻近插值');
subplot(2,3,3);
surf(xi,yi,zi_linear);
title('线性插值');
subplot(2,3,4);
surf(xi,yi,zi_spline);
title('三次样条插值');
subplot(2,3,4);
surf(xi,yi,zi_cubic);
title('三次多项式插值');
figure; %新开绘图窗口
subplot(2,2,1);
contour(xi,yi,zi_nearest);
title('最邻近插值');
subplot(2,2,2);
contour(xi,yi,zi_linear);
title('线性插值');
subplot(2,2,3);
contour(xi,yi,zi_spline);
title('三次样条插值');
subplot(2,2,4);
contour(xi,yi,zi_cubic);
title('三次多项式插值');
对于没有规律的情况下的插值函数,在matlab中,可以利用delauany用于接受分散的数据点并返回一列数据的索引,用于表明各三角形的顶点。
分析一组随机数据:
x = randn(1,6);
y = randn(1,6);
t = delaunay(x,y);
hold on;
trimesh(t,x,y);
plot(x,y,'o');
hidden off;
voronoi(x,y)
特殊插值 | 表述 |
---|---|
convhull | 返回分散数据的凸面边界 |
convhulln | 返回n维分散数据的凸面边界 |
delaunay | 三角分析 |
delaunay3 | 三维三角分析 |
delaunayn | n维三角分析 |
dsearch | 查找delaunary三角形中与某一分散点最近的点 |
griddata | 二维方形栅格数据插值 |
griddata3 | 三维方形栅格数据插值 |
griddatan | n维方形栅格数据插值 |
tetramesh | 绘n维分散数据中寻找包围一个数据点的delaunay三角形 |
voronoi | 对二维分散数据进行voronoi多边形分隔 |
voronoin | 对n维分散数据进行voronoi多边形分隔 |
插值函数 | 描述 |
---|---|
interp1 | 一维插值函数 |
interp1q | 一维快速插值函数 |
interp2 | 二维插值函数 |
interp3 | 三维插值函数 |
interpft | 使用fft的一维插值 |
interpn | n维数据插值 |
meshgrid | 产生三维函数x和y轴的索引矩阵 |
ndgrid | 产生多维函数的索引矩阵 |