Solving Non-linear equations

时间:2018-07-24 10:14:22

标签: python math equation nonlinear-optimization

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.

3 个答案:

答案 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),其中ax^2的系数,bx^1c的系数是常数。

值得注意的是,您不能保证会得到两个真实的答案。 如果直线不通过圆,您将得到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的结果将成为方程式的解决方案之一(假设成功)。找到的解决方案将取决于所使用的初始条件。