二维插值,简单来说就是节点二维、插值函数二维,形如 z = f ( x , y ) z=f(x,y) z=f(x,y)。
为什么要插值呢?假如我们要根据已知的二维数据来绘制对应的三维曲面图像,就需要很多点的x、y、z坐标,但给定的数据一般比较少,不能仅仅通过点数据画出三维图形。又或者要获取未知点的坐标值(大概的)。
网格节点,听命字就知道它是比较规则整齐的点了。相当于在
x
y
z
xyz
xyz平面内,一条条整齐的平行于
x
,
y
x,y
x,y轴的直线相交,再在
z
z
z轴方向对应一个值。
比如这样:
MATLAB插值命令:
z
=
i
n
t
e
r
p
2
(
x
0
,
y
0
,
z
0
,
x
,
y
,
′
m
e
t
h
o
d
′
)
z=interp2(x_{0},y_{0},z_{0},x,y,'method')
z=interp2(x0,y0,z0,x,y,′method′)
其中:
x
0
,
y
0
为已知节点
,
z
0
是对应的值;
x_{0},y_{0}为已知节点,z_{0}是对应的值;
x0,y0为已知节点,z0是对应的值;
x
0
,
y
0
分别为
m
纬、
n
纬向量,
z
为
m
⋅
n
矩阵;
x_{0},y_{0}分别为m纬、n纬向量,z为m\cdot n矩阵;
x0,y0分别为m纬、n纬向量,z为m⋅n矩阵;
x
,
y
是要插值的节点,
z
返回对应的插值得到的值;
x,y是要插值的节点,z返回对应的插值得到的值;
x,y是要插值的节点,z返回对应的插值得到的值;
m
e
t
h
o
d
是插值方法,和一维插值相同:
method是插值方法,和一维插值相同:
method是插值方法,和一维插值相同:
′
n
e
a
r
e
s
t
:
′
'nearest:'
′nearest:′最近项插值
′
l
i
n
e
a
r
:
′
'linear:'
′linear:′线性插值
′
s
p
l
i
n
e
:
′
'spline:'
′spline:′立方样条插值
′
c
u
b
i
c
:
′
'cubic:'
′cubic:′立方插值
例1:
close all
clear,clc
x=100:100:500; %已知节点数据
y=100:100:400;
z=[636 697 624 478 450
698 712 630 478 420
680 674 598 412 400
662 626 552 334 310];
pp=csape({x,y},z') %采用3次样条插值
xi=100:10:500;yi=100:10:400; %要插值的点
cz=fnval(pp,{xi,yi}); %返回字(xi,yi)处的值
[i,j]=find(cz==max(max(cz))) %找最高点的地址
x=xi(i),y=yi(j),zmax=cz(i,j) %求最高点的坐标
散乱节点:给出了一些3维空间数据点的x、y、z坐标,但不像网格节点
那样整齐。例1和例2一对比就明白了。
使用函数 g r i d d a t a ( ) griddata() griddata(),常见形式和简要说明如下:
(1)vq = griddata(x,y,v,xq,yq)
使 v = f(x,y) 形式的曲面与向量 (x,y,v) 中的散点数据拟合。griddata 函数在 (xq,yq) 指定的查询点对曲面进行插值并返回插入的值 vq。曲面始终穿过 x 和 y 定义的数据点。
(2)vq = griddata(x,y,z,v,xq,yq,zq)
拟合 v = f(x,y,z) 形式的超曲面。
(3)vq = griddata(___,method)
使用上述语法中的任何输入参数指定计算 vq 所用的插值方法。method 可以是 ‘linear’、‘nearest’、‘natural’、‘cubic’ 或 ‘v4’。默认方法为 ‘linear’。
(4)[Xq,Yq,vq] = griddata(x,y,v,xq,yq)
或[Xq,Yq,vq] = griddata(x,y,v,xq,yq,method)
还返回 Xq 和 Yq,其中包含查询点的网格坐标。
更多内容请查阅帮助文档。
例2:
close all
clc, clear
x=[129,140,103.5,88,185.5,195,105,157.5,107.5,77,81,162,162,117.5];
y=[7.5,141.5,23,147,22.5,137.5,85.5,-6.5,-81,3,56.5,-66.5,84,-33.5];
z=-[4,8,6,8,6,8,8,9,9,8,8,9,4,9];
xmm=minmax(x) %求x的最小值和最大值
ymm=minmax(y) %求y的最小值和最大值
xi=xmm(1):xmm(2); %指定查询点(插值点)
yi=ymm(1):ymm(2);
%使 v = f(x,y) 形式的曲面与向量 (x,y,v) 中的散点数据拟合。
% griddata 函数在 (xq,yq) 指定的查询点对曲面进行插值并返回插入的值 vq。
% 曲面始终穿过 x 和 y 定义的数据点。
zi1=griddata(x,y,z,xi,yi','cubic'); %立方插值
zi2=griddata(x,y,z,xi,yi','nearest'); %最近点插值
zi=zi1; %立方插值和最近点插值的混合插值的初始值
zi(isnan(zi1))=zi2(isnan(zi1)) %把立方插值中的不确定值换成最近点插值的结果
subplot(1,2,1), plot(x,y,'*')
subplot(1,2,2), mesh(xi,yi,zi)
matlab编程总会遇到很多没用过的函数,只要在MATLAB的命令行窗口
输入
help 函数名
就可以看到他的简要帮助文本。
比如查询griddata
这个函数的用法:
>> help griddata
griddata - 插入二维或三维散点数据
此 MATLAB 函数 使 v = f(x,y) 形式的曲面与向量 (x,y,v) 中的散点数据拟合。griddata 函数在 (xq,yq)
指定的查询点对曲面进行插值并返回插入的值 vq。曲面始终穿过 x 和 y 定义的数据点。
vq = griddata(x,y,v,xq,yq)
vq = griddata(x,y,z,v,xq,yq,zq)
vq = griddata(___,method)
另请参阅 delaunay, griddatan, interpn, meshgrid, ndgrid, scatteredInterpolant
griddata 的参考页
但使用doc 函数名
更好一些,会弹出一个帮助文档的窗口,这也是我常用的,里面还有很多例子,可以帮助你很好的理解。帮助文档里面可能有些内容是英文内容,但都很好理解,一读就能明白的。
matlab脚本分为脚本
和实时脚本
,后缀分别为.m
和.mlx
,类似于python文件中的普通py文件和notebook,大家可以试试matlab的实时脚本,.m文件中函数的补全可以通过Tab键完成,而.mlx会自动补全。还有其他更多的特性。
实时脚本如图所示:
matlab绘制三维图主要有3种类型:plot3、mesh、surf(当然pie3绘制3维饼图也算是个三维图吧,但他需要的数据仅仅是各个分类的数值,是一维数据),具体如下,更多内容可以自行查阅帮助文档。