Sympy Subs not replacing a symbol when its power is being replaced

走远了吗. 提交于 2019-12-31 04:08:29

问题


I'm trying to make some basic substitutions but SymPy doesn't want to help me out

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

returns

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

Can anyone help me out?



a more complex example:


回答1:


The method subs can be trusted to replace the terms that exactly match the given "old" expression, which x**4 here. The replacement of other things related to x**4 is not so certain. (There are many open issues with subs: some say it substitutes too much, some say too little.) There is some substitution logic specific to powers, but x by itself is not formally a power, so it escapes that logic. A workaround: temporarily replace x by x**1, preventing automatic evaluation of that power to x.

x1 = sp.Pow(x, 1, evaluate=False)
subbed = exp.subs(x, x1).subs(x**4, y).subs(x1, x)

Now subbed is y**(3/4) + y**(1/4) + sqrt(y) + y.

But, don't expect human-like ingenuity from subs. With the same workaround, trying to do subs(x**4 - 1, y) results in x**3 + x**2 + x + y + 1: nothing like sqrt(y+1), etc, appears. It's better to substitute in the most direct way possible:

subs(x, (y+1)**Rational(1, 4))

Then you don't need any workarounds.



来源:https://stackoverflow.com/questions/52730086/sympy-subs-not-replacing-a-symbol-when-its-power-is-being-replaced

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!