题目

计算二维曲面函数 $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