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

Sympy求解方程组如何得到指定自变量表示的目标变量表达式

问题描述

求解多变量方程组时,期望得到形如y = f(z)的解,但使用Sympy求解时无法得到完全消去中间变量的结果。
复现问题的简易示例代码如下:

import sympy
x = sympy.symbols("x", real=True)
y = sympy.symbols("y", real=True)
z = sympy.symbols("z", real=True)

eq0 = y - x**2
eq1 = x - z + 4

system = [eq0, eq1]
sympy.solve(system, y)[y]

上述代码运行输出为y = x**2,该结果数学层面正确但不符合需求,期望得到y = f(z)形式的结果,即y = (z - 4)**2。
核心疑问:Sympy的求解器是否支持指定输入自变量与输出因变量,实现类似如下形式的调用:

sympy.solve(equations, input=z, output=y)

关于代入替换法的补充说明
上述简易示例中可以通过将中间变量x替换为z-4得到目标结果,但实际业务场景共有36个方程,手动逐次替换的实现难度极高,因此寻求无需手动替换的原生求解方案。

解决方案

Sympy原生支持该需求,不需要手动逐次替换,核心逻辑是:solve函数的第二个参数为需要被消元求解的符号集合,所有传入该参数的符号,最终都会被表示为未传入该参数的剩余符号的表达式。
之前的写法只传入了y作为待求解符号,因此求解器只会把y表示为其他所有符号(x、z)的表达式,不会主动消去中间变量x。只要把所有需要消去的中间变量、目标因变量全部传入待求解符号列表,求解器就会自动完成全量消元。
以上述示例为例,正确写法如下:

import sympy
x = sympy.symbols("x", real=True)
y = sympy.symbols("y", real=True)
z = sympy.symbols("z", real=True)

eq0 = y - x**2
eq1 = x - z + 4
system = [eq0, eq1]

# 待求解列表传入所有需要消去的中间变量x + 目标因变量y
sol = sympy.solve(system, [x, y], dict=True)[0]
print(sol[y])
# 输出结果:(z - 4)**2

如果方程数量多、中间变量多,不需要手动枚举所有待消元符号,可以通过代码自动生成待求解列表,仅保留指定的输入自变量即可:

# 收集方程组中所有符号,排除指定的输入自变量z,剩下的全部作为待消元符号
solve_targets = [s for s in sympy.sympify(system).free_symbols if s != z]
# 求解后直接取目标因变量y的表达式
y_expr = sympy.solve(system, solve_targets, dict=True)[0][y]

如果方程组存在多组解,solve会返回包含多个解字典的列表,按需筛选符合约束的解即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:06:23