Рассмотрим следующее выражение в Python/SymPy:SymPy: Использование диких символов в качестве входных данных для функции
from sympy.abc import x, y
expression = 3*x**2*y**1 + x**2*y**3
Теперь я хочу, чтобы заменить x**n*y**m
на max(n,m)
помощью сопоставления с образцом:
from sympy import Wild
n = Wild('n')
m = Wild('m')
expression = expression.replace(x**n*y**m,max(n,m))
Однако, Я получаю TypeError
:
Traceback (most recent call last):
File "wild.py", line 15, in <module>
expression = expression.replace(x**n*y**m,max(n,m))
File "/usr/lib/python3/dist-packages/sympy/core/relational.py", line 103, in __nonzero__
raise TypeError("cannot determine truth value of\n%s" % self)
TypeError: cannot determine truth value of
m_ > n_
The Pro очевидно, что при сопоставлении выражения sympy не преобразует значение символа Wild в согласованное значение перед пересылкой его в функцию max
. Есть ли способ сделать эту работу?
Обратите внимание, что это простой пример более общей проблемы, которую я имею, поэтому обходной путь, который не обобщает хорошо, не очень полезен. Я особенно надеюсь, что существует решение, использующее выражение.
Update: По предложению Сандвичевых и замены max(n,m)
от (m+n+abs(m-n))/2
работ, однако, функции я использую в моей реальной программе гораздо сложнее. Что касается проблемы упоминаемого бутерброда, что replace
выполняет замены, начиная с нижней частью дерева выражений: если я использую exact=True
и определить f = sympy.Function('f')
затем следующие работы (за исключением, что я буду иметь дело с некоторыми случаями отдельно):
expression = expression.replace(x**n*y**m,f(n,m),exact=True)
Это все еще, однако, не работает для max(n,m)
.
Замена 'макс (т, п)' с математически эквивалентным '(т + п + абс (м-н))/2' помогает с ошибкой вы запускали в. Но есть большая проблема, так как 'replace' выполняет подстановки, начинающиеся в нижней части дерева выражений. Итак, 'x ** 2 * y ** 3' будет заменено на 1, потому что это' x * x * y * y * y', где каждый из пяти членов заменяется на 1. –
@soup 'x * * 2 * y ** 3' представляется как 'Mul (Pow (x, 2), Pow (y, 3))', а не 'Mul (x, x, y, y, y)'. На самом деле единственным способом представления последнего является явное его создание с помощью 'evaluation = False'. – asmeurer