2016-09-29 45 views
7

我想解决y =(x + 1)** 3 -2为x在sympy找到它的反函数。
我尝试使用solve,但我没有得到我的预期。

这是我在IPython的控制台CMD(关于Python 3.5.2 sympy 1.0)写道:
如何解决sympy中的x =(x + 1)** 3 -2?

In [1]: from sympy import * 
In [2]: x, y = symbols('x y') 
In [3]: n = Eq(y,(x+1)**3 - 2) 
In [4]: solve(n,x) 
Out [4]: 
[-(-1/2 - sqrt(3)*I/2)*(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 1, 
-(-1/2 + sqrt(3)*I/2)*(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 1, 
-(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 1] 

我一直在寻找在Out [4]在列表的最后一个元素,但不等于X = (y + 2)**(1/3) - 1(我期待的)。
为什么sympy输出错误的结果,
以及我能做些什么来使sympy输出我正在寻找的解决方案?

我试过使用solveset,但我得到了与使用solve相同的结果。

In [13]: solveset(n,x) 
Out[13]: {-(-1/2 - sqrt(3)*I/2)*(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/ 
3 - 1, -(-1/2 + sqrt(3)*I/2)*(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 
1, -(-27*y/2 + sqrt((-27*y - 54)**2)/2 - 27)**(1/3)/3 - 1} 

回答

3

如果声明xy是积极的,那么就只有一个解决方案:

import sympy as sy 
x, y = sy.symbols("x y", positive=True) 
n = sy.Eq(y, (x+1)**3 - 2) 
s = sy.solve(n, x) 
print(s) 

产生

[(y + 2)**(1/3) - 1] 
+0

这有效(听起来很奇怪,但解决方案应该适用于所有实数),但是当我尝试将其扩展到另一个多项式方程,如n = Eq(y,(x + 1) ** 5)',我得到一个空集。你知道我能做些什么来获得我期待的x = y **(1/5)-1吗? (我可以在另一个问题中询问这个问题,如果我应该这样做)。 – DragonautX

+0

@DragonautX:对不起,我没有很好的回答你的一般问题。 – unutbu

+0

没关系。最后,我总是可以手工做,并从那里开展工作,或者我可以尝试其他工具。 – DragonautX

4

Sympy给你正确的结果:你最后的结果等同于(Y + 2)**(1/3) - 1.

什么你要找的是simplify

>>> from sympy import symbols, Eq, solve, simplify 
>>> x, y = symbols("x y") 
>>> n = Eq(y, (x+1)**3 - 2) 
>>> s = solve(n, x) 
>>> simplify(s[2]) 
(y + 2)**(1/3) - 1 

编辑:使用sympy 0.7.6.1,更新到1.0后,它不再工作。

+1

你是如何能够将式()分配到n没有做' x,y =符号('x y')'?此外,我仍然无法获得您获得的简化版本。我得到-2 **(2/3)*( - y + sqrt((y + 2)** 2)-2)**(1/3)/ 2-1。 – DragonautX

+0

忘了复制它,对不起。那么,尝试'在s:print(简化(sol))中解决'';我相信这个订单是随机的。 – L3viathan

+2

我得到了与@DragonautX相同的结果。在python 3.5.2上使用sympy版本1.0 –