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
相关产品推荐
相关产品推荐

