使用 Sympy 的线性方程的符号解

symbolic solution of linear equations using Sympy

基本上我有 [5x5][5x1]=[0] 并且想要解决方案的符号表达式。

这是我的代码。

from sympy import symbols, solve
gm1, gm2, gm4                   = symbols(['gm1', 'gm2', 'gm4'])
gds1, gds2, gds3, gds4, gds5    = symbols(['gds1', 'gds2', 'gds3', 'gds4', 'gds5'])
s                               = symbols(['s'])
Cd, CF , Cin, Ct                = symbols(['Cd', 'CF', 'Cin', 'Ct'])
K                               = symbols(['K'])
vb, vc, ve, vout, iin           = symbols(['vb', 'vc', 've', 'vout', 'iin'])

sol = solve([-(gds1+gds3+(s*Cd))*vb + (gm1+gds1)*ve + -gm1*vout, \
          -gm4*vb + (gds4-gds2-(s*Cin)-(s*CF))*vc + (gds2+gm2)*ve + s*CF*vout + iin, \
        gds1*vb + gds2*vc + (-(s*Ct)-gds5-gds1-gm1-gm2-gds2)*ve + gm1*vout, \
        K*vc + vout], [vout])
print(sol)

但是,我遇到了这个错误

TypeError: can't multiply sequence by non-int of type 'Symbol'

开始,符号乘法似乎工作得很好。

我不确定我是否以不符合 Sympy 或其他方式的方式描述了我的问题。

我错过了什么?

问题出在单个符号 sK 的分配中。相反,如果您这样做:

s, K = symbols(['s', 'K'])

或者:

s = symbols('s')
K = symbols('K')

你是否得到正确答案是另一回事:)

当您将列表传递给 symbols 时,您会得到一个列表。您可以像 [s] = symbols(['s']) 那样解压缩,或者您可以只传递 space 的字符串或逗号分隔的字符串,例如 x, y = symbols('x y')x, y = symbols(','.join(['x', 'y']).

如果你 select manual=True 你会得到一个解决方案 vout=K*vc 将第 4 个方程设置为 0。但这几乎是显而易见的,对吧?而且您不需要其他 3 个方程式来告诉您这一点。因此,继续选择您要解决的其他 3 个变量。有很多可能性:

>>> from sympy.functions.combinatorial.numbers import nC
>>> allsym = Tuple(*eqs).free_symbols
>>> nfree = len(allsym) - 1  # always take vout
>>> print(nC(nfree, 3))  # want 3 others
816

例如,selecting (vout, gds4, gm1, gds5)给出了

的解
[{gds4: (CF*K*s*vc + CF*s*vc + Cin*s*vc + gds2*vc -
         gds2*ve - gm2*ve + gm4*vb - iin)/vc, 
  gm1: (Cd*s*vb + gds1*vb - gds1*ve + gds3*vb)/(K*vc + ve), 
  gds5: -(Cd*s*vb + Ct*s*ve - gds2*vc + gds2*ve + gds3*vb + gm2*ve)/ve, 
  vout: -K*vc}]