Как найти точку на трехмерной поверхности, ближайшую к точке вне этой поверхности? - PullRequest
0 голосов
/ 14 февраля 2020

Я хочу найти точку B на поверхности в R3 с алгебраическим c выражением

f (x, y) = x ^ 3 + y ^ 2,

заданной точки A, так что точка B находится ближе всего на евклидовом расстоянии и лежит на поверхности. [Обратите внимание, что поверхность на участке не x ^ 3 + y ^ 2, а только для иллюстративных целей].

enter image description here

I я не пользователь Matlab, но я вижу, что функция fmincon или fminsearch может быть способом к go, как предлагается в этой доступной онлайн газете от J BAEK, A. DEOPURKAR, K. REDFIELD (стр. 24, приложение). В качестве альтернативы я подумал о параметризации сферы по ее радиусу вокруг точки A и поиске ее первой точки касания к поверхности, но это породило бы еще много вопросов.

Для fmincon это кажется первым порядком вещей состоит в том, чтобы определить функцию, чтобы минимизировать, и это было бы математически Евклидово расстояние: так, если точка A находится в матрице и соответствует A (:, 1) и B определяется как (b1, b2, b3), формула свести к минимуму будет

(A (1,1) - b1) ^ 2 + (A (2,1) - b2) ^ 2 + (A (3,1) - b3) ^ 2

Как и в первом комментарии, поскольку B должен быть на поверхности, условие ограничения будет

b3 = b1 ^ 3 + b2 ^ 2.

Я не знать, как формализовать это в Matlab, и потребуется ли мне какая-то начальная точка для начала процесса, или A является допустимой начальной точкой.

1 Ответ

0 голосов
/ 14 февраля 2020

Как вы писали, эту проблему можно решить с помощью fminsearch. Некоторое время go я написал код, решающий вашу проблему, на основе NURB Toolbox для Matlab. Я просто немного упростил вашу проблему. В этом случае surf является функцией-дескриптором функции поверхности. Если у вас есть лучшая отправная точка, чем [0, 0], вы можете использовать ее вместо этого.

function Y = ProjectOnSurf(X,surf)
    %Computes the closest point to given point on a surface.
    f=@(lambda) norm(surf(lambda) - X)
    lambda=fminsearch(f,[0, 0]); %Find parameters for minimal distance
    Y=NurbEval(surf,lambda)'; %Solve function for parameters
end
...