你依赖于一个隐含的行为solve
给定一个不在所有未知数中呈线性的列表中的单个方程,它将假设您正在寻找一个未确定的系数解,该解在语义上与普通解完全不同。
它们之间的区别可以看出:
In [5]: solve(a*x + b*y, a, b, set=True)
Out[5]: ([a, b], {(0, 0)})
In [6]: solve([a*x + b*y], a, b, set=True)
Out[6]:
⎛ ⎧⎛-b⋅y ⎞⎫⎞
⎜[a, b], ⎨⎜─────, b⎟⎬⎟
⎝ ⎩⎝ x ⎠⎭⎠
这里第一种情况是返回值a
and b
可以使表达式对于所有可能的值都相同为零x
and y
。第二种情况正在治疗x
and y
作为固定但未指定的参数并返回可能值的集合a
and b
作为符号参数的函数x
and y
这可能会使表达式为零。
从概念上讲,这是两个截然不同的事物,如果解决方案不将它们混合在单个最终用户函数中会更好。您看到的差异是因为您的方程被视为第二种情况而不是第一种情况。话虽如此,我无法使用最新版本的 SymPy (1.11.1) 重现您报告的输出:
In [1]: a, b, c, d = symbols('a, b, c, d')
In [2]: eq = a * (x-1) * y - a * z + b * y + c * x * y + d * z
...: print(solve(eq, a, b, c, d, set=True)) # output: ([a, b, c, d], {((b*y + c*x*y + d*z)/(-x*y + y
...: + z), b, c, d)})
([a, b, c, d], {(d, d, -d, d)})
如果我通过了eq
在列表中然后我确实看到了它:
In [7]: solve([eq], a, b, c, d, set=True)
Out[7]:
⎛ ⎧⎛ b⋅y c⋅x⋅y d⋅z ⎞⎫⎞
⎜[a, b, c, d], ⎨⎜- ─────────── - ─────────── - ───────────, b, c, d⎟⎬⎟
⎝ ⎩⎝ x⋅y - y - z x⋅y - y - z x⋅y - y - z ⎠⎭⎠
无论如何,最好不要依赖于使用solve
这边走。我建议使用solve
仅用于其主要目的,即上面的情况 2,并且为此应始终使用列表来调用它(即使对于单个方程)。
相反,有一个函数solve_undetermined_coeffs
这是执行您想要执行的操作的显式函数:
In [9]: solve_undetermined_coeffs(eq, [a, b, c, d], [x, y, z])
Out[9]: {a: d, b: d, c: -d}
https://docs.sympy.org/latest/modules/solvers/solvers.html#sympy.solvers.solvers.solve_undependent_coeffs https://docs.sympy.org/latest/modules/solvers/solvers.html#sympy.solvers.solvers.solve_undetermined_coeffs