在曲线上找到与另一点相距给定距离的曲线上的点

时间:2019-08-08 20:23:33

标签: python scipy sympy curve integrate

我试图在曲线上找到一个点'p2',并且它与点'p1'相距'd'。

  • 曲线是二次方程a x ^ 2 + b x + c = y
  • 点p1在曲线上,让我们说(p1x,p1y)
  • 点p2在曲线上,但我们只知道其与p1的距离(沿曲线)为d。可以通过对'(1+(2 * a * x + b)^ 2)^(1/2)dx进行积分来计算曲线上的距离。在这里,期望从p1x到p2x对'(1+(2 * a * x + b)^ 2)^(1/2)dx'进行积分具有给定数k。 p2x未知。

我一直在使用循环查找要点。

from scipy import integrate

def integral(a, b, c, p1x, distance_between_p1_and_p2):
        x = lambda x:(1+(2*a*x+b)**2)**(1/2)
        best_i=0
        p2x=0
        for points_on_curve in range(int(p1x*1000),int((p1x+0.15)*1000),1):
                i,j  = integrate.quad(x,p1x,points_on_curve/1000)
                if abs(i-distance_between_p1_and_p2)<abs(best_i-distance_between_p1_and_p2):
                        best_i=i
                        p2x=points_on_curve/1000
        return p1x+p2x

这里的问题是,它要花很长时间,因为它从p1x开始并稍微增加了值,计算了从p1到电势p2的长度,并查看它是否比上一个更接近目标distance_between_p1_and_p2。

会不会有更好的编程方法?

2 个答案:

答案 0 :(得分:0)

我一直在努力,发现了两个解决方案。

首先,我使用了sympy.geometry.curve

from sympy.geometry.curve import Curve
x = sp. Symbol('x')
a = sp. Symbol('a')
b = sp. Symbol('b')
c = sp. Symbol('c')
start = sp. Symbol('start')
end = sp. Symbol('end')
print('length')
print(Curve((a*x**2+b*x+c, x), (x, start, end)).length)

我得到这个作为输出。

(end + b/(2*a))*sqrt(4*a**2*(end + b/(2*a))**2 + 1)/2 - (start + b/(2*a))*sqrt(4*a**2*(start + b/(2*a))**2 + 1)/2 + asinh(2*a*(end + b/(2*a)))/(4*a) - asinh(2*a*(start + b/(2*a)))/(4*a)

在这里,我可以使用等式。

from sympy import solve, sqrt, asinh, nsolve
end = sp.S('end')
a = -1
b = 0
c = 4
w3 = 1
length = 2

eq = sp.Eq((end + b/(2*a))*sqrt(4*a**2*(end + b/(2*a))**2 + 1)/2 - (w3 + b/(2*a))*sqrt(4*a**2*(w3 + b/(2*a))**2 + 1)/2 + asinh(2*a*(end + b/(2*a)))/(4*a) - asinh(2*a*(w3 + b/(2*a)))/(4*a),length)

我发现了两种求解方程的方法。

  1. 使用nsolve。即使我有两个答案,也只能给出一个答案。例如,如果有两个答案(a + sqrt(b),a-sqrt(b)),我猜这只能给出一个更接近Expected_value_to_start_search_answer的答案。

    print(sp.nsolve(eq,Expected_value_to_start_search_answer))

  2. 使用求解。这样可以给出所有可能的答案,但是比第一种方法要慢。

    sol = solve(eq,end) 打印(溶胶)

答案 1 :(得分:0)

您的目标点x, y位于抛物线以及p1周围的圆上,也就是说,它们都满足方程式

a x^2 + b x + c = y
(x - p1x)^2 + (y - p1y)^2 = r^2

您可以通过将第一个方程式中的lhs插入到第二个方程式中,从而消除y,并求解x的二次方程式。

相关问题