sympy квадратные корни: лучший способ выполнять операции над рациональными числами?

Поскольку я хочу, чтобы квадратные корни были упрощены, я столкнулся с этим обходным путем:

from sympy import sqrt, factor, simplify

_sqrt = sqrt
sqrt = lambda x: factor(simplify(_sqrt(x)))

# do maths operations with sqrt...

Но это слишком медленно, и я не думаю, что это самый подходящий метод, который можно использовать. Итак, есть ли другой способ работать с квадратными корнями и упрощать их - автоматически -


person Amin Guermazi    schedule 19.04.2021    source источник
comment
Каким образом вы хотите, чтобы они были упрощены? SymPy уже представляет их в простейшей форме.   -  person smichr    schedule 19.04.2021
comment
Нет, это не так. Проверьте здесь   -  person Amin Guermazi    schedule 20.04.2021


Ответы (1)


SymPy автоматически упрощает рациональные аргументы до sqrt, но можно написать рациональные аргументы таким образом, чтобы они не были явно рациональными (как в вашем предыдущем посте):

>>> eq
sqrt((-9/10 + 6*sqrt(3)/5)**2 + (6/5 + 9*sqrt(3)/10)**2)

sqrt только упростит явный аргумент Rational. Расширение основания аргумента показывает, что это Рационал, и sqrt упростит его:

>>> eq.base.expand()
9
>>> sqrt(9) == 3
True

Лучше, чем expand, в тех случаях, когда вам нужно сгладить выражение, включающее степени, является функция _mexpand:

>>> from sympy.core.function import _mexpand as flat
>>> flat(eq)
3
person smichr    schedule 19.04.2021
comment
Так я должен заменить factor(symplify(sqrt(x))) на _mexpand(sqrt(x)) ? - person Amin Guermazi; 20.04.2021
comment
В вашем лямбда-выражении да. Но если у вашего x могут быть соотношения выражений, то sqrt = lambda x: _sqrt(cancel(x)) будет лучше. Делая это, вы в основном говорите: всякий раз, когда я использую sqrt, я хочу убедиться, что в выражении нет неотмененных факторов. - person smichr; 20.04.2021