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

Sympy solve()函数无法输出全部解,如何获取所有符号解?

解决Sympy求解非线性方程组仅返回错误解的问题

问题分析

你的代码存在两个核心问题:

  • 提前将符号常量(a、b、c等)赋值为具体数值,直接把符号方程组转化为数值方程组,失去了获取符号解的基础;
  • b的取值极小(约-2e-30),Sympy计算时会自动将其近似为0,导致方程组变形,得到错误解。

解决方案

要获取所有符号解,需先保留a、b、c、d、g、h为符号变量完成推导,之后再代入具体数值。对于复杂非线性方程组,可结合Sympy的Groebner基方法辅助求解,确保找到全部解。

修正后的代码

from sympy import symbols, solve, groebner, expand

# 定义所有符号变量(包括常量)
x, y, a, b, c, d, g, h = symbols('x y a b c d g h')

# 定义符号方程组
F = (y + a/2)*x*(2*x**2 - 2*y*a + 2*d**2 + b + c) - (x*y*g**2)
G = (x**2 - y*a + b + d**2)*(x**2 - y*a + c + d**2) - 4*((y+a/2)**2)*x**2 - (h**2 + (x**2)*(g**2))

# 先尝试直接求解符号方程组
symbolic_sols = solve([F, G], (x, y), dict=True, simplify=True)

# 若直接solve结果不全,用Groebner基辅助分析求解
if not symbolic_sols:
    gb = groebner([F, G], x, y, order='lex')
    eq1, eq2 = gb[0], gb[1]
    # 先解出y的可能解,再代入求x
    sol_y_list = solve(eq1, y, dict=True)
    symbolic_sols = []
    for y_sol in sol_y_list:
        subs_eq = eq2.subs(y_sol)
        sol_x_list = solve(subs_eq, x, dict=True)
        for x_sol in sol_x_list:
            full_sol = {**x_sol, **y_sol}
            symbolic_sols.append(full_sol)

print("所有符号解:")
for idx, sol in enumerate(symbolic_sols):
    print(f"解 {idx+1}: {sol}")

# 可选:代入具体数值验证
const_vals = {
    a: 0.12,
    b: -2.031529100521498e-30,
    c: -2.031529100521498e-30,
    d: 1,
    g: 11,
    h: 0
}
numeric_sols = [{k: v.subs(const_vals).evalf() for k, v in sol.items()} for sol in symbolic_sols]
print("\n代入数值后的解:")
for idx, sol in enumerate(numeric_sols):
    print(f"解 {idx+1}: {sol}")

关键说明

  • 符号推导优先:必须先完成符号层面的求解,再代入数值,避免数值干扰符号解的完整性;
  • Groebner基辅助:高次非线性方程组直接用solve可能遗漏解,Groebner基可将方程组转化为更易求解的形式,确保找到全部解;
  • 极小值处理:若必须保留极小的b值,代入时可使用nsimplify或手动指定精度,避免Sympy自动近似为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:22:19