2014-02-14 55 views
2

我使用sympy解析解析字符串:避免复杂的数Sympy

f = parse_expr('(x-1)^(1/3)') 

当我使用f.subs({x:0})它给了我复数而不是-1。 我该如何摆脱这种行为?

我需要一些通用的,因为函数可以是任意的,我不知道会有什么变量。

谢谢。

+1

而不是-1?为什么它会给-1?复数应该是那里的正确结果。 – M4rtini

+1

因为有3个数字,所以提升到第3个数字会给-1。他们是-1和2复杂。我想要-1而不是复杂的。 –

回答

1

看着代码,找出函数real_root,我设法使用转换来编写自己的转换器。

+0

我一直在想这个问题,关于如何解决它,但我没有意识到有'real_root'。 SymPy开始达到“你遇到的任何问题都是别人已经解决的问题”。 – asmeurer

0

您的解决方案似乎是最好的。您也可以象征性地进行替换,而不是尝试更改解析器。看看atomsxreplace

我只想补充一点,SymPy使用分式幂是具有最小复杂参数的原始根的约定。 Python本身遵循以下惯例:

>>> (-1+0j)**(1/3) 
(0.5000000000000001+0.8660254037844386j) 

有很多很好的理由这样做。最明显的是第二和第三幂的数字会给你另外两个根:

>>> (-1+0j)**(2/3) 
(-0.4999999999999998+0.8660254037844388j) 
>>> (-1+0j)**(3/3) 
(-1+0j)