Sympy Subs在替换其电源时未替换符号

时间:2018-10-09 22:17:43

标签: python sympy

我正在尝试进行一些基本替换,但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 :(得分:0)

可以信任方法subs来替换与给定的“旧”表达式完全匹配的术语,此处为x**4。与x**4相关的其他事物的替换还不确定。 (有many open issues带有替换项:有人说它替代太多,有人说过少。)有一些特定于 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)

现在subbedy**(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))

那么您就不需要任何解决方法。