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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:05:24