【问题标题】:How can I plot an intersection of two figures from fimplicit3 in MATLAB?如何在 MATLAB 中绘制来自 fimplicit3 的两个图形的交集?
【发布时间】:2017-04-06 21:44:48
【问题描述】:

我也在 mathworks 上问过,但那里仍然没有任何回复,所以这里可能有人会帮助我。

我有两个三个变量的隐式函数。我在 Matlab 中使用 fimplicit3 绘制了两个曲面(它出现在 R2016b matlab 中)。然后我想将它们相交并可视化结果。我该怎么做?有人可以帮忙吗?

例如

f = @(x,y,z) x.^2 - y^3 + z^2 - 4; 
fimplicit3(f);
grid on; hold on;
f = @(x,y,z) x.^4 + y.^3 - 0.005.*z.^2 + 0.3.*cos(x) + exp(y) + 2.3.*exp(z);
fimplicit3(f);

【问题讨论】:

  • This mathworks post 可能对您有所帮助。作为替代方案,您可以尝试使用符号求解器。
  • @m7913d 是的,我已经看到了,但我的案例是作者在帖子中所说的关于我不太了解的两个隐式曲面的交集的第三个案例
  • 你的问题可以很容易地转化为案例2。第一个函数可以明确:z = x.^2 - y
  • @m7913d 抱歉,这是我的错字。我现在更正了。所以我还是不能说清楚..

标签: matlab function plot intersection implicit


【解决方案1】:

您可以使用fsolve 将您的问题以数字形式转换为case 1 of this mathworks post

% definition & plotting of the implicit function
f1 = @(x,y,z) x.^2 - y.^3 + z.^2 - 4; 
H1 = fimplicit3(f1);
grid on; hold on;
f2 = @(x,y,z) x.^4 + y.^3 - 0.005.*z.^2 + 0.3.*cos(x) + exp(y) + 2.3.*exp(z);
H2 = fimplicit3(f2);

% solve both function for a desired meshgrid
[x, z] = meshgrid(linspace(-2, 2, 20), linspace(-2, 2, 20));
y1 = fsolve(@(y) f1(x, y, z), -2*ones(size(x)));
y2 = fsolve(@(y) f2(x, y, z), zeros(size(x)));

% apply case 1 of the mathworks post
ydiff = y1 - y2;
C = contours(x, z, ydiff, [0 0]);
xL = C(1, 2:end);
zL = C(2, 2:end);
yL = interp2(x, z, y1, xL, zL);
line(xL, yL, zL, 'Color', 'r', 'LineWidth', 3);

补充说明

  • 我创建了一个 x-z 网格,而不是 x-y 网格,因为 f1 不是 x-y 平面中的函数,即一个 (x, y) 点对应于多个 z 值,事实并非如此对于 (x, z) 点。

  • 请注意,改为实现案例 2 可能会有好处,因为这样您只需将 fsolve 应用于其中一个隐式函数。

  • 我转换了f1 以允许矢量化评估,即使用.^ 而不是^

  • y1 = fsolve(@(y) f1(x, y, z), -2*ones(size(x)));:对 (x, z) 的每个给定组合求解函数 f1 == 0y,每个 (x, z) 点的初始猜测值相同,均为 -2。

  • 初始猜测的选择:查看绘制的图表,估计一个好的起始值。如果fsolve 没有找到解决方案,请尝试更好/其他的起始值。 f1 由于该点处的平坦区域而从零开始卡住。

  • 网格平面的选择:搜索解唯一的平面,因为fsolve 只会返回一个值。

老问题(f1略有不同)

对于您的具体问题,最好的方法是将您的问题转换为case 1 of this mathworks post。第一个函数可以明确表示:z = x.^2 - y

一般来说,可以使用如下数值求解器评估特定网格 (x, y) 的每个隐式函数:

% definition & plotting of the implicit function
f1 = @(x,y,z) x.^2 - y + z; 
H1 = fimplicit3(f1);
grid on; hold on;
f2 = @(x,y,z) x.^4 + y.^3 - 0.005.*z.^2 + 0.3.*cos(x) + exp(y) + 2.3.*exp(z);
H2 = fimplicit3(f2);

% solve both function for a desired meshgrid
[x, y] = meshgrid(linspace(-4, 4, 40), linspace(-5, 0, 40));
z1 = fsolve(@(z) f1(x, y, z), zeros(size(x)));
z2 = fsolve(@(z) f2(x, y, z), zeros(size(x)));

% apply case 1 of the mathworks post
zdiff = z1 - z2;
C = contours(x, y, zdiff, [0 0]);
xL = C(1, 2:end);
yL = C(2, 2:end);
zL = interp2(x, y, z1, xL, yL);
is = zL > H2.ZRange(1);
line(xL(is), yL(is), zL(is), 'Color', 'r', 'LineWidth', 3);

【讨论】:

  • 是的,谢谢,但我现在更正了我的错字。不幸的是,通过这个更正它不起作用
  • 我也看不懂上面代码的这些部分:z1 = fsolve(@(z) f1(x, y, z), zeros(size(x))); & xL = C(1, 2:end); yL = C(2, 2:end);
  • 我编辑了我的答案并试图让它更清楚。另请参阅 fsolve 文档和 mathworks 帖子。请注意,xL = C(1, :); 也可能会起作用。
  • 是的,谢谢,现在我明白了。但是您仍然使用给定函数的特殊形式。但是,如果 f1 看起来像 exp(y^2) - sin(x^3) + cos(z^4) 并且 f2 也很复杂,我该怎么办?第二个问题是为什么你给第一个 fsolve “-2*ones(size(x))”?真的不明白这一刻,是什么决定了您对 fsolve 初始点的选择。不能解释一下吗?
  • 正如帖子中进一步指出的那样,您应该查看您的图表并尽可能多地帮助 Matlab (fsolve)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多