给定的多项式是
p = Poly(x**3-x**2-2*x+1, x) # and a root as radical expression:
rt = 1/3 + (-7/2 - 21*sqrt(3)*I/2)**(1/3)/3 + (-7/2 + 21*sqrt(3)*I/2)**(1/3)/3
将根代入多项式得到(简化):
expr = 7*(-1 - 3*sqrt(3)*I)**(2/3)*(-1 + 3*sqrt(3)*I)**(1/3)/18 - \
7*2**(2/3)*(-7 + 21*sqrt(3)*I)**(1/3)/18 - \
7*2**(2/3)*(-7 - 21*sqrt(3)*I)**(1/3)/18 + \
7*(-1 - 3*sqrt(3)*I)**(1/3)*(-1 + 3*sqrt(3)*I)**(2/3)/18
但无法让python显示此表达式为零:
expr == 0 # False
但是:
expr.evalf() # gives -0.e-131 - 0.e-132*I
这里的问题是浮点精度。方程中的很多运算都会有点偏差,特别是对于2/3或1/3,它们有无限小数。这一点在诸如本How to avoid floating point errors?之类的答案中得到了解释。为了避免这个问题,可以使用
round
将结果截断到小数点的特定数目内然后评估它是否等于零
你可能会不顾一切地使用精度更高的
Decimal
,但我怀疑你会得到一个平坦的零,即使使用它,其中一些操作不会产生小数有限的数字,因此一些数量会在某处丢失,最终结果非常接近零,但实际上不是零您是否需要131或132小数点精度才能将其设置为零
有一个函数
minpoly
用于计算代数表达式的最小多项式:这表明这是你所展示的多项式的根。通常
r
是多项式p
的根,那么minpoly(r)
是除以p
的多项式我们还可以使用
minpoly
证明将根代入多项式后的表达式为零:这里的最小多项式是
x
,它的唯一根是零https://en.wikipedia.org/wiki/Minimal_polynomial_(field_theory)https://docs.sympy.org/latest/modules/polys/reference.html#sympy.polys.numberfields.minpoly
相关问题 更多 >
编程相关推荐