Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求解非线性方程组_Python_Math_Equation_Nonlinear Optimization - Fatal编程技术网

Python 求解非线性方程组

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返回两个交点坐标,而不是一个 可以有零个、一个或两个交点。你是否考虑了这三种可能性?向您展示三个案例 解算器将一次为您提供一个点 非线性解算器将进行初始猜测,并在可能的情况下迭代收敛到解。如果你猜对了,收敛

我需要返回圆之间的两个交点坐标: 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返回两个交点坐标,而不是一个

可以有零个、一个或两个交点。你是否考虑了这三种可能性?向您展示三个案例

解算器将一次为您提供一个点

非线性解算器将进行初始猜测,并在可能的情况下迭代收敛到解。如果你猜对了,收敛会很快。如果你猜得不好,你可能根本找不到答案


更仔细地搜索堆栈交换将是富有成效的。数学交换有。

您可以使用

需要注意的一点是,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