在python sympy中解决符号方程组

时间:2019-07-14 01:00:58

标签: python sympy

对于sympy来说是新手,我将得到一些帮助,使我步入正轨。在下面的示例中,如何从两个G_S中获得system的结果符号方程式?答案应该是G_S = S11 - S12 S21 / (1 + S22)

S11,S12,S21,S22 = symbols("S11 S12 S21 S22")
S = Matrix([[S11, S12], [S21,S22]])
a1,b1,a2,b2 = symbols("a1 b1 a2 b2")
In = Matrix([a1, b2])
Out = Matrix([b1, a2])

system = [Eq(Out,S*In), Eq(a2+b2,0)]
G_S = b1/a1

奥利维尔

3 个答案:

答案 0 :(得分:1)

免责声明:可能有一种更优雅的方法来做到这一点。我本人对SymPy还是很陌生。

您只需要告诉SymPy实际解方程组即可。像您一样执行所有步骤,但是在定义system之后,您需要告诉SymPy解决b1a1,然后使用这些解决方案来计算G_S 。 (请注意,solve返回一个字典。)

编辑:即使我们在计算b1时仅使用a1G_S的答案,我们仍然需要告诉{{1 }}求解所有四个变量solvea1b1a2,以便为我们提供正确的答案。

b2

当我这样做时,SymPy给了我system = [Eq(Out,S*In), Eq(a2+b2,0)] soln = solve(system, a1, b1, a2, b2) G_S = soln[b1]/soln[a1] 正确而又丑陋的答案。如果我打电话给-(-S11*(S22 + 1) + S12*S21)/(S22 + 1),我会得到simplify(G_S)不太丑陋但仍然丑陋的答案。这是用计算机进行符号数学的乐趣-它的“简单”概念从未与人类完全相同。

答案 1 :(得分:0)

@ Mr-Snrub显示了如何求解方程式。为了得到更好的简化,您可以尝试

>>> eq
-(-S11*(S22 + 1) + S12*S21)/(S22 + 1)
>>> factor_terms(collect(expand(eq),'S11'))
S11 - S12*S21/(S22 + 1)

非目标简化的问题在于总和最终会扩大和丢失。通过让cse捕获S22 + 1的重复表达式并扩展cse表达式e,并用普通表达式(在这种情况下,仅替换1)来替换该表达式获得您喜欢的:

>>> r,e=cse(eq)
>>> e[0].expand().subs(reversed(r))
S11 - S12*S21/(S22 + 1)

答案 2 :(得分:0)

基于其他答案中给出的帮助,我总结了一个令人满意的解决方案:

sol = solve(system, [a2,b2,b1])
G_S = sol[b1]/a1
G_S = factor_terms(collect(expand(G_S),'S11'))   # rearrange the expression

Sij视为系数,而将aibi视为变量。该系统表示3个方程,并允许求解该数量的未知变量。因此,我们求解a2,b2,b1并将b1解除以a1未知数。