我正在使用sympy来解决多项式:
x = Symbol('x')
y = solve(int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2 + int(row["scaleC"])*x + int(row["scaleD"]), x)
是可能的解决方案列表。但是,我需要忽略虚构的,只使用真正的解决方案。此外,我希望解决方案作为一个值而不是表达式。现在它看起来像:
[-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)。是否有同情函数来简化这个?
答案 0 :(得分:9)
如果您将x
设置为真实,SymPy只会为您提供真正的解决方案
x = Symbol('x', real=True)
solve(..., x)
答案 1 :(得分:2)
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)
答案 2 :(得分:2)
这正是real_roots
所做的事情,尤其适用于系数为整数的情况:
x = Symbol('x')
eq = int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2 + int(row["scaleC"])*x + int(row["scaleD"])
y = real_roots(eq, x) # gives [CRootOf(...), ...]
可以将CRootOf实例的值评估为您需要的任何精度,并且不应包含任何虚部。例如,
>>> [i.n(12) for i in real_roots(3*x**3 - 2*x**2 + 7*x - 9, x)]
[1.07951904858]
注意:正如我记得的那样,解决方案会发回根,它无法确认是否符合这些假设(即如果他们没有被发现是错误的假设那么他们将被退回)。此外,如果您想从solve,@ PyRick获得更一致的输出,请设置标记dict=True
。
答案 3 :(得分:0)
正如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
答案 4 :(得分:-3)
我设法忽略了包含字符"I"
的解决方案,并使用.evalf()
来评估表达式。代码现在是:
x = Symbol('x')
y = solve(int(row["scaleA"])*x**3 + int(row["scaleB"])*x**2 + int(row["scaleC"])*x + int(row["scaleD"]), x)
for root in y:
if "I" not in str(root):
print("This One:" + str(root.evalf()))