症状解决没有给出正确的结果



参考这个desmos图,我试图通过以下方法解决x截取:

import sympy as sym
print(sym.solve('1.0*x**3 - 3.0*x**2 - 25.0*x + 25.0'))
# [-4.25542010777727 - 0.e-22*I, 0.928558406041155 + 0.e-20*I, 6.32686170173611 - 0.e-21*I]

预期的输出是一个浮点值列表。此外,我需要用这种方法来找到许多不同多项式关于x的根,其中一些可能没有根,我担心将来可能会产生一些虚数,有没有办法拒绝虚数?

如果有人提出一些建议,我将非常高兴。

最好使用sympy的real_roots函数来找到多项式的实根:

In [2]: p = parse_expr('1.0*x**3 - 3.0*x**2 - 25.0*x + 25.0')
In [3]: p
Out[3]: 
3        2                
1.0⋅x  - 3.0⋅x  - 25.0⋅x + 25.0
In [4]: real_roots(p)
Out[4]: 
⎡       ⎛ 3      2               ⎞         ⎛ 3      2               ⎞         ⎛ 3      2               ⎞⎤
⎣CRootOf⎝x  - 3⋅x  - 25⋅x + 25, 0⎠, CRootOf⎝x  - 3⋅x  - 25⋅x + 25, 1⎠, CRootOf⎝x  - 3⋅x  - 25⋅x + 25, 2⎠⎦
In [5]: p = parse_expr('1.0*x**3 - 3.0*x**2 - 25.0*x + 25.0')
In [6]: real_roots(p)
Out[6]: 
⎡       ⎛ 3      2               ⎞         ⎛ 3      2               ⎞         ⎛ 3      2               ⎞⎤
⎣CRootOf⎝x  - 3⋅x  - 25⋅x + 25, 0⎠, CRootOf⎝x  - 3⋅x  - 25⋅x + 25, 1⎠, CRootOf⎝x  - 3⋅x  - 25⋅x + 25, 2⎠⎦
In [7]: [r.n() for r in real_roots(p)]
Out[7]: [-4.25542010777727, 0.928558406041155, 6.32686170173611]

real_roots中的算法可以明确地确定根是实的,而求解是对三次公式进行数值评估,在casus不可约的情况下,三次公式可以从舍入误差中给出小的虚部:https://en.wikipedia.org/wiki/Casus_irreducibilis

正如您可以从WolframAlpha中验证的那样,sympy找到的根确实是多项式的根。

可能由于sympy实现的算法,存在一些浮点/舍入误差,从而导致虚";剩余的";学期但是,正如您所看到的,它几乎等于零(~ e-22(。

为了保留解决方案的真实部分,您可以执行以下

import sympy as sym
res = sym.solve('1.0*x**3 - 3.0*x**2 - 25.0*x + 25.0')
res = [x.as_two_terms()[0] for x in res]
print(res)

结果很好,您只需要阅读e。要检查我的单词,只需使用此

import sympy as sym
res = sym.solve('1.0*x**3 - 3.0*x**2 - 25.0*x + 25.0')
for i in res:
print(round(i, 2))

UPD:你可以把它映射成

import sympy as sym
res = list(map(lambda e: round(e, 2), sym.solve('1.0*x**3 - 3.0*x**2 - 25.0*x + 25.0')))
print(res)

UPD2:

import sympy as sym
roots = sym.solve('1.0*x**3 - 3.0*x**2 - 25.0*x + 25.0')
result = [sym.re(i) for i in roots if round(sym.im(i), 3) < 0.001]

最新更新