2012-05-10 32 views
1

MATLAB関数を使用して点と曲線の間の最小長さを求めたいですか?曲線は、非常に滑らかではない複雑な関数で記述されます。だから私はこれを計算するmatlabの既存のツールを使用することを願っています。あなたは一人知っていますか?MATLABの点と曲線の間の最小距離を見つけよう

答えて

4

を説明しているt(またはx)の機能を最小限にすることです。そこでいくつかの基本的な考え方について説明します。

曲線が既知の非線形関数である場合は、記号ツールボックスを使用して始めます。例えば、関数y = x^3-3 * x + 5、x、y平面の点(x0、y0)=(4,3)を考えてみましょう。

距離の2乗を書き留めます。ユークリッド距離は簡単に書くことができます。

(x - x0)^2 + (y - y0)^2 = (x - 4)^2 + (x^3 - 3*x + 5 - 3)^2 

だから、私はこれを記号的なツールボックスで部分的にやっていきます。最短距離は一次導関数の根にある必要があります。

sym x 
distpoly = (x - 4)^2 + (x^3 - 3*x + 5 - 3)^2; 
r = roots(diff(distpoly)) 
r = 
     -1.9126    
     -1.2035    
     1.4629    
     0.82664 + 0.55369i 
     0.82664 - 0.55369i 

私は複雑なルーツには興味がありません。

r(imag(r) ~= 0) = [] 
r = 
     -1.9126 
     -1.2035 
     1.4629 

距離の最小値はどちらですか?

subs(P,r(1)) 
ans = 
    35.5086 

subs(P,r(2)) 
ans = 
    42.0327 

subs(P,r(3)) 
ans = 
    6.9875 

これは距離の2乗で、ここではリストの最後のルートによって最小化されます。 xの最小位置が与えられれば、y(x)= x^3-3 * x + 5の式に置き換えてyを見つけることができます。

subs('x^3-3*x+5',r(3)) 
ans = 
     3.7419 

このように単純な関数形式で曲線を書くことができれば、かなり簡単です。平面上の点の集合からのみわかっている曲線については、私のdistance2curveユーティリティを使うことができます。与えられた点に最も近いn次元の空間曲線スプライン補間上の点を見つけることができます。

他の曲線、たとえば楕円については、おそらく極座標に変換することによって解が最も簡単に解決されます。楕円は極角の関数としてパラメトリック形式で簡単に書き込まれます。それが終わったら、前と同じように距離を書いてから微分の根を解いてください。

解決が困難なケースは、機能が非常に滑らかではないと記述されている場合です。このノイズはありますか、それとも微分できない曲線ですか?たとえば、キュ​​ービックスプラインはあるレベルでは「あまり滑らかではありません」。区分的線形関数は、ブレーク時に滑らかさが低下します。実際にノイズが含まれているデータポイントがある場合は、ノイズを滑らかにするかどうかを決める必要があります。本質的に平滑化された近似上の最も近い点を探したいのですか、補間された曲線上の最も近い点を探していますか?

データポイントのリストについては、スムージングを行わないことを目標とする場合は、直線補間を使用して、distance2curveユーティリティを再び使用することをお勧めします。計算を自分でやりたいのであれば、十分なデータポイントがあれば、最も近いデータポイント自体を選ぶだけで良い近似を見つけることができますが、データの間隔があまりない場合は近似値が貧弱です。

これらのクラスのいずれかに問題がない場合は、いろいろな方法で問題を解決できる場合がありますが、詳細については、さらに詳しい情報が必要です。

2

これについては、2つの方法があります。

t = (0:0.1:100)'; 
minDistance = sqrt(min(sum(bxsfun(@minus, [x(t),y(t)], yourPoint).^2,2))); 

:あなたの曲線が合理的に滑らかであり、あなたがあまりにも高い精度を必要としない場合に動作します

簡単な方法は、ポイントの密な数であなたの曲線を評価し、単に最小距離を見つけることです難しい方法は、誰かが私は決してあなたが持っている正確に何を知っていないので、「恋するベーカリー」の答えはいつも、あまりにも複雑になっていると言うとき、距離

distance = @(t)sum((yourPoint - [x(t),y(t)]).^2); 
%# you can use the minimum distance from above as a decent starting guess 
tAtMin = fminsearch(distance,minDistance); 

minDistanceFitte = distance(tAtMin); 
関連する問題