9.2三维绘图(2) 9.2.5 用NaNs裁剪曲面
9.2.6 可视化向量场
9.2.7 矩阵可视化
9.2.8 三维图形的旋转
9.2.5 用NaNs裁剪曲面 如果曲面图的矩阵包含NaN,则不绘制这些元素。这使您能够切割(裁剪)表面的部分。例如,语句
[x y] = meshgrid (-2 :.2 :2 , -2 :.2 :2 ); z=x.* exp (-x.^2 - y.^2 ); c = z; % preserve the original surface c(1 :11 ,1 :21 ) = NaN*c(1 :11 ,1 :21 );%通过 c(1:11,1:21) = NaN * c(1:11,1:21) 将第一个区域的数据设置为 NaN。 %其中,1:11 表示行的范围,1:21 表示列的范围,将这个区域的值替换为 NaN。 mesh(c), xlabel('x-axis' ), ylabel('y-axis' )
要在Matlab中使用NaNs裁剪曲面,你可以使用NaN值来表示不需要显示的区域。NaN是一种特殊的数值,表示"不是一个数字"。
首先,你需要定义一个表示曲面的三维矩阵。这个矩阵的每个元素代表曲面上的一个点的高度或数值。然后,你可以使用NaN值来裁剪曲面。你可以将不需要显示的区域的高度或数值设置为NaN。例如,你可以使用以下代码来裁剪曲面的一部分:
% 定义网格的x、y坐标矩阵 x = linspace (-5 , 5 , 100 ); y = linspace (-5 , 5 , 100 ); [X, Y] = meshgrid (x, y);% 计算每个网格点的高度或数值 Z = sin (sqrt (X.^2 + Y.^2 )) ./ (sqrt (X.^2 + Y.^2 ));% 将不需要显示的区域的高度或数值设置为NaN Z(X < -2 | X > 2 | Y < -2 | Y > 2 ) = NaN;% 绘制裁剪后的曲面 surf(X, Y, Z);
这段代码会生成一个以sin函数为基础的曲面,并将x和y坐标在-2到2之外的区域的高度或数值设置为NaN。这样,这些区域就不会显示出来。
9.2.6 可视化向量场 函数quiver
可以绘制小箭头以指示梯度或其他向量场。虽然它生成的是2D图形,但通常与等高线图函数contour
一起使用,这就是为什么在此简要介绍它的原因。例如,考虑两个变量 的标量函数,V的梯度被定义为向量场.
以下表述用箭头表示 平面各点处 的方向
[x y] = meshgrid (-2 :.2 :2 , -2 :.2 :2 ); V = x.^2 + y; dx = 2 *x; dy = dx; % dy和dx一样大 dy(:,:) = 1 ; % dy和dx一样大,但都是1 contour(x, y, V), hold on quiver(x, y, dx, dy), hold off
“等高线”表示平面族;任何一点的梯度都垂直于经过该点的水平面。在等高线调用中需要向量x和y来指定等高线图的轴。
如果你不能(或不想)对V求导,你可以用梯度函数来估计导数:[dx dy] = gradient(V, 0.2, 0.2);
, 值0.2是近似值中使用的x和y方向的增量。
要在Matlab中可视化向量场,你可以使用quiver函数。quiver函数可以绘制二维向量场的箭头图。
首先,你需要定义表示向量场的x、y坐标矩阵和对应的向量矩阵。x、y坐标矩阵表示向量场中每个点的位置,向量矩阵表示每个点的向量。
然后,你可以使用quiver函数来绘制向量场。这个函数的输入参数包括x、y坐标矩阵、向量矩阵,以及可选的箭头长度和其他绘图选项。例如,你可以使用以下代码来绘制一个简单的向量场:
% 定义网格的x、y坐标矩阵 x = linspace (-5 , 5 , 10 ); y = linspace (-5 , 5 , 10 ); [X, Y] = meshgrid (x, y);% 计算每个网格点的向量 U = -Y; V = X;% 绘制向量场 quiver(X, Y, U, V);
首先,使用 linspace 函数创建了一个长度为 10 的线性间隔,范围从 -5 到 5。然后,使用 meshgrid 函数将 x 和 y 轴的坐标点组成一个二维矩阵。这样就创建了一个网格,其中每个点都有一个对应的 x 和 y 坐标。
接下来,根据需要定义了每个网格点的向量。在这个例子中,我们的向量场的每个向量都是垂直旋转的,即 x 分量为 y 坐标的负值,y 分量为 x 坐标的值。
最后,使用 quiver 函数绘制向量场。quiver 函数的第一个参数是网格点的 x 坐标,第二个参数是 y 坐标,第三个参数是 x 分量的值,第四个参数是 y 分量的值。这样,quiver 函数会根据给定的坐标和向量绘制出相应的向量场。
quiver的其他可选参数指定了箭头的长度。
可以使用 quiver
函数的可选参数来指定箭头的长度。下面是一个示例:
% 定义网格的x、y坐标矩阵 x = linspace (-5 , 5 , 10 ); y = linspace (-5 , 5 , 10 ); [X, Y] = meshgrid (x, y);% 计算每个网格点的向量 U = -Y; V = X;% 绘制向量场,并设置箭头长度为2 quiver(X, Y, U, V, 2 );
在这个例子中,我们在 quiver
函数的最后一个参数中设置了箭头的长度为 2。这样,绘制出的每个箭头都会按照指定的长度进行缩放。
除了箭头长度之外,quiver
函数还有其他可选参数,如箭头宽度、颜色、线型、缩放因子等。你可以根据需要进行调整。例如,要设置箭头的宽度为 1,可以将代码修改为:
quiver(X, Y, U, V, 2 , 'LineWidth' , 1 );
9.2.7 矩阵可视化 网格函数也可以用来“可视化”一个矩阵。下图由以下语句生成:
a = zeros (30 ,30 ); a(:,15 ) = 0.2 *ones (30 ,1 ); a(7 ,:) = 0.1 *ones (1 ,30 ); a(15 ,15 ) = 1 ; mesh(a)
矩阵 a 是 。中间的元素 是1,第7行的所有元素都是0.1,第15列的所有元素都是0.2 , 网格 然后将a的行和列解释为 坐标网格,值 形成点 上方的网格表面。
首先,你需要定义一个表示矩阵的二维矩阵。这个矩阵的每个元素代表矩阵中的一个值。
然后,你可以使用surf函数来绘制矩阵的3D图。这个函数的输入参数包括矩阵的x、y坐标矩阵和对应的z值矩阵,以及可选的颜色映射和其他绘图选项。例如,你可以使用以下代码来绘制一个简单的矩阵的3D图:
% 定义矩阵的x、y坐标矩阵 x = 1 :10 ; y = 1 :10 ; [X, Y] = meshgrid (x, y);% 定义矩阵的z值矩阵 Z = rand (10 , 10 );% 绘制矩阵的3D图 surf(X, Y, Z);
这段代码会生成一个以矩阵的值为基础的3D图。每个点的位置由x、y坐标矩阵确定,点的高度由z值矩阵确定。
补充说明: magic(10) 是一个 MATLAB 中的函数,可以生成一个 10x10 的矩阵,矩阵中的每一行、每一列以及对角线上的元素之和都相等,常被称为幻方。具体实现可以使用以下代码:
A = magic (10 )
运行后,MATLAB 会生成一个 10x10 的矩阵 A,矩阵中的元素如下所示:
A = 92 99 1 8 15 67 74 51 58 40 98 80 7 14 16 73 55 57 64 41 4 81 88 20 22 54 56 63 70 47 85 87 19 21 3 60 62 69 71 28 86 18 25 2 9 61 68 75 52 34 17 24 76 83 90 42 49 26 33 65 23 30 82 89 91 48 32 39 41 72 29 36 63 65 67 29 31 38 45 77 35 42 60 62 49 51 28 30 37 84 41 58 59 50 52 39 46 48 55 57
每一行、每一列以及对角线上的元素之和都等于 505。
再看一个示例使用surf
函数绘制3D图形:
% 创建一个示例矩阵 matrix = magic (10 );% 使用surf函数绘制3D图形 surf(matrix);
surf 在这个示例中,我们创建了一个示例矩阵matrix
,然后使用surf
函数绘制了该矩阵的3D图形。surf
函数会根据矩阵中的值,自动调整颜色和高度来表示数据的变化。
另外,如果你想要以网格形式绘制3D图形,可以使用mesh
函数。例如:
% 使用mesh函数绘制3D图形 mesh(matrix);
mesh
函数与surf
函数类似,但它以网格形式绘制图形,更加突出数据的结构。
mesh 9.2.8 三维图形的旋转 函数view可以指定你从哪个角度观察一个3D图形。为了看到它的操作过程,请运行以下程序,该程序将旋转可视化的矩阵图:
a = zeros (30 ,30 ); a(:,15 ) = 0.2 *ones (30 ,1 ); a(7 ,:) = 0.1 *ones (1 ,30 ); a(15 ,15 ) = 1 ; el = 30 ;for az = -37.5 :15 :-37.5 +360 mesh(a), view(az, el) pause(0.5 )end
函数view
接受两个参数。第一个参数az
是方位角或极坐标角度(以度为单位)。az
将视点(你)绕z
轴旋转,即绕图中的“顶点”(15,15)以逆时针方向旋转。az
的默认值为-37.5
度。因此,该程序以15度的步长逆时针方向绕z轴旋转视点,起始位置为默认位置。
view
的第二个参数是垂直仰角el
(以度为单位)。这是视点与x-y
平面成的角度。el
为90度表示你位于正上方。正值的仰角表示你在x-y
平面上方;负值表示你在x-y
平面下方。el
的默认值为30度。
命令pause(n)
会暂停执行n秒。
点击坐标轴,图形的轮廓将出现,帮助你可视化旋转。拖动鼠标以你想要旋转的方向。释放鼠标按钮后,旋转后的图形将重新绘制。
可以使用rotate3d
函数来实现三维图形的旋转。该函数允许你通过鼠标交互地旋转和缩放三维图形。
以下是一个简单示例:
% 创建一个示例的三维图形 [X, Y, Z] = sphere(30 );figure ; surf(X, Y, Z);% 启用三维图形的交互旋转 rotate3d on;
在这个示例中,我们使用sphere
函数创建了一个球面的三维图形,并使用surf
函数绘制出来。然后,通过调用rotate3d on
来启用三维图形的交互旋转功能。
当你运行这段代码并显示图形后,你可以通过鼠标在图形上点击并拖动来旋转图形。你还可以使用鼠标滚轮来进行缩放操作。
再看一个例子:
% 创建一个曲面对象 [X, Y, Z] = peaks(30 ); surf(X, Y, Z)% 设置旋转角度和轴向 angle = 45 ; % 旋转角度(以度为单位) axis = [1 , 1 , 0 ]; % 旋转轴向(x、y和z轴的组合) % 旋转曲面对象 rotate(gca, axis, angle )%"gca"是"get current axes"的缩写
在这个示例中,我们首先使用peaks
函数创建了一个曲面对象,并使用surf函数将其绘制出来。然后,我们设置了旋转角度为45度,并指定了旋转轴向为x、y和z轴的组合。最后,我们使用rotate函数来旋转曲面对象。
你可以根据自己的需求调整旋转角度和轴向,以及曲面对象的类型和属性。
补充 函数peaks是Matlab中的一个内置函数,用于生成一个二维或三维的山峰图。
在二维情况下,peaks函数生成一个二维高度图,其中x和y轴表示坐标,z轴表示高度。这个函数的语法是:
Z = peaks
这将生成一个51x51的矩阵Z,其中包含了山峰图的高度值。
在三维情况下,peaks函数生成一个三维山峰图,其中x、y和z轴分别表示坐标和高度。这个函数的语法是:
[X, Y, Z] = peaks
这将生成三个51x51的矩阵X、Y和Z,分别表示山峰图的x、y和z坐标。
peaks函数的输出可以用于绘制二维或三维的山峰图,例如使用surf函数绘制三维山峰图:
[X, Y, Z] = peaks; surf(X, Y, Z);