[matlab]matlab中的简单插值计算

插值

插值是在已知数据之间寻找估计值的过程

一维插值

对于一维函数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')

[matlab]matlab中的简单插值计算_第1张图片

三次插值和样条插用于满足三阶多项式的数据之间的插值

基于快速傅里叶插值

原理:利用傅里叶变换把输入数据变换到频域,然后用更多的点进行傅里叶逆变换,结果是对数据的增采样

函数

interpft()函数

y = interpft(x,n)

对x进行傅里叶变换,然后采用n点的傅里叶逆变换回到时域。

x的长度为m,采样间隔为dx,则y的采样间隔是 dxm/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('原始数据','插值数据');

[matlab]matlab中的简单插值计算_第2张图片

二维插值

二维插值是对于两变量函数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]matlab中的简单插值计算_第3张图片
[matlab]matlab中的简单插值计算_第4张图片

特殊插值

对于没有规律的情况下的插值函数,在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;

[matlab]matlab中的简单插值计算_第5张图片
分隔区间可以用voronoi进行表示

voronoi(x,y)

[matlab]matlab中的简单插值计算_第6张图片

常用特殊插值
特殊插值 表述
convhull 返回分散数据的凸面边界
convhulln 返回n维分散数据的凸面边界
delaunay 三角分析
delaunay3 三维三角分析
delaunayn n维三角分析
dsearch 查找delaunary三角形中与某一分散点最近的点
griddata 二维方形栅格数据插值
griddata3 三维方形栅格数据插值
griddatan n维方形栅格数据插值
tetramesh 绘n维分散数据中寻找包围一个数据点的delaunay三角形
voronoi 对二维分散数据进行voronoi多边形分隔
voronoin 对n维分散数据进行voronoi多边形分隔

matlab常用插值函数

插值函数 描述
interp1 一维插值函数
interp1q 一维快速插值函数
interp2 二维插值函数
interp3 三维插值函数
interpft 使用fft的一维插值
interpn n维数据插值
meshgrid 产生三维函数x和y轴的索引矩阵
ndgrid 产生多维函数的索引矩阵

你可能感兴趣的:(matlab)