对于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
奥利维尔
答案 0 :(得分:1)
免责声明:可能有一种更优雅的方法来做到这一点。我本人对SymPy还是很陌生。
您只需要告诉SymPy实际解方程组即可。像您一样执行所有步骤,但是在定义system
之后,您需要告诉SymPy解决b1
和a1
,然后使用这些解决方案来计算G_S
。 (请注意,solve
返回一个字典。)
编辑:即使我们在计算b1
时仅使用a1
和G_S
的答案,我们仍然需要告诉{{1 }}求解所有四个变量solve
,a1
,b1
,a2
,以便为我们提供正确的答案。
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
视为系数,而将ai
和bi
视为变量。该系统表示3个方程,并允许求解该数量的未知变量。因此,我们求解a2,b2,b1
并将b1
解除以a1
未知数。