Как выбрать положительное квадратное root выражение в SymPy решить? - PullRequest
0 голосов
/ 15 февраля 2020

Я вычисляю выражение для переменной (p2) в терминах других переменных (q1, q2, p1), решая выражение (гамильтониан = энергия). Метод решения возвращает два решения (положительное и отрицательное), соответствующие одному и тому же квадрату root. Ниже приведен пример кода:

state_symbols = ['q1', 'q2','p1','p2']
sympy_symbols = sp.symbols([tuple(state_symbols)])

hamiltonian = "(q1**2+q2**2+p1**2+p2**2)/(2)+ (q1**2*q2 - (q2**3)/(3))"
sys_fn = sp.sympify(sys_hamiltonian, evaluate=False)

sym_energy = sp.Symbol('energy')

expr_p2 = sp.solve(
            sys_fn - sym_energy, sympy_symbols[0][-1])

Теперь этот expr_p2 представляет собой список двух решений, одно из которых является положительным квадратом root. Как я могу утверждать, что я выбираю всегда положительный квадрат?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Самый простой верный способ - написать a,b=expr_p2; Piecewise((a, Gt(a, b)), (b, True)). Когда используются символы, SymPy должен быть каноническим, но канонический ответ может не поставить положительный ответ на 2-й:

>>> solve(a*x**2+b*x+c,x)
[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)]
>>> solve(-a*x**2+b*x+c,x)
[(b - sqrt(4*a*c + b**2))/(2*a), (b + sqrt(4*a*c + b**2))/(2*a)]

В первом случае большее значение root является первым, если значение a положительное, а в последнем второе, если a положительно.

0 голосов
/ 15 февраля 2020
pos_soln = max(expr_p2)

Это прямое и простое.

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