在sympy中忽略虚根
我正在使用sympy来解一个多项式:
x = Symbol('x')
y = solve(int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2 + int(row["scaleC"])*x + int(row["scaleD"]), x)
y是一个可能解的列表。不过,我需要忽略那些虚数解,只保留实数解。而且,我希望得到的是数值,而不是表达式。目前的结果看起来是这样的:
[-2/3 - 55**(1/3)*(-1/2 - sqrt(3)*I/2)/3, -2/3 - 55**(1/3)*(-1/2 + sqrt(3)*I/2)/3, -55**(1/3)/3 - 2/3]
我需要最后一个表达式的数值(-2.22756)。在sympy中有没有什么函数可以简化这个过程?
6 个回答
10
solve()
这个函数在处理不同类型的解时,输出结果不太一致,所以建议你使用 solveset(Eq,x,domain=S.Reals)
来解决问题。
from sympy import ImageSet, S
x = Symbol('x')
y = solveset(int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2+int(row["scaleC"])*x + int(row["scaleD"]), x, domain=S.Reals)
16
如果你把 x
设置为实数,SymPy 只会给你实数解。
x = Symbol('x', real=True)
solve(..., x)
2
正如Krastonov提到的,mpmath提供了一种更简单的方法:
y = polyroots([int(row["scaleA"]), int(row["scaleB"]), int(row["scaleC"]), int(row["scaleD"])-value])
for root in y:
if "j" not in str(root):
value = root