Sympy - неправильное преобразование `solve()`

Прошу прощения, если это уже спрашивали.

Я только изучаю SymPy, и мне интересно, почему он не дает правильного ответа на то, что кажется простым уравнением.

from sympy.solvers import solve
from sympy import Symbol, simplify
from sympy.abc import x, alpha, sigma
alpha = Symbol('alpha')
x = Symbol('x')
sigma = Symbol('sigma')
solve((alpha - 0.5*(sigma**2))*((alpha + 0.5*(sigma**2)))**(-1)+ (1/7),sigma**2, simplify = True)

Он выдает [2.0* alpha], что, как я знаю, неверно. На самом деле ответ должен быть [2,6666*альфа] или что-то в этом роде. Я предполагаю, что SymPy по какой-то причине преобразует число 2,666 в целочисленную строку.

Как я могу решить эту проблему? Кроме того, есть ли способ получить дробную форму решения?


person Clarinetist    schedule 08.07.2014    source источник


Ответы (2)


Вы, вероятно, используете Python 2.7, поэтому 1/7 дает вам целочисленное деление:

>>> 1/7
0
>>> 1./7
0.14285714285714285
>>> solve((alpha - 0.5*(sigma**2))*((alpha + 0.5*(sigma**2)))**(-1)+ (1/7),sigma**2, simplify = True)
[2.0*alpha]
>>> solve((alpha - 0.5*(sigma**2))*((alpha + 0.5*(sigma**2)))**(-1)+ (1./7),sigma**2, simplify = True)
[2.66666666666667*alpha]

Если вам нужен дробный ответ, может быть, что-то вроде

>>> from sympy import Rational
>>> solve((alpha - (sigma**2)/2)*((alpha + (sigma**2)/2))**(-1)+ Rational(1,7),sigma**2, simplify = True)
[8*alpha/3]
person DSM    schedule 08.07.2014

Вы также можете использовать help(solve) для чтения строки документации по решению, в которой рассказывается, как использовать ключевое слово rational:

>>> solve(x-.3)
[0.300000000000000]
>>> solve(x-.3, rational=True)
[3/10]
person smichr    schedule 09.07.2014