获取 matlab `surf` 以绘制该区域中不存在的函数

Get matlab `surf` to plot a function that doesn't exist everywhere in the region

我正在尝试使用 matlab 创建具有有限域的函数的表面图 [它是一个平方根,参数为负]。

x = [-2:0.02:4]
y = [-6:0.1:6]
[X,Y] = meshgrid(x,y)

如果我这样做

surf(X,Y,sqrt(9-(X-1).*(X-1)-Y.*Y/4))

我收到一条错误消息,因为该函数在椭圆之外是虚构的。所以我可以做

surf(X,Y,real(sqrt(9-(X-1).*(X-1)-Y.*Y/4)))

但在域外为 0。真的,我希望它根本不绘制任何东西。

我唯一的想法是修改 Y,以便对于每个 X,它仅限于定义函数的值。但我真的很想说“只是不要绘制这些部分”这样我就不必每次都计算域了。

利用图形例程通常忽略 NaN 的事实,您可以使用:

x = [-2:0.02:4];
y = [-6:0.1:6];
[X,Y] = meshgrid(x,y);
clear x y;

W=sqrt(9-(X-1).*(X-1)-Y.*Y/4);
Z=nan(size(W));
W_isreal=abs(imag(W))<=eps();
Z(W_isreal)=real(W(W_isreal));
clear W W_isreal;

surf(X,Y,Z);

请注意,此方法在 z=0 附近引入了难看的伪像:

一种更优雅的方法可以避免 z=0 附近的此类间隙:

[X,Y,Z]=ellipsoid(1,0,0,3,6,3);
surf(X,Y,Z);
zlim([0 Inf]);

% Verify computations
W=9-(X-1).*(X-1)-Y.*Y/4;
W_istruenegative=(W<=-1e-6);
if any(W_istruenegative(:))
  error('Our ellipsoid looks invalid.');
end
if any( abs(sqrt(abs(W(:))) - abs(Z(:))) > 1e-6 ) %verify ellipsoid
  error('Our ellipsoid looks invalid.');
end
clear W W_istruenegative;