【问题标题】:How can I find the point on a 3D surface closest to a point outside that surface?如何在 3D 表面上找到最接近该表面外点的点?
【发布时间】:2020-05-30 07:37:25
【问题描述】:

我想用代数表达式在 R3 的曲面上找到点 B

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

给定点 A,使点 B 在欧几里得距离上最近,并且位于曲面上。 [请注意,图上的曲面不是x^3 + y^2,仅供说明之用。

我不是 Matlab 用户,但我看到函数 fminconfminsearch 可能是 J. BAEK、A. DEOPURKAR 和 K 在此在线可访问的 paper 中建议的方法。 REFIELD(第 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 是一个有效的起点。

【问题讨论】:

  • 您还需要为 bx 定义一些 cosntrain,因为它必须在表面。对于任意B,您的等式将返回A==B。所以你在最小化公式中遗漏了一些东西。

标签: matlab optimization minimization


【解决方案1】:

正如你所写,这个问题可以用 fminsearch 解决。前段时间,我基于 NURB Toolbox for 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

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多