2017-04-13 13 views
1

私は、2つの固定点の間に双曲線をプロットし、サンプル点をその近くのどこかに配置します。私は双曲線から標本点までの最短距離を見つけようとしています。暗黙関数のx、y値を抽出するもう1つの方法

サンプルポイントが2つの固定ポイントの中間にある場合を除いて、コードは機能します。双曲線が「くすんで」なり、値が存在しなくなるので、意味があります。しかし、plot_hyperbolaなどのスクリプトを使用すると、値は機能しますが、それを横切る2軸を除外することはできません。

ここでは、関数をプロットするためにezplotを使用していますが、サンプルポイントが途中にあるか、または半分近くにある場合、その値は存在しません。サンプルポイントが中央付近にあるときに値がまだ存在するexplotからx、y値を抽出する方法はありますか、それともezplotの問題ですか?そうであれば、x、y値を得るのが簡単な軸を持つ双曲線をプロットする別の方法がありますか?

ここに私のコードですが、aとbの値はx_sとy_sを使って計算されますが、私はそれを残しました。前もって感謝します!

% this is the sample point 
x_s = .5; y_s = .65; 
% this is determined using x_s y_s (omitted) 
a = .23; b = .35; 
h = @(x, y) ((x-.5).^2)/a^2 - ((y - 0).^2)/b^2 - 1; 
p = ezplot(h); 

% gets the x-y value of the hyperbola then I use this information 
tmp = get(p,'contourMatrix'); % issue: tmp 12 is empty with .5 
xdata = tmp(1,:); 
ydata = tmp(2,:); 

% stores the 2-norm of the value of hyperbola to the sample point 
% finds and calculates the shortest 2-norm, gets the index. 
distance = sqrt((xdata(1) - x_s)^2 + (ydata(1) - y_s)^2); 
index = 1; % stores the index of the smallest value 
for i = 2:size(tmp(1,:), 2) 
    if sqrt((xdata(i) - x_s)^2 + (ydata(i) - y_s)^2) <= distance % if found smaller value 
     distance = sqrt((xdata(i) - x_s)^2 + (ydata(i) - y_s)^2); 
     index = i; 
    end 
end 

答えて

1

次の回答は私の回答hereと似ています。あなただけの二次方程式の形であなたの双曲線の方程式を並べ替えることができます。

% this is the sample point 
x_s = .5; y_s = .65; 
% this is determined using x_s y_s (omitted) 
a = .23; b = .35; 
h = @(x, y) ((x-.5).^2)./(a^2) - ((y - 0).^2) ./ (b^2) - 1; 
% quadratic equation form 
h = @(x, y) (1/a^2)*x.^2 - (1/a^2)*x + (0.25/a^2 - ((y - 0).^2) ./ (b^2) - 1); 
y = linspace(-3,3,1000); 
A = (1/a^2); 
B = -(1/a^2); 
C = (0.25/a^2 - ((y - 0).^2) ./ (b^2) - 1); 
% solve regular quadratic equation 
dicriminant = B.^2 - 4*A.*C; 
xdata_1 = (-B - sqrt(dicriminant))./(2*A); 
xdata_2 = (-B + sqrt(dicriminant))./(2*A); 
xdata_1(dicriminant < 0) = nan; 
xdata_2(dicriminant < 0) = nan; 
y(dicriminant < 0) = nan; 
ydata = [y,nan,y]; 
xdata = [xdata_1,nan,xdata_2]; 
% plot 
plot(xdata,ydata,'b') 
distances = sqrt((xdata(:) - x_s).^2 + (ydata(:) - y_s).^2); 
[distance,index] = min(distances); 
hold on; 
plot([x_s xdata(index)],[y_s ydata(index)],'*r-') 

enter image description here

+0

はありがとうございました!ちょうど1つの質問ですが、双曲線をm単位上にシフトすると、(y - m)^ 2/b^2となります。一般的な形に拡張すると、これはCの項に影響を及ぼしますか?最後に、これを垂直双曲線に使用すると、xとyが切り替わる以外はあまり変化しません。 –

+0

また、指定することを忘れてしまった、指定されたaとbの値は、この双曲線の形状に相対的ではありません。双曲線が触れたり走ったりするはずなので、サンプルポイントが中央にある場合、双曲線は実際には平坦であると考えられます。私が持っていた問題は、ポイントが未定義だったか、これはここで同じですか、それともxyポイントのペアを生成することが保証されますか? –

+0

1.はい、あなたが見ることができるように、 'C'用語の一部です。はい。 3.双曲線が存在すれば、一対のxy点を生成することが保証される。 – user2999345

関連する問題