在 Python 中查找多项式的有理根

Finding Rational Root of Polynomial in Python

提问人:Michael 提问时间:4/28/2020 更新时间:4/28/2020 访问量:585

问:

我在解决 python 中的多项式时遇到了一个小问题。我想要的是找到理性的根源,而不是非理性的根源。我的尝试如下 -sympy.solvers

from sympy.solvers import solve
from sympy import Symbol
from fractions import Fraction

b_2=0
b_4= -10
b_6=32
b_8=-25

x_2p=-7/4

x = Symbol('x', real=True)
solution=solve(((4*x**3+b_2*x**2+2*b_4*x+b_6)*x_2p-(x**4-b_4*x**2-2*b_6*x-b_8)), x)
R=solution
if len(R) != 0:
    print(Fraction(R[1]))

我得到了以下错误 -

Traceback (most recent call last):
  File "C:\Users\Roy\Desktop\EXP_2704 - Copy.py", line 16, in <module>
    print(Fraction(R[1]))
  File "C:\Program Files\Python37\lib\fractions.py", line 161, in __new__
    raise TypeError("argument should be a string "
TypeError: argument should be a string or a Rational instance

请注意,我需要从浮动中获得准确的分数。

我怎样才能找到有理根?

蟒蛇 python-3.x sympy 浮动精度

评论

0赞 jasonharper 4/28/2020
在你写的那一刻,你放弃了对精确答案的所有希望,这会产生一个浮点值。这是一个浮点数,恰好是值的精确表示,但 sympy 无法知道这一点 - 因此它放弃了尝试给你一个精确的符号结果,而只是计算浮点数。(从根本上说,无法判断浮点数应该代表有理值还是无理值。-7/4
0赞 Michael 4/28/2020
@jasonharper但问题不是发生在x_2p=-7/4print(Fraction(R[1]))

答:

2赞 smichr 4/28/2020 #1

如果使用,将获得一个 CRootOf 实例,该实例可以以任意精度进行计算。使用您的初始化和以下内容,我得到:real_roots

>>> from sympy import Rational, real_roots
>>> eq = ((4*x**3+b_2*x**2+2*b_4*x+b_6)*x_2p-(x**4-b_4*x**2-2*b_6*x-b_8)); eq
-x**4 - 7.0*x**3 - 10*x**2 + 99.0*x - 81.0
>>> real_roots(_)
[1, CRootOf(x**3 + 8*x**2 + 18*x - 81, 0)]
>>> r=_[1]
>>> Rational(r.n(2))
133/64
>>> Rational(r.n(20))
613677434358103191805/295147905179352825856

评论

0赞 Michael 4/28/2020
为什么我们需要.....你能根据我的代码提供完整的代码吗?eq -x**4 - 7.0*x**3 - 10*x**2 + 99.0*x - 81.0
0赞 smichr 4/28/2020
我只是定义为你的论点,然后我向你展示了它的样子。然后我用 .在代码中,替换 with 并留下 ...您将获得我在答案中显示的解决方案列表。eqsolvereal_rootssolvesolvereal_roots, x