【问题标题】:How to use plot3 restrict to a certain region in Matlab?如何在 Matlab 中使用 plot3 限制到某个区域?
【发布时间】:2012-11-14 04:19:49
【问题描述】:

比如我要绘制函数

f(x,y) =sin(x^2+y^2)/(x^2+y^2),       x^2+y^2 <=4π

在 Mathematica 中,我可以这样做:

Plot3D[Sin[x^2 + y^2]/(x^2 + y^2), {x, -4, 4}, {y, -4, 4}, 
 RegionFunction -> (#1^2 + #2^2 <= 4 Pi &)]

RegionFunction 指定要绘制的 x,y 区域。

【问题讨论】:

  • 您是否尝试过搜索 3d 极坐标图:f(r) = sin(r^2)/r^2
  • @Rasman 但是如果该区域不是圆形区域?喜欢 |x|+|y|

标签: matlab wolfram-mathematica


【解决方案1】:

这是一个不是特别优雅的解决方案,它将您不想看到的区域的函数值设置为 -infinity。

[x, y] = meshgrid(-4:0.1:4, -4:0.1:4);
z = sin(x.^2+y.^2)./(x.^2+y.^2);
idx = x.^2 + y.^2 > 4*pi;
z(idx) = -Inf;
surf(x, y, z); axis vis3d;

编辑。实际上,如果您尝试使用更精细的网格(例如 -4:0.01:4)并添加 shading interp,它看起来还不错。

【讨论】:

  • MATLAB 在其内置函数中广泛使用Inf,所以我认为这里的优雅没有任何问题。
  • 同意 rwong。唯一的缺陷是Matlab生成的绘图的区域边缘没有Mathematica的那么平滑,
  • @Eastsun Re: 平滑度,这是因为 Mathematica 使用自适应采样,函数急剧变化的点较多,相对平坦的点较少。另一方面,在 MATLAB 中使用meshgrid 会均匀地对空间进行采样,并可能导致参差不齐,最终可能会丢失“有趣”的功能。您可以通过设置MaxRecursions -&gt; 0Mathematica 中复制它。将常规采样与MaxRecursions -&gt; 0here 和默认自适应采样here (MaxRecursions -&gt; 2) 进行比较。
【解决方案2】:

与 3lectrologos 的解决方案略有不同,重点是保持您想要的:

x = -4*pi:0.01:4*pi;
y = -4*pi:0.01:4*pi;
[X,Y] = meshgrid(x,y);
Clean = (X.^2 + Y.^2)<=4*pi;
Y = Y.*Clean;
X = X.*Clean;

X(~any(X,2),:) = [];
X(:, ~any(X,1)) = [];
Y(~any(Y,2),:) = [];
Y(:, ~any(Y,1)) = [];

F = sin(X.^2+Y.^2)./(X.^2+Y.^2);
mesh(X,Y,F)

请注意,在这种情况下,您需要确保 (0,0) 在您的解决方案配置文件中。

编辑:压缩矩阵以便于绘图

【讨论】:

  • 感谢您的帮助。不过,我更喜欢 3lectrologos 的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多