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

SymPy求解多项式根遇错:求根及正根验证需求

解决SymPy中PolynomialError并完成超越方程推导多项式的正根验证

问题根源

出现PolynomialError的核心原因是:直接使用abs()处理复数多项式表达式时,SymPy会保留符号化的模形式,无法自动转化为标准实系数多项式,导致后续调用多项式专属方法(如roots())时触发错误。正确的做法是通过复数与其共轭的乘积计算模平方,确保结果展开为实系数多项式。

完整可运行代码

from sympy import symbols, I, expand, conjugate, roots, simplify

# 定义实常数k和实变量ω
k, ω = symbols('k ω', real=True)
L = I * ω

# --------------------------
# 替换为你实际的多项式P(L)、Q(L)
# --------------------------
P = L**2 + 3*L + 2
Q = L + 1

# 步骤a:代入L=Iω
P_Iω = P.subs(L, I*ω)
Q_Iω = Q.subs(L, I*ω)

# 步骤b:计算模平方并展开为实系数多项式
abs_P_sq = expand(P_Iω * conjugate(P_Iω))
abs_Q_sq = expand(Q_Iω * conjugate(Q_Iω))
F = expand(abs_P_sq + abs_Q_sq)
# 显式转化为ω的多项式,消除潜在的符号歧义
F = simplify(F).as_poly(ω)

# 步骤c:求根并筛选正实根
all_roots = roots(F, multiple=False)
positive_roots = [root for root in all_roots if root.is_real and root > 0]

# 输出结果
print("多项式F(ω):")
print(F)
print("\n所有根:")
print(all_roots)
print("\n正实根:")
print(positive_roots)

关键细节说明

  • 模平方计算:必须用X * conjugate(X)代替abs(X)**2,前者能通过expand()完全展开为仅含实系数的ω多项式,后者会保留符号化的模结构,无法被SymPy识别为多项式。
  • 显式多项式转换:调用as_poly(ω)强制将F转化为ω的一元多项式,确保roots()方法可以正常处理,彻底避免PolynomialError。
  • 符号/数值兼容:如果需要对特定k值计算数值根,可先代入k的具体值(如k=1),再用nroots()替代roots()获取数值解。

内容的提问来源于stack exchange,提问作者Luciano Magrini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:52:46