使用 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 或其他方式的方式描述了我的问题。
我错过了什么?
问题出在单个符号 s
和 K
的分配中。相反,如果您这样做:
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}]
基本上我有 [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 或其他方式的方式描述了我的问题。
我错过了什么?
问题出在单个符号 s
和 K
的分配中。相反,如果您这样做:
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}]