在MATLAB中找到点与曲线之间的最小距离

zel*_*ell 2 matlab numeric distance

我想使用MATLAB函数查找点和曲线之间的最小长度吗?曲线由不太平滑的复杂函数描述。因此,我希望使用现有的matlab工具进行计算。你碰巧认识一个吗?

小智 5

当有人说“它很复杂”时,答案也总是很复杂,因为我不知道您到底拥有什么。因此,我将介绍一些基本思想。

如果曲线是已知的非线性函数,则使用符号工具箱开始。例如,考虑函数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
Run Code Online (Sandbox Code Playgroud)

因此,在MATLAB中,我将使用符号工具箱部分完成此操作。最小距离必须位于一阶导数的根。

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
Run Code Online (Sandbox Code Playgroud)

我对复杂的根源不感兴趣。

r(imag(r) ~= 0) = []
r =
      -1.9126
      -1.2035
       1.4629
Run Code Online (Sandbox Code Playgroud)

距离平方的最小值是哪一个?

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

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

subs(P,r(3))
ans =
    6.9875
Run Code Online (Sandbox Code Playgroud)

这是距离的平方,此处通过列表中的最后一个根最小化。给定x的最小位置,我们当然可以通过代入y(x)= x ^ 3-3 * x + 5的表达式来找到y。

subs('x^3-3*x+5',r(3))
ans =
       3.7419
Run Code Online (Sandbox Code Playgroud)

因此,如果可以按上述简单的函数形式编写曲线,则相当容易。对于仅从平面中的一组点已知的曲线,可以使用我的distance2curve实用程序。它可以在n维的空间曲线样条插值上找到最接近给定点的点。

对于其他曲线(例如椭圆),解决方案也许最容易通过转换为极坐标来解决,在极坐标下,椭圆很容易以参数形式写成极角的函数。完成此操作后,像以前一样编写距离,然后求解导数的根。

一个难以解决的情况是该函数描述得不太平滑。这是噪声还是不可微曲线?例如,三次样条曲线在某种程度上“不太平滑”。分段线性函数在断点处的平滑度甚至更低。如果实际上只有一组数据点,其中包含一些噪声,则必须决定是否消除噪声。您是想在平滑近似上找到最接近的点,还是在插值曲线上寻找最接近的点?

对于数据点列表,如果您的目标是不进行任何平滑处理,那么不错的选择是使用线性插值的distance2curve实用程序。如果您想自己进行计算,那么如果您有足够的数据点,则可以通过简单地选择最接近的数据点本身来找到一个很好的近似值,但是如果您的数据间隔不是很近的话,这可能是一个很差的近似值。

如果您的问题不属于这些类别之一,您仍然可以经常使用多种方法来解决它,但是我需要了解有关该问题的更多细节才能获得更多帮助。