Python 求解非线性方程组
我需要返回圆之间的两个交点坐标: f[0]=(x-h)^2+(y-k)^2-r^2 还有一句话: f[1]=y-y1-m*(x-x1) 我尝试过使用fsolve,但是我无法传递(h,k,r,x1,y1)的变量,我已经有了。有没有更好的方法来解这些方程,或者是F解的标准Python 求解非线性方程组,python,math,equation,nonlinear-optimization,Python,Math,Equation,Nonlinear Optimization,我需要返回圆之间的两个交点坐标: f[0]=(x-h)^2+(y-k)^2-r^2 还有一句话: f[1]=y-y1-m*(x-x1) 我尝试过使用fsolve,但是我无法传递(h,k,r,x1,y1)的变量,我已经有了。有没有更好的方法来解这些方程,或者是F解的标准 另外,如何让fsolve返回两个交点坐标,而不是一个 可以有零个、一个或两个交点。你是否考虑了这三种可能性?向您展示三个案例 解算器将一次为您提供一个点 非线性解算器将进行初始猜测,并在可能的情况下迭代收敛到解。如果你猜对了,收敛
另外,如何让fsolve返回两个交点坐标,而不是一个 可以有零个、一个或两个交点。你是否考虑了这三种可能性?向您展示三个案例 解算器将一次为您提供一个点 非线性解算器将进行初始猜测,并在可能的情况下迭代收敛到解。如果你猜对了,收敛会很快。如果你猜得不好,你可能根本找不到答案
更仔细地搜索堆栈交换将是富有成效的。数学交换有。您可以使用 需要注意的一点是,f()函数以元组的形式返回f1和f2的输出,因为它需要匹配输入的维度
fsolve的结果将是方程的一个解(假设成功)。找到的解决方案将取决于使用的初始条件。正如@taras在评论中所说的,在这种情况下,你可以算出一个精确的方程 如果你把f[1]替换成f[0]并重新排列,你会得到(如果我没有弄乱我的代数) 您可以使用标准方程
x=(-b+-sqrt(b^2-4*a*c))/(2*a)
,其中a
是x^2
的系数,b
是x^1
的系数,c
是常数
值得注意的是,你不能保证得到两个真正的答案。
如果直线没有穿过圆,你会得到两个复杂的答案;如果直线与圆相切,你会得到两个相同的答案;如果直线平分圆,你会得到两个真实的答案。这个问题不是简化为一个简单的二次方程吗?如果是,是什么阻止您精确求解?根据
fsolve
使用的算法,它找到的解通常取决于初始坐标。梯度下降法会找到最接近的解决方案。试着在你的情况下使用sympy,它会产生奇迹。
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))
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