C# 从一点到该曲线的最短距离

C# 从一点到该曲线的最短距离,c#,geometry,linear-programming,C#,Geometry,Linear Programming,我需要找到多个点到以下形式曲线的距离:f(x)=a^(k^(bx)) 我的第一个选择是使用它的导数,使用一条与导数相反的直线,给它点的坐标,并与原始曲线相交。最后,我们用简单的几何计算点之间的距离 这是我通常遵循的数学过程。我需要节省时间(因为我在做一个遗传算法程序),所以我需要一个有效的方法来做到这一点。想法?点(c,d)和曲线之间的距离是函数的最小值 sqrt((c-x)^2 + (d-a^(k^(bx)))^2) 为了找到它的最小值,我们可以忽略sqrt,看看一阶导数。找出0的位置(必须

我需要找到多个点到以下形式曲线的距离:
f(x)=a^(k^(bx))

我的第一个选择是使用它的导数,使用一条与导数相反的直线,给它点的坐标,并与原始曲线相交。最后,我们用简单的几何计算点之间的距离


这是我通常遵循的数学过程。我需要节省时间(因为我在做一个遗传算法程序),所以我需要一个有效的方法来做到这一点。想法?

点(c,d)和曲线之间的距离是函数的最小值

sqrt((c-x)^2 + (d-a^(k^(bx)))^2)
为了找到它的最小值,我们可以忽略
sqrt
,看看一阶导数。找出0的位置(必须是最小距离,因为没有最大距离)。这将为您提供曲线上最近点的x坐标。要获得距离,您需要计算y坐标,然后计算到该点的距离(您只需计算该点处的距离函数,这是相同的)

对你的每一点重复

不幸的是,距离函数的一阶导数是一种婊子。使用,结果很有希望(如果我没有出现任何复制错误):


要找到从点到曲线的距离,这不是一个简单的任务,因为你需要找到函数的全局,其中f(x)是确定曲线的函数

对于这个目标,您可以使用:



这种方法在许多库中实现,比如,等等。

我认为使用导数是正确的,但是由于真正的导数在代码中可能会变得困难,所以可以伪造它,通过计算点(x,f(x))和(x+h,f(x+h))之间的短采样线来计算切线的斜率,其中h是一些很小的值。遗传部分可能会根据需要使h越来越小。如果点数较多(例如使用浮点数),由于计算复杂性,无法使用您的方法。如果你有很多点的话,强制所有点的id是不可能的。@zmbq你是说取(c-x)^2+(d-a^(k^(bx))^2的一阶导数?然后我找到导数等于0的地方,这会给我一个x,对吗?不是距离本身。我需要在原始方程中重新输入x并计算,对吗?如果他需要所有点和曲线之间的距离,我认为他没有选择的余地。@Fiire,是的,没错。我会详细说明的。
dist(x)/dx = 2(b * lna * lnk * k^(bx) * a^(k^(bx)) * (a^(k^(bx)) - d) - c + x)