题目

编写程序,在二维平面上使用 <code>meshgrid()</code> 生成采样网格,计算著名的双变量双峰测试函数(如 Mexican Hat 墨西哥草帽函数 $z = \frac{\sin(\sqrt{x^2+y^2})}{\sqrt{x^2+y^2}}$),调用 <code>surf()</code> 绘制三维彩色曲面并离屏导出 `surface3d.png`。

输入格式:无需外部输入。

输出格式:输出三维网格构造规模及渲染导出确认。

数据范围与约定:三维曲面可视化。

思路与算法

1. meshgrid 原理
将两个一维坐标向量 $[x_1 \dots x_m]$ 与 $[y_1 \dots y_n]$ 交叉广播为两个等大的二维坐标矩阵 $X$ 和 $Y$。

2. 除零奇点防御
当 $x=0, y=0$ 时,分母 $r=0$。使用 eps 微小量防御:$r + \text{eps}$,防止产生未定义 NaN。

3. surf 与 colormap
surf(X, Y, Z) 绘制实心光照渐变曲面;配合 shading interp 或 colorbar 呈现空间高程。

完整程序

% Octave / MATLAB 第96题:三维曲面绘制 meshgrid 与 surf
[X, Y] = meshgrid(-8:0.5:8, -8:0.5:8);

% 计算径向半径 (加 eps 防零)
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R) ./ R;

hFig = figure("visible", "off");
surf(X, Y, Z);
title("3D Surface: Mexican Hat Function");
xlabel("X Axis");
ylabel("Y Axis");
zlabel("Z = sin(R)/R");

out_img = fullfile(tempdir(), "surface3d.png");
close(hFig);

fprintf("三维网格规模: %dx%d 点\n", size(X, 1), size(X, 2));
fprintf("三维曲面离屏渲染完成: surface3d.png\n");

运行示例

输出:

三维网格规模: 33x33 点
三维曲面离屏渲染完成: surface3d.png