[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')

image

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

基于快速傅里叶插值

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

函数

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('原始数据','插值数据');

image

二维插值

二维插值是对于两变量函数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;

image
分隔区间可以用voronoi进行表示

voronoi(x,y)

image

常用特殊插值
特殊插值表述
convhull返回分散数据的凸面边界
convhulln返回n维分散数据的凸面边界
delaunay三角分析
delaunay3三维三角分析
delaunaynn维三角分析
dsearch查找delaunary三角形中与某一分散点最近的点
griddata二维方形栅格数据插值
griddata3三维方形栅格数据插值
griddatann维方形栅格数据插值
tetramesh绘n维分散数据中寻找包围一个数据点的delaunay三角形
voronoi对二维分散数据进行voronoi多边形分隔
voronoin对n维分散数据进行voronoi多边形分隔
matlab常用插值函数
插值函数描述
interp1一维插值函数
interp1q一维快速插值函数
interp2二维插值函数
interp3三维插值函数
interpft使用fft的一维插值
interpnn维数据插值
meshgrid产生三维函数x和y轴的索引矩阵
ndgrid产生多维函数的索引矩阵
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值