Как устранить отрицательные решения из результата `sympy.solve`? - PullRequest
0 голосов
/ 23 мая 2018

Как я могу заставить sympy.solve не возвращать отрицательные решения?

Кажется, что это другая задача, чем добавление ограничения типа positive=True к символу, для которого я решаю.Хотя

import sympy

x = sympy.symbols("x")
print(sympy.solve(x**2-4, x))

x = sympy.symbols("x", positive=True)
print(sympy.solve(x**2-4, x))

печатает

[-2, 2]
[2]

, как и ожидалось - я все равно получаю отрицательный результат решения для omega с

import sympy

omega, omega_0, gamma = sympy.symbols("omega, omega_0, gamma", real=True, positive=True)
zeta = 1/((omega_0**2 - omega**2)**2 + gamma**2*omega**2)

omega_R = sympy.solve(sympy.diff(zeta, omega), omega)
print(omega_R)

, который возвращает

[-sqrt(2)*sqrt(-gamma**2 + 2*omega_0**2)/2, sqrt(2)*sqrt(-gamma**2 + 2*omega_0**2)/2]

, хотя -sqrt(2)*sqrt(-gamma**2 + 2*omega_0**2)/2 никогда не будет положительным для действительных и положительных символов omega_0 и gamma.

В качестве альтернативы, каков наилучший способ устранения отрицательных решений после этого?

1 Ответ

0 голосов
/ 21 июня 2018

Система предположений SymPy недостаточно умна, чтобы понять, что -sqrt(2)*sqrt(-gamma**2 + 2*omega_0**2)/2 не может быть положительным, учитывая предположения real и positive для omega_0 и gamma (I открыл для нее проблему ).Чтобы быть в безопасности, SymPy фильтрует решения, только если знает, что у них не может быть данных предположений.Если система допущений дает None, что означает, что она не знает, она все равно ее включает.На данный момент вам лучше всего отфильтровать это решение вручную.

...