在Python中找多项式的有理根

4

我在使用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

请注意,我需要从浮点数中获取准确的分数。 如何找到有理根?

当你写下-7/4时,你已经放弃了得到一个精确答案的希望,因为它产生了一个浮点数。这是一个浮点数,恰好是该值的精确表示,但sympy无法知道这一点 - 因此它放弃尝试给出一个精确的符号结果,并计算浮点数。(而且基本上不可能确定一个浮点数是否应该表示有理数或无理数的值。) - jasonharper
@jasonharper 但问题不是发生在 x_2p=-7/4,而是在 print(Fraction(R[1])) - Michael
1个回答

2
如果您使用real_roots,则将获得一个CRootOf实例,可以使用任意精度进行计算。使用您的初始化和以下内容,我得到了:
>>> 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

为什么我们需要 eq -x**4 - 7.0*x**3 - 10*x**2 + 99.0*x - 81.0 ...... 您能否根据我的代码提供完整的代码? - Michael
我刚刚定义了eq作为您传递给solve的参数,然后展示了它的样子。然后我使用了real_roots而不是solve。在您的代码中,将solve替换为real_roots并省略, x...您将获得我在答案中展示的解决方案列表。 - smichr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接