遇到过类似问题, sympy
处理稍复杂的计算就会卡住,但同样方程用 MATLAB 就可以很快搞定。
对于这个例子,由于已经因式分解,分类讨论能降低问题计算难度。
using SymPy
@syms x y z e₁ e₂ c₁ c₂ c₃ c₅ s₁ s₂ s₃ g₁ g₂
fxs = [x, x-1, c₁ + c₂*y*z - c₂*y - c₂*z - e₁ - e₂*y*z + e₂*y + e₂*z - g₁*y - g₂*z - s₁*y]
fys = [y, y-1, c₃ + g₁*x - g₁ + s₁*x]
fzs = [z, z-1, -c₅ + s₂ + s₃]
sols = []
for fx in fxs, fy in fys, fz in fzs
sol = solve([fx, fy, fz], [x, y, z]; set=true)
isempty(sol[1]) || push!(sols, sol)
end
sols
求解结果
10-element Vector{Any}:
(Sym[x, y, z], PyObject {(0, 0, 0)})
(Sym[x, y, z], PyObject {(0, 0, 1)})
(Sym[x, y, z], PyObject {(0, 1, 0)})
(Sym[x, y, z], PyObject {(0, 1, 1)})
(Sym[x, y, z], PyObject {(1, 0, 0)})
(Sym[x, y, z], PyObject {(1, 0, 1)})
(Sym[x, y, z], PyObject {(1, 1, 0)})
(Sym[x, y, z], PyObject {(1, 1, 1)})
(Sym[x, y, z], PyObject {((-c₃ + g₁)/(g₁ + s₁), (c₁ - e₁)/(c₂ - e₂ + g₁ + s₁), 0)})
(Sym[x, y, z], PyObject {((-c₃ + g₁)/(g₁ + s₁), (c₁ - c₂ - e₁ + e₂ - g₂)/(g₁ + s₁), 1)})
由于要求解一般的公式,x, y, z
以外的符号可以取任意值,第三条式子 fz = -z*(z - 1)*(-c₅ + s₂ + s₃)
可以直接解出 z=0,1
。这 3*3*3
条等式里绝大多数是平凡的,只有两条稍微要点计算,但带入 z
后也只是简单的线性方程。