在sympy中忽略虚根

14 投票
6 回答
17313 浏览
提问于 2025-04-17 17:55

我正在使用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)

http://docs.sympy.org/latest/modules/solvers/solveset.html

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

撰写回答