关于Sympy求解含有理次幂多项式所有数值根的技术问询
问题分析与解决方法
核心问题:你的表达式不是标准多项式
首先要明确,你给出的式子包含x^(11/2)、x^(9/2)这类分数次幂,本质是带根号的代数表达式,定义域仅限x≥0,无法直接按普通多项式处理——这也是Sympy数值求解时容易漏根的关键原因。
为什么nsolve(mypoly,x,1)只找到一个实根?
nsolve是局部数值求解器,它完全依赖你提供的初始猜测值,只会收敛到离猜测值最近的根。你用初始值1,它就只会找到x≈1附近的实根;另一个实根可能在0<x<1区间,因为初始值没覆盖到这个范围,所以无法被找到。
如何获取所有实根?
步骤1:将表达式转化为标准多项式
先提取公因子x²,原式可简化为:
x²*(-4x^(7/2)-24x^(5/2)-16x^(3/2)+2x^(1/2)+16x³+23x²+5x-1)
令t = sqrt(x)(t≥0,因为x≥0),则x = t²,代入括号内的部分,得到关于t的标准多项式:
-4t⁷ + 16t⁶ -24t⁵ +23t⁴ -16t³ +5t² +2t -1
步骤2:用Sympy求该多项式的非负实根
通过转化后的多项式,我们可以用Sympy的符号工具找到所有实根,再映射回原变量x:
from sympy import symbols, Poly, real_roots, nsolve # 定义符号 t = symbols('t') # 定义转化后的多项式 poly_t = Poly(-4*t**7 +16*t**6 -24*t**5 +23*t**4 -16*t**3 +5*t**2 +2*t -1, t) # 获取所有实根 all_real_roots_t = real_roots(poly_t) # 筛选非负实根(因为t=sqrt(x)≥0) non_neg_roots_t = [r for r in all_real_roots_t if r >= 0] # 映射回原变量x,x = t² real_roots_x = [r**2 for r in non_neg_roots_t] # 补充x=0这个根(原式提取了x²,x=0时整体为0) real_roots_x.append(0)
运行后就能得到所有实根,包括你之前漏掉的那个。
补充:用nsolve找特定区间的根
如果你坚持用nsolve,可以尝试不同的初始猜测值,比如在0附近找:
# 找t在0附近的根,再转成x t_root_near_0 = nsolve(poly_t, t, 0) x_root_near_0 = t_root_near_0**2
这样就能直接定位到另一个实根。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

