本节介绍 MATLAB 中三维曲线与曲面的绘制方法。二元函数 z = f(x, y) 在平面上等高线只能表示同一高度,若要直观观察曲面起伏,须使用三维图形。空间曲线可用 plot3;二元函数曲面需先用 meshgrid 构造网格,再对网格做点运算得到 Z,最后用 surf 或 mesh 绘制。

plot3:三维曲线

绘制空间曲线(例如螺旋线)时,用法与二维 plot 类似,但须同时提供三条等长的坐标向量 x、y、z:第 k 个点的空间位置是 (x(k), y(k), z(k)),点与点按顺序连成折线。

r = 1;              % 半径
h = 1;              % 螺距
t = 0:0.1:10*pi;    % 参数范围
x = r * cos(t);
y = r * sin(t);
z = h * t;
plot3(x, y, z)
xlabel('x'); ylabel('y'); zlabel('z')
grid on

t 是参数,x 与 y 在圆上转动,z 随 t 升高,于是得到螺旋线。线型与标记的指定方式与二维 plot 相同:

plot3(x, y, z, 'o')               % 圆点标记
plot3(x, y, z, '-o', 'MarkerSize', 6)

surf:曲面图

绘制二元函数曲面时,不能只用一条 x 向量。须先用 meshgrid 把横、纵取样点扩展成两张同尺寸的网格 X、Y:X 沿列变化横坐标,Y 沿行变化纵坐标,网格上每一个位置对应平面上一个 (x, y)。再对网格做逐元素运算得到同样尺寸的 Z:

[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X.^2 + Y.^2;      % 抛物面
surf(X, Y, Z)
xlabel('x'); ylabel('y'); zlabel('z')

X.^2 + Y.^2 必须写点乘方。若写成矩阵乘方,尺寸规则与曲面网格不符,通常会报错。内置函数 peaks 提供标准演示曲面,便于试验颜色与光照:

[X, Y, Z] = peaks(30);
surf(X, Y, Z)

mesh:线框网格图

相同网格数据下,mesh 仅绘制网格线、不填充面片,便于观察格子如何铺在曲面上:

[X, Y] = meshgrid(-2:0.1:2);
Z = sin(X) .* cos(Y);
mesh(X, Y, Z)

surf 为填充曲面,mesh 为线框形式,二者常对照使用。只传入一个范围时,meshgrid(-2:0.1:2) 对两个方向使用同一取样。

三维散点:scatter3

三个变量一一对应、彼此不连成曲线时,用 scatter3 画空间中的点,而不是 plot3 的折线:

n = 100;
X = randn(n, 1);
Y = randn(n, 1);
Z = randn(n, 1);
scatter3(X, Y, Z, '.')

曲面绘图前的网格

绘制曲面时通常先执行 [X, Y] = meshgrid(...),再对网格做逐元素运算(如 X.^2、sin(X).*cos(Y))。Z 必须与 X、Y 同尺寸。若省略 meshgrid,或该用点运算处写成矩阵运算,是三维绘图中最常见的报错来源。命令 axis equal 有助于按真实比例观察。

本节说明了 plot3、surf、mesh、scatter3 及 meshgrid 的配合方式。下一节介绍字符数组基础:char 类型、创建、索引与拼接。