Методу subs
можно доверять, чтобы заменить термины, которые точно соответствуют заданному "старому" выражению, которое x**4
здесь.Замена других вещей, связанных с x**4
, не так уж точна.(Есть много открытых вопросов с подпрограммами: некоторые говорят, что это заменяет слишком много, некоторые говорят, что слишком мало.) Есть некоторая логика замены, специфичная для powers , но x
сама по себеформально не power , поэтому он избегает этой логики.Обходной путь: временно замените x
на x**1
, предотвращая автоматическую оценку этой мощности до x
.
x1 = sp.Pow(x, 1, evaluate=False)
subbed = exp.subs(x, x1).subs(x**4, y).subs(x1, x)
Теперь subbed
- это y**(3/4) + y**(1/4) + sqrt(y) + y
.
Но не ожидайте человеческой изобретательности от subs
.При таком же обходном пути попытка сделать subs(x**4 - 1, y)
приводит к x**3 + x**2 + x + y + 1
: ничего похожего на sqrt(y+1)
и т. Д. Не появляется.Лучше заменить самым прямым способом:
subs(x, (y+1)**Rational(1, 4))
Тогда вам не нужно обходных путей.