题目
计算二维曲面函数 $z = \sin(x) \cos(y)$ 在网格点上的数值。对比使用双重嵌套循环为矩阵各点逐一赋值,与使用 <code>meshgrid</code> 结合点乘运算一次性生成全平面矩阵的过程。
输入格式:无需外部输入。
输出格式:输出使用 meshgrid 快速计算出的 3×3 子网格取值,并验证两种方式结果一致。
数据范围与约定:二维坐标网格。
思路与算法
1. meshgrid 工作机制
给定两个一维坐标轴向量 $x$ 与 $y$,[X, Y] = meshgrid(x, y) 会将 $x$ 行复制为网格横坐标矩阵 $X$,将 $y$ 列复制为纵坐标矩阵 $Y$。
2. 全平面向量化计算
有了 $X$ 和 $Y$ 之后,对整个二维空间的曲面计算只需直接代入公式:Z = sin(X) .* cos(Y)。代码从 20 行压缩到 2 行。
3. 三维绘图基础
后续所有三维表面图 surf(X, Y, Z)、等高线图 contour(X, Y, Z) 都必须以 meshgrid 生成的网格矩阵作为输入。
完整程序
% Octave / MATLAB 第59题:meshgrid 二维网格生成
x = linspace(-pi, pi, 3);
y = linspace(-pi, pi, 3);
% 1. meshgrid 向量化方法
[X, Y] = meshgrid(x, y);
Z_vec = sin(X) .* cos(Y);
% 2. 嵌套循环传统方法 (仅作逻辑对照)
Z_loop = zeros(length(y), length(x));
for i = 1:length(y)
for j = 1:length(x)
Z_loop(i, j) = sin(x(j)) * cos(y(i));
end
end
fprintf("X 坐标网格矩阵:\n");
disp(X);
fprintf("Y 坐标网格矩阵:\n");
disp(Y);
fprintf("计算得到的曲面矩阵 Z (meshgrid 法):\n");
disp(Z_vec);
fprintf("两方法最大绝对误差: %.2e\n", max(abs(Z_vec(:) - Z_loop(:))));运行示例
输出:
X 坐标网格矩阵:
-3.1416 0 3.1416
-3.1416 0 3.1416
-3.1416 0 3.1416
Y 坐标网格矩阵:
-3.1416 -3.1416 -3.1416
0 0 0
3.1416 3.1416 3.1416
计算得到的曲面矩阵 Z (meshgrid 法):
1.2246e-16 0 -1.2246e-16
-1.2246e-16 0 1.2246e-16
1.2246e-16 0 -1.2246e-16
两方法最大绝对误差: 0.00e+00