I need to return the two coordinates of intersection between a circle: f[0] = (x-h)^2 + (y-k)^2 -r^2 And a line: f[1] = y - y1 - m*(x - x1)
I have tried using fsolve, but I cannot pass the variables for (h,k,r,x1,y1), which I have. Is there a better way to solve these equations or is fsolve the standard.
Also, how do I get fsolve to return both coordinates of intersection rather than just the one.
答案 0 :(得分:2)
如@taras在这种情况下的评论中所述,您可以计算出精确的等式。
如果将f [1]代入f [0]并重新排列,就可以得到(如果我没有弄乱我的代数)
x^2(1+m^2) + x(-2*h + 2*m*y1 - 2*(m^2)*x1 - 2*m*k) + ((y1-m*x1 - k)^2 -r^2) = 0
您可以使用标准公式x = (-b +- sqrt(b^2 - 4*a*c))/(2*a)
,其中a
是x^2
的系数,b
是x^1
和c
的系数是常数。
值得注意的是,您不能保证会得到两个真实的答案。 如果直线不通过圆,您将得到2个复杂的答案;直线的两个相同答案相切地接触圆;如果将圆等分,则将得到两个真实答案。
答案 1 :(得分:1)
可以有零个,一个或两个交点。您是否考虑了所有三种可能性? Wolfram Alpha向您展示了这三种情况。
求解器将一次给您一分。
非线性求解器将进行初始猜测,并尽可能迭代收敛到解。如果您猜对了,收敛会很快。如果您猜错了,可能根本找不到解决方案。
更仔细地搜索Stack Exchange将会富有成果。 Math Exchange有this。
答案 2 :(得分:0)
您可以使用fsolve解决此问题,
from scipy.optimize import fsolve
def f1(x, y, h, k, r):
return (x - h)**2 + (y - k)**2 - r**2
def f2(x, y, x1, y1, m):
return y - y1 - m * (x - x1)
# Combine the functions in a form that can be consumed by fsolve
def f(x, x1, y1, m, h, k, r):
return (f1(x[0], x[1], h, k, r), f2(x[0], x[1], x1, y1, m))
h = 1
k = 2
r = 4
x1 = 0
y1 = 1
m = 3
# Using a made up initial starting point of (1,1)
x, y = fsolve(f, (1,1), (x1, y1, m, h, k, r))
# Verify that the solution results in zeros
print(f1(x, y, h, k, r))
print(f2(x, y, x1, y1, m))
要注意的一件事是f()函数将f1和f2的输出作为元组返回,因为需要匹配输入的尺寸。
fsolve的结果将成为方程式的解决方案之一(假设成功)。找到的解决方案将取决于所使用的初始条件。