我试图在曲线上找到一个点'p2',并且它与点'p1'相距'd'。
我一直在使用循环查找要点。
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。
会不会有更好的编程方法?
答案 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)
我发现了两种求解方程的方法。
使用nsolve。即使我有两个答案,也只能给出一个答案。例如,如果有两个答案(a + sqrt(b),a-sqrt(b)),我猜这只能给出一个更接近Expected_value_to_start_search_answer的答案。
print(sp.nsolve(eq,Expected_value_to_start_search_answer))
使用求解。这样可以给出所有可能的答案,但是比第一种方法要慢。
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
的二次方程式。