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

SymPy求解五次方程返回CRootOf,如何获取实根数值解?

五次方程实根求解:SymPy返回CRootOf而非数值结果的原因与解决方法

问题描述

我尝试求解一个五次方程的实根,已知该方程有4个虚根和1个实根(约为2.278)。但使用Python SymPy求解时,仅得到CRootOf表达式而非数值结果,请问原因是什么?该如何解决?

相关代码

import sympy as sym  # 补充原代码缺失的导入语句
x_pt = -3
y_pt = 3

x = sym.symbols("x", real=True)

f = (x-3)**3

n = 1 / sym.diff(f, x)

eqn = sym.Eq(y_pt, f + -n * (x_pt - x))

x_roots = sym.solve(eqn)

print(x_roots)

输出结果

[CRootOf(3*x**5 - 45*x**4 + 270*x**3 - 819*x**2 + 1270*x - 807, 0)]

原因分析

根据阿贝尔-鲁菲尼定理,五次及以上的一般多项式方程不存在通用的根式解(无法用加减乘除、开方的组合表示精确解)。SymPy的solve函数在遇到这类无法用根式表示的根时,会返回CRootOf对象来指代多项式的根,其中第二个参数0对应该多项式的第一个根(也就是你要找的唯一实根)。

解决方法

要获取实根的近似数值结果,有两种简单可行的方式:

方式1:对CRootOf对象调用evalf()

直接对返回的CRootOf对象调用evalf()方法,即可计算出其近似数值:

import sympy as sym

x_pt = -3
y_pt = 3

x = sym.symbols("x", real=True)
f = (x-3)**3
n = 1 / sym.diff(f, x)
eqn = sym.Eq(y_pt, f + -n * (x_pt - x))

x_roots = sym.solve(eqn)
real_root = x_roots[0].evalf()
print(real_root)  # 输出:2.27807862229478

方式2:使用nsolve()直接数值求解

SymPy的nsolve()函数专门用于数值求解方程,只需传入方程、变量和一个接近实根的初始猜测值即可:

import sympy as sym

x_pt = -3
y_pt = 3

x = sym.symbols("x", real=True)
f = (x-3)**3
n = 1 / sym.diff(f, x)
eqn = sym.Eq(y_pt, f + -n * (x_pt - x))

# 初始猜测值设为2(已知实根约2.278)
real_root = sym.nsolve(eqn, x, 2)
print(real_root)  # 输出:2.27807862229478

内容的提问来源于stack exchange,提问作者Kağan Peneklioğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:15:35