питон: пересечение геометрических объектов в трехмерном пространстве - PullRequest
1 голос
/ 07 мая 2019

Определение задачи

Я пытаюсь вычислить точки пересечения геометрических объектов, таких как две плоскости и сфера, в питоне.Рассмотрим, например, эти три объекта:

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, но все равно возвращается только одно возможное решение (которое зависит от первоначального предположения):

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 голосов
/ 08 мая 2019

Я нашел решение с 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]

0 голосов
/ 07 мая 2019

fsolve от scipy, и все другие функции, которые я лично знаю, которые будут принимать любую форму функции ввода, будут возвращать одно значение.Одним из обходных путей, если у вас есть идея, где находится другое решение, было бы дать значение x0, которое ближе к второму решению, с помощью второго вызова fsolve (см. https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html).

Если вы альтернативно знаете, какой диапазон вы используетеЕсли вы хотите попытаться найти решения, самый простой способ - создать массив, который вы затем проверите, чтобы увидеть, где значение меняет знак (это будет сделано с нуля)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...