我想在R3中具有代数表达式的表面上找到点B
f(x,y)= x ^ 3 + y ^ 2,
给定点A,因此点B在欧几里得距离中最接近,并且位于表面上。 [请注意,图中的表面不是x ^ 3 + y ^ 2,它仅是出于说明目的。
我不是Matlab用户,但是我发现函数fmincon或fminsearch可能是J. BAEK,A。DEOPURKAR和K. REDFIELD在此在线可访问paper中建议的方式(附录第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是一个有效的起点。
您撰写此问题时,可以使用fminsearch解决。前段时间,我基于Matlab的NURB工具箱编写了一个代码来解决您的问题。您可以用所需的函数替换NurbEval。
function [ncoord] = ProjectOnSurf(coord,surf)
%Computes the closest point to given point on a NURB surface.
f=@(lambda) FitQuality(coord(1:3),lambda,surf);
%Finde minimal distance
lambda=fminsearch(f,coord(3));
ck=NurbEval(edges{coord(5)},lambda)';
ncoord=[ck(1:2),lambda,2,coord(5)];
end
function out=FitQuality(x,lambda,surf)
if min(lambda)<0
out=norm([x,0]-NurbEval(surf,0)')+min(lambda)*-1;
elseif max(lambda)>1
out=norm([x,0]-NurbEval(surf,0)')+max(lambda);
else
out=norm([x,0]-NurbEval(surf,lambda)');
end
end