2012-05-10 6 views
1

MATLAB 함수를 사용하여 점과 곡선 사이의 최소 길이를 찾고 싶습니다. 커브는 매우 매끄럽지 않은 복잡한 함수로 설명됩니다. 그래서 나는 이것을 계산하기 위해 기존의 matlab 도구를 사용하기를 희망한다. 당신은 하나를 알게됩니까?MATLAB에서 점과 곡선 간의 최소 거리 찾기

답변

4

을 설명하는 t (또는 x)의 기능을 최소화하는 것입니다. 그래서 몇 가지 기본 아이디어를 설명하겠습니다.

커브가 알려진 비선형 함수 인 경우 기호 도구 상자를 사용하여 시작하십시오. 예를 들어, y = x^3-3 * x + 5 함수와 x, y 평면의 점 (x0, y0) = (4,3)을 생각해보십시오.

거리의 제곱을 적어주세요. 유클리드 거리는 쓰기 쉽습니다.

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

그래서 MATLAB에서는 심볼릭 도구 상자를 사용하여 부분적으로 수행 할 것입니다. 최소 거리는 1 차 미분의 루트에 있어야합니다.

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 

거리의 제곱입니다. 여기에서 목록의 마지막 루트로 최소화됩니다. x에 대한 최소 위치를 감안할 때 y (x) = x^3-3 * x + 5에 대한 식 대신에 y를 찾을 수 있습니다.

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

커브가 위와 같이 간단한 함수 형식으로 작성 될 수 있다면 상당히 쉽습니다. 비행기의 점 집합에서만 알려진 곡선의 경우 내 distance2curve 유틸리티를 사용할 수 있습니다. 주어진 점에 가장 가까운 n 차원에서 공간 곡선 스플라인 보간에 점을 찾을 수 있습니다.

다른 곡선의 경우 타원이라고하면 극좌표의 함수로 타원을 매개 변수 형식으로 쉽게 작성하는 극좌표로 변환하면 해결할 수 있습니다. 그 작업이 끝나면 이전과 마찬가지로 거리를 작성한 다음 파생어의 근원을 푸십시오.

해결하기 어려운 경우는 기능이 매우 원활하지 않은 것으로 설명됩니다. 이 잡음인가 아니면 차별화 할 수없는 곡선인가? 예를 들어, 큐빅 스플라인은 어떤 레벨에서는 "매우 부드럽 지 않다". 조각 별 선형 함수는 나누기가 덜 부드럽습니다. 실제로 약간의 노이즈가있는 데이터 요소 세트 만있는 경우 노이즈를 제거할지 여부를 결정해야합니다. 본질적으로 평탄한 근사값에서 가장 가까운 점을 찾거나 보간 된 곡선에서 가장 가까운 점을 찾으십니까?

데이터 포인트의 목록을 보려면 평활 보간법을 사용하여 distance2curve 유틸리티를 다시 선택하는 것이 좋습니다. 계산을 직접하고 싶다면 데이터 포인트가 충분하다면 가장 가까운 데이터 포인트 자체를 선택하면 좋은 근사값을 찾을 수 있지만 데이터가 매우 근접하지 않은 경우에는 근사치가 될 수 있습니다.

이러한 클래스 중 하나에 문제가없는 경우 다양한 방법을 사용하여 문제를 해결할 수 있지만 문제에 대한 자세한 내용은 도움이 필요합니다.

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);