11

我正在使用 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 中是否有功能可以简化这一点?

4

5 回答 5

13

如果您设置x为真实,SymPy 只会为您提供真实的解决方案

x = Symbol('x', real=True)
solve(..., x)
于 2013-07-26T00:52:15.810 回答
6

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

于 2018-01-10T10:56:11.000 回答
3

这正是为之设计的东西,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 的输出更一致,请设置 flag dict=True

于 2018-01-10T20:05:05.190 回答
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
于 2013-03-05T15:23:55.477 回答
-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()))
于 2013-03-04T21:00:44.243 回答