web-dev-qa-db-ja.com

2つの曲線の交点を表示する

2つの異なる方程式で定義された2つのプロットがある場合:

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

そして私はそれらを

plot(x, y1, x, y2);

プログラムで交差点の周りに小さなリングをどのように取得しますか(次のプロットのように)?

enter image description here

8
user2329401

交点を見つける必要があります(pバツ、py)手動で:

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

2つの数値を浮動小数点表現で比較しているので、y1 == y2の代わりに許容誤差を設定する必要があることに注意してください。 epsとして選択しましたが、それはあなた次第です。

この点の周りに円を描くには、その点を計算してからプロットできますが、より良いアプローチは、1つの点を丸いマーカーでプロットすることです(この提案の 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])

これにより、次のプロットが生成されます。 result

11
Eitan T

あなたの例では、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の場合、最初に1D補間を実行できます

yy2 = interp1(x2, y2, x1);

次に適用する

idx = find(abs(y1 - yy2) == min(abs(y1 - yy2)));
xInter = x1(idx)
yInter = y1(idx) % or yy2(idx)
2
nkukarl

@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
1

特に関数を知っているときは、シンボリック数学ツールボックスを使用できます。

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

vpa(intersection)を使用して数値に変換するか、double(intersection)を使用して浮動小数点値に変換します。

1
Daniel

最後になりましたが、おそらくこれを行う最もクリーンな方法は、コマンドpolyxpolyです。

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

xi = 1.69560153754948
yi = 4.87508921229275

幸運を!

0
Oliver Amundsen