我使用sympy解析解析字符串:避免复杂的数Sympy
f = parse_expr('(x-1)^(1/3)')
当我使用f.subs({x:0})
它给了我复数而不是-1。 我该如何摆脱这种行为?
我需要一些通用的,因为函数可以是任意的,我不知道会有什么变量。
谢谢。
我使用sympy解析解析字符串:避免复杂的数Sympy
f = parse_expr('(x-1)^(1/3)')
当我使用f.subs({x:0})
它给了我复数而不是-1。 我该如何摆脱这种行为?
我需要一些通用的,因为函数可以是任意的,我不知道会有什么变量。
谢谢。
看着代码,找出函数real_root
,我设法使用转换来编写自己的转换器。
我一直在想这个问题,关于如何解决它,但我没有意识到有'real_root'。 SymPy开始达到“你遇到的任何问题都是别人已经解决的问题”。 – asmeurer
您的解决方案似乎是最好的。您也可以象征性地进行替换,而不是尝试更改解析器。看看atoms
和xreplace
。
我只想补充一点,SymPy使用分式幂是具有最小复杂参数的原始根的约定。 Python本身遵循以下惯例:
>>> (-1+0j)**(1/3)
(0.5000000000000001+0.8660254037844386j)
有很多很好的理由这样做。最明显的是第二和第三幂的数字会给你另外两个根:
>>> (-1+0j)**(2/3)
(-0.4999999999999998+0.8660254037844388j)
>>> (-1+0j)**(3/3)
(-1+0j)
而不是-1?为什么它会给-1?复数应该是那里的正确结果。 – M4rtini
因为有3个数字,所以提升到第3个数字会给-1。他们是-1和2复杂。我想要-1而不是复杂的。 –