Python 避免复数同态
我正在使用sympy解析来解析字符串:Python 避免复数同态,python,sympy,Python,Sympy,我正在使用sympy解析来解析字符串: f = parse_expr('(x-1)^(1/3)') 当我使用f.subs({x:0})时,它给出的是复数而不是-1。 我怎样才能摆脱这种行为 我需要一些一般性的东西,因为函数可以是任意的,我不知道会有什么变量 谢谢。查看代码并找到函数real\u root,我设法使用转换来编写自己的转换器。您的解决方案似乎是最好的。您还可以象征性地进行替换,而不是试图更改解析器。查看原子和xreplace 我只想补充一点,SymPy使用了这样一个约定,分数次幂是
f = parse_expr('(x-1)^(1/3)')
当我使用f.subs({x:0})
时,它给出的是复数而不是-1。
我怎样才能摆脱这种行为
我需要一些一般性的东西,因为函数可以是任意的,我不知道会有什么变量
谢谢。查看代码并找到函数
real\u root
,我设法使用转换来编写自己的转换器。您的解决方案似乎是最好的。您还可以象征性地进行替换,而不是试图更改解析器。查看原子和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?一个复数应该是正确的结果。因为有3个数字,所以提升到第三次方会得到-1。它们是-1和2复合体。我想要-1而不是复杂的。我花了几天时间考虑如何修复它,但我没有意识到有real\u root
。SymPy开始进入一种“你遇到的任何问题都是别人已经遇到并解决的问题”的状态。