python:3D空间中的几何对象相交

时间:2019-05-07 18:44:12

标签: python math geometry

问题的定义

我正在尝试在python中计算几何对象(例如两个平面和一个球体)的相交点。 让我们考虑以下三个对象:

1
2
3

该系统提供了两种解决方案:
4
5

我想知道是否有一个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()

2 个答案:

答案 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]