在同情中忽略想象的根源

时间:2013-03-04 20:39:53

标签: python math 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)

是可能的解决方案列表。但是,我需要忽略虚构的,只使用真正的解决方案。此外,我希望解决方案作为一个值而不是表达式。现在它看起来像:

[-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)。是否有同情函数来简化这个?

5 个答案:

答案 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)

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

答案 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()))