MATLAB实战 | 不同形式的三维曲面图

通常,MATLAB中绘制三维曲面图,先要生成网格数据,再调用mesh函数和surf函数绘制三维曲面。若曲面用含两个自变量的参数方程定义,则还可以调用fmesh函数和fsurf函数绘图。若曲面用隐函数定义,则可以调用fimplicit3函数绘图。

01、三维曲面

1. 产生网格坐标矩阵

在MATLAB中产生二维网格坐标矩阵的方法是: 将x方向区间[a,b]分成m份,将y方向区间[c,d ]分成n份,由各划分点分别作平行于两坐标轴的直线,将区域[a,b]×[c,d]分成m×n个小网格,生成代表每一个小网格顶点坐标的网格坐标矩阵。例如,在xy平面选定一矩形区域,如图1所示,其左下角顶点的坐标为(2,3),右上角顶点的坐标为(6,8)。然后在x方向分成4份,在y方向分成5份,由各划分点分别作平行于两坐标轴的直线,将区域分成5×4个小矩形,总共有6×5个顶点。用矩阵X、Y分别存储每一个网格顶点的x坐标与y坐标,矩阵X、Y就是该矩形区域的xy平面网格坐标矩阵。

■ 图1网格坐标示例在MATLAB中,产生平面区域内的网格坐标矩阵有两种方法。

(1) 利用矩阵运算生成。例如,生成图5-24中的网格坐标矩阵,使用以下命令:

(2) 调用meshgrid函数生成二维网格坐标矩阵,函数的调用格式如下:

其中,输入参数x、y为向量,输出参数X、Y为矩阵。命令执行后,矩阵X的每一行都是向量x,行数等于向量y的元素的个数; 矩阵Y的每一列都是向量y,列数等于向量x的元素的个数。矩阵X和Y相同位置上的元素(Xij,Yij)存储二维空间网格顶点(i,j)的坐标。例如,生成图1中的网格坐标矩阵,也可以使用以下命令:

函数参数可以只有一个,此时生成的网格坐标矩阵是方阵,例如:

meshgrid函数也可以用于生成三维网格数据,调用格式如下:

复制代码
[X,Y,Z] = meshgrid(x,y,z)

其中,输入参数x、y、z为向量,输出参数X、Y、Z为三维数组。命令执行后,数组X、Y和Z的第一维大小和向量x元素的个数相同,第二维大小和向量y元素的个数相同,第三维大小和向量z元素的个数相同。X、Y和Z相同位置上的元素(Xijk,Yijk,Zijk)存储三维空间网格顶点(i,j,k)的坐标。

ndgrid函数用于生成n维网格数据,调用格式如下:

复制代码
[X1,X2,...Xn] = ndgrid(x1,x2,...xn)

其中,输入参数x1、x2、...、xn为向量,输出参数X1、X2、...、Xn为n维矩阵。例如:

对比前面meshgrid网格数据会发现,meshgrid网格数据进行转置即得到ndgrid网格数据。

2. mesh函数和surf函数

MATLAB提供了mesh函数和surf函数来绘制三维曲面图。mesh函数用于绘制三维网格图,网格线条有颜色,网格线条之间无颜色; surf函数用于绘制三维曲面图,网格线条之间的补面用颜色填充。surf函数和mesh函数的调用格式为:

Matlab 复制代码
mesh(x,y,z,c)
surf(x,y,z,c)

通常,输入参数x、y、z是同型矩阵,x、y定义网格顶点的xy平面坐标,z定义网格顶点的高度。选项c用于指定在不同高度下的补面颜色。c缺省时,MATLAB认为c=z,即颜色的设定值默认正比于图形的高度,这样就可以绘制出层次分明的三维图形。当x,y是向量时,要求x的长度等于矩阵z的列数,y的长度等于矩阵z的行数,x、y向量元素的组合构成网格顶点的x、y坐标。

【例1】已知

其中,x、y的40个值均匀分布在[-2,2]范围内,绘制三维曲面图。

程序如下

Matlab 复制代码
x = linspace(-2,2,40);
[xx,yy] = meshgrid(x);
zz = xx * exp(-(xx^2 + yy^2));
mesh(xx,yy,zz);
title('mesh');
xlabel('X');
ylabel('Y');
zlabel('Z');

程序运行结果如图2所示。mesh、surf函数的前两个参数x、y也可以是行向量或列向量,所以程序中的mesh函数也可以写成mesh(x,x,zz)。

■ 图2 三维曲面图

若调用surf、mesh函数时,省略前两个输入参数x、y,则把z矩阵的第二维下标当作x坐标,把z矩阵的第一维下标当作y坐标,然后绘制三维曲面图。例如:

Matlab 复制代码
>>t = 1 : 5;
>>z = [0.5*t;2*t;3*t];
>>mesh(z);

第二条命令生成的z是一个3×5的矩阵,执行mesh(z)命令绘制图形,曲面各个顶点的x坐标是z元素的列下标,y坐标是z元素的行下标。

此外,还有两个和mesh函数功能相似的函数,即meshc函数和meshz函数,其用法与mesh函数类似,不同的是meshc函数还在xy平面上绘制曲面在z轴方向的等高线,meshz函数还在xy平面上绘制曲面的底座。surf函数也有两个类似的函数,即具有等高线的曲面函数surfc和具有光照效果的曲面函数surfl。

【例2】在xy平面内选择区域[-8,8]×[-8,8],利用下列函数绘制4种形式的三维曲面图。

程序如下:

Matlab 复制代码
[x,y] = meshgrid(-8:0.5:8);
z = sin(sqrt(x^2+y^2))/sqrt(x^2+y^2);
subplot(2,2,1);
meshz(x,y,z);
title(meshz(x,y,z));
subplot(2,2,2);
meshc(x,y,z);
title(meshc(x,y,z));
subplot(2,2,3);
surfl(x,y,z);
title(surfl(x,y,z));
subplot(x,y,z);
title(surfc(x,y,z));

程序运行结果如图3所示。

■ 图3 4种形式的三维曲面图

相关推荐
Scott9999HH7 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社8 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海8 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖9 小时前
JDK 26 新特性详解
java·开发语言
马优晨10 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区11 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大12 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai12 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜12 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa13 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio