问题的定义
我正在尝试在python中计算几何对象(例如两个平面和一个球体)的相交点。
让我们考虑以下三个对象:
该系统提供了两种解决方案:
我想知道是否有一个python库可以帮助开发求解器来计算这些交点。我正在寻找一种可以用作Wolfram alpha的东西,我们可以在其中输入三个方程式,并且当为简单起见,当存在有限数量的解时,它会返回所有可能的解。
我尝试过的事情
我尝试过使用SymPy,但返回[]
:
from sympy.solvers import solve
from sympy import Symbol
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
solve(z, x, x**2 + y**2 + z**2 -1)
然后,我尝试使用scipy
:
from scipy.optimize import fsolve
def f(x):
y = np.zeros(3)
y[2] = x[2]
y[0] = x[0]
y[1] = x[0] ** 2 + x[1] ** 2+ x[2] ** 2 - 1
return y
x0 = np.array([10, 10, 10])
solution = fsolve(f, x0)
print(solution[0],solution[1],solution[2])
,但它仅返回两个解决方案之一:
6.79746218330325e-28 1.0000000000000002 -2.3528179942097343e-35
我也尝试使用gekko
,并且stil它只返回一个可能的解决方案(取决于最初的猜测):
from gekko import GEKKO
m = GEKKO()
x = m.Var(value = 1)
y = m.Var(value = 1)
z = m.Var(value = 1)
m.Equation(x == 0)
m.Equation(z == 0)
m.Equation(x**2 + y**2+z**2 ==1)
m.solve()
答案 0 :(得分:0)
从scipy解析,我个人知道的所有其他函数将接受任何形式的输入函数,将返回一个值。 一种解决方法是,如果您知道另一个解决方案在哪里,则可以通过第二次调用fsolve来提供一个更接近第二个解决方案的x0值(请参见https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html)。
如果您另外知道要尝试在哪个范围内找到解决方案,最简单的方法是创建一个数组,然后检查该值在何处更改符号(这将从头开始)
答案 1 :(得分:0)
我找到了sympy
的解决方案。显然,它是仅有的(即使不是唯一)允许查找分析解决方案的库之一,并且返回的不止一个解决方案。另外,我们不需要将猜测作为初始变量传递。在我的问题中,我用sympy发布的示例中有一个错误。这是我解决系统的方法:
from sympy.solvers import solve
import sympy as sp
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
sp.solve([z , x, (x**2 + y**2 + z**2) - 1], x,y,z)
结果:[0,-1,0],[0,1,0]