获取 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;
我正在尝试使用 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;