You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SymPy roots函数生成冗余三角表达式,如何简化求解结果?

问题描述
  • 用SymPy求解7次多项式方程 roots(-64*x**7 + 112*x**5 - 56*x**3 + 7*x),指定域后得到近似值为0.433883739117558的根,其预期代数形式为:
    sqrt(7/12 - (7^(2/3)*(1 + i*sqrt(3)))/(12*2^(2/3)*(-1 + 3*i*sqrt(3)))^(1/3)) - (1/24)*(1 - i*sqrt(3))*(7/2*(-1 + 3*i*sqrt(3)))^(1/3)
    
    但SymPy返回了冗余的三角函数表达式,调用symplify()无法简化。
  • 求解11次多项式方程 -1024*x**11 + 2816*x**9 - 2816*x**7 + 1232*x**5 - 220*x**3 + 11*x时,SymPy也常生成三角形式解。
解决方法

1. 用nsimplify()将数值近似转为代数形式

针对已知近似值的根,通过指定包含目标根式和虚数单位的域,强制SymPy转换为精确代数表达式:

from sympy import nsimplify, sqrt, I, N, symbols

x = symbols('x')
approx_root = 0.433883739117558
# 指定包含sqrt(7)和虚数单位I的域,转换近似值为代数形式
algebraic_root = nsimplify(approx_root, [sqrt(7), I])
print(algebraic_root)
# 验证近似值是否匹配
print(N(algebraic_root))

2. 调整求解函数参数优先获取代数解

调用solve()或roots()时,指定domain='complex'并调整参数,引导SymPy优先返回根式形式解:

from sympy import solve, roots

poly_7 = -64*x**7 + 112*x**5 - 56*x**3 + 7*x
# 使用solve函数并指定复数域
solutions = solve(poly_7, x, domain='complex')
# 筛选出匹配近似值的解
target_sol = [s for s in solutions if N(s) == approx_root][0]
print(target_sol)

3. 手动转换三角函数解为代数形式

若已得到三角函数形式的解,利用欧拉公式结合符号运算转换:

from sympy import expand_complex, rewrite, exp

# 假设trig_root是SymPy返回的三角函数解
trig_root = # 你的三角函数形式解
# 转换为指数形式后展开复数部分
algebraic_form = expand_complex(trig_root.rewrite(exp))
# 简化得到代数形式
print(algebraic_form.simplify())

4. 高次多项式的特殊处理

对于11次这类高次多项式:

  • 根据伽罗瓦理论,并非所有高次多项式都存在根式解。若SymPy返回三角解,可能意味着该多项式的伽罗瓦群不允许根式表达,此时只能接受三角形式或使用数值近似。
  • 若确认存在根式解,可使用SymPy的galois模块分析多项式的伽罗瓦群,再针对性调整求解策略。
补充说明
  • SymPy默认在高次多项式求解时,若根式解过于复杂或存在性存疑,会优先返回三角函数形式(更通用且简洁)。
  • 使用nsimplify()时,需保证近似值的精度足够(建议保留15位以上小数),否则可能无法准确转换为目标代数形式。

内容的提问来源于stack exchange,提问作者Nicolas Campailla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:22:30