Sympy Subs не заменяют символ, когда его сила заменяется - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь сделать некоторые базовые замены, но SymPy не хочет помогать мне

x, y, z, k = symbols("x y z k", positive=True, real=True)
exp = x**4 + x**3 + x**2 + x
what_im_expecting = simplify(y**(Rational(1/4)) + y**(Rational(3/4)) + sqrt(y) + y)
what_i_actually_get = exp.subs(x**4,y)
exp, what_i_actually_get, what_im_expecting

возвращает

x + y**(Rational(3, 4)) + sqrt(y) + y

enter image description here

Кто-нибудь может мне помочь?



более сложный пример:

enter image description here

1 Ответ

0 голосов
/ 10 октября 2018

Методу 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))

Тогда вам не нужно обходных путей.

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