【问题标题】:How to make sympy simplify a radical expression equaling zero如何使 sympy 简化等于零的激进表达式
【发布时间】:2020-10-25 22:24:48
【问题描述】:

多项式x^3 - 3x + 1 的三个(实)根总和为0。但是 sympy 似乎无法化简这个根之和:

>>> from sympy import *
>>> from sympy.abc import x
>>> rr = real_roots(x**3 -3*x + 1)
>>> sum(rr)
CRootOf(x**3 - 3*x + 1, 0) + CRootOf(x**3 - 3*x + 1, 1) + CRootOf(x**3 - 3*x + 1, 2)

函数simplifyradsimp 不能简化这个表达式。然而,最小多项式的计算是正确的:

>>> minimal_polymial(sum(rr))
_x

由此我们可以得出结论,总和是0。有没有一种直接的方法可以让 sympy 简化这个根总和?

【问题讨论】:

  • 对于三次或更高级别的符号化简化,我找不到太多信息,但您可以得到一个数值近似值:sum([root.eval_approx(20) for root in rr])Documentation.
  • @Maelstrom 当然,最好进行精确的评估,......并且使用minimal_polynomial应该可以扩展函数simplify(或任何其他适当的函数)来实现它能够进行这样的简化。我可能会为此在 sympy 项目中创建一个问题。
  • @Maelstrom 见 sympy issue #19726 (github.com/sympy/sympy/issues/19726)

标签: sympy


【解决方案1】:

如果可能,以下函数计算等于代数项的有理数:

import sympy as sp

# try to simplify an algebraic term to a rational number
def try_simplify_to_rational(expr):
  try:
    float(expr) # does the expression evaluate to a real number?
    minPoly = sp.poly(sp.minimal_polynomial(expr))
    print('minimal polynomial:', minPoly)
    if len(minPoly.monoms()) == 1: # minPoly == x
      return 0
    if minPoly.degree() == 1: # minPoly == a*x + b
      a,b = minPoly.coeffs()
      return sp.Rational(-b, a)
  except TypeError:
    pass # expression does not evaluate to a real number
  except sp.polys.polyerrors.NotAlgebraic:
    pass # expression does not evaluate to an algebraic number
  except Exception as exc:
    print("unexpected exception:", str(exc))
  print('simplification to rational number not successful')
  return expr # simplification not successful

查看工作示例:

x = sp.symbols('x')
rr = sp.real_roots(x**3 - 3*x + 1)
# sum of roots equals (-1)*coefficient of x^2, here 0
print(sp.simplify(sum(rr)))
print(try_simplify_to_rational(sum(rr))) # -> 0

sympy issue #19726 中提出了更精细的函数计算和简单的部首表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多