Python 寻找计算两条曲线之间距离的解决方案

Python 寻找计算两条曲线之间距离的解决方案,python,dataframe,numpy,Python,Dataframe,Numpy,我需要计算两条曲线之间的最小和最大距离(正常) i、 e.一条曲线上的点与另一条曲线上的点垂直。 到目前为止我所做的: from sympy import * from pandas import DataFrame init_printing(use_unicode=False, wrap_line=False) x = Symbol('x') F=x+1 #first curve G=x**2 #second curve #on the interval [1:5] My_list =n

我需要计算两条曲线之间的最小和最大距离(正常) i、 e.一条曲线上的点与另一条曲线上的点垂直。 到目前为止我所做的:

from sympy import *
from pandas import DataFrame
init_printing(use_unicode=False, wrap_line=False)
x = Symbol('x')

F=x+1 #first curve
G=x**2 #second curve
#on the interval [1:5]

My_list =np.transpose( [np.arange(1, 5, 1)] )
df = DataFrame(My_list, columns=['x']) # x array to data frame
df['yF'] = df['x']+1  #adding first function
df['yG'] = df['x']** 2 #adding second function
df['r']= abs(df['yF']-df['yG']) #calculating distance
df.describe()  #to look min-max

问题是:距离不是真正垂直于曲线的距离。。。解决方案看起来不是最优的。

您没有找到垂直距离。您正在查找具有固定x值的y值的最小值。您的步骤需要如下所示:

  • 找到其中一条曲线的所有垂直线
  • 在另一条曲线上找到相应的交点
  • 计算距离
  • 请注意,此方法不是可交换的,从f到g的垂直距离可能与从g到f的垂直距离不同。这是因为不能保证,如果一条直线垂直于曲线f,它也必须垂直于曲线g

    一些数学:

  • F的导数是1
  • G的导数是2*X
  • 点X处Y=X+1的垂直线为Y=-X+(2*X+1)
  • 点X处Y=X**2的垂线为Y=-1/(2*X)*X+(X**2+0.5)
  • 交点可以有多个解
  • 我将在努比演出

    import numpy as np
    
    #Functions, d is the derivative
    F  = lambda x : x+1  
    dF = lambda x : np.ones(x.shape)
    G  = lambda x : x**2
    dG = lambda x : 2*x
    
    #Domain
    X  = np.arange(1,5,1)
    
    #We calculate the distance from G to F
    P_m = -1/dG(X)                                  #Perpendicular slopes
    P_b = X**2+0.5                                  #The y-intercept
    C   = (2*X**3-X)/(2*X+1)                        #The x-coor of the intersection
    D   = np.sqrt((X-C)**2+((P_m*X+P_b)-F(C))**2)   #Distance
    print(D.min())
    
    #Now the other way (this way has two intersection points). 
    P_m = -1/dF(X)                                  #The perpendicular slopes 
    P_b = 2*X+1                                     #The y-intercepts 
    C1  = 0.5*(-P_m+np.sqrt(P_m**2+4*P_b))          #First solution
    C2  = 0.5*(-P_m-np.sqrt(P_m**2+4*P_b))          #Second solution 
    D1  = np.sqrt((X-C1)**2+((P_m*X+P_b)-G(C1))**2) #Euclidian distance to first solution
    D2  = np.sqrt((X-C2)**2+((P_m*X+P_b)-G(C2))**2) #Euclidian distance to second solution
    D   = np.concatenate([D1,D2])                   #Distance
    print(D.min())                                  #Minimum distance
    

    首先你需要学习数学,然后你可以编程。你能更详细地解释一下:'点X处Y=X+1的垂线是Y=-X+(2*X+1)。-你是如何计算的?这个‘P_m=-1/dG(X)’我想如果我们有F第一个函数和X的数组,我们可以计算垂直线的起点。然后我们有垂直线函数和第二个G函数。我们可以解这个方程组,并且在直线和G函数之间有交集。最后知道两点我们可以计算距离这是一个数学问题而不是堆栈溢出问题。通常,如果两条直线L1和L2以直角相交,且L1的坡度为m,则L2的坡度必须为-1/m。这是关于直线的已知事实,也是求曲线垂直度的基础。一般来说,对于任何曲线,Y=F(X),如果我们在曲线上固定一个点,Y=F(X),那么该点的垂线是Y-Y=(-1/dF(X))*(X-X)。这就是所谓的坡度截距公式(google it)。