8

如果我有两个由两个不同的方程定义的图:

x = 0:0.01:30;
y1 = x .^2 + 2;
y2 = x .^3 ;

我将它们绘制为

plot(x, y1, x, y2);

如何以编程方式在交叉点周​​围获得一个小环(如下图所示)?

在此处输入图像描述

4

5 回答 5

11

您必须手动找到交点 (p x , p y ):

idx = find(y1 - y2 < eps, 1); %// Index of coordinate in array
px = x(idx);
py = y1(idx);

请记住,我们正在比较浮点表示中的两个数字,因此y1 == y2我们必须设置一个容差来代替。我选择它为eps,但由您决定。

要围绕这个点画一个圆,你可以计算它的点然后绘制它们,但更好的方法是用一个放大的圆形标记绘制一个点(这个建议归功于Jonas ):

plot(px, py, 'ro', 'MarkerSize', 18)

这样,圆的尺寸不受坐标轴和绘图纵横比的影响。

例子

x = 0:0.01:30;
y1 = x .^ 2 + 2;
y2 = x .^ 3;

%// Find point of intersection
idx = find(y1 - y2 < eps, 1);
px = x(idx);
py = y1(idx);

figure
plot(x, y1, x, y2, px, py, 'ro', 'MarkerSize', 18)
axis([0 10 0 10])

这应该产生以下情节: 结果

于 2013-05-05T12:44:03.407 回答
2

在您的示例中,当您有 x、y1 和 y2 时,您可以做的是

idx = find(abs(y1 - y2) == min(abs(y1 - y2)));
xInter = x(idx)
yInter = y1(idx) % or y2(idx)

如果您有 x1, y1 和 x2, y2,其中 x1 ~= x2 您可以首先使用

yy2 = interp1(x2, y2, x1);

然后申请

idx = find(abs(y1 - yy2) == min(abs(y1 - yy2)));
xInter = x1(idx)
yInter = y1(idx) % or yy2(idx)
于 2014-07-29T06:25:14.340 回答
1

@EitanT 的优秀帖子,但是我想用一种不同的(自动)方法来补充这一点来找到交叉点(假设有一个并且图表表现得很好)。

这是我们的出发点:

x = 0:0.01:30;
y1 = x .^2 + 2;
y2 = x .^3 ;

首先,我们检查这些值是否完全相等,对于非浮点非离散情况,这应该足够了:

idx = find(y1==y2)

如果它们从未被记录为完全相等,则如果一个超过另一个,则会发生交集,因此我们看一下差异:

if isempty(idx)
  d = y1-y2;
  % At the moment of crossing, the sign will change:
  s = diff(sign(d));
  % Now just find the point where it changes
  f = find(s,1);
end

为了在没有额外变量的情况下以紧凑的形式总结这一点,我建议使用:

idx = find(y1==y2)
if isempty(idx)
idx = find(diff(sign(y1-y2)),1)
end
于 2013-08-20T10:14:59.977 回答
1

特别是在了解函数时,可以使用符号数学工具箱。

y1 = x .^2 + 2;
y2 = x .^3 ;
syms x real
intersection=simplify(solve(y1==y2))

用于vpa(intersection)将其转换为数字或double(intersection)将其转换为浮点值。

于 2015-11-04T18:21:04.100 回答
0

最后但并非最不重要的一点,也许最干净的方法是命令polyxpoly

[xi,yi] = polyxpoly(x,y1,x,y2)

xi = 1.69560153754948
yi = 4.87508921229275

祝你好运!

于 2018-09-14T14:09:56.947 回答