类型错误:列表索引必须是整数或切片,而不是符号

时间:2018-10-22 14:53:09

标签: python sympy

因此,我的电路问题得到了这段代码(在spyder上进行编码):

from sympy.solvers import solve
from sympy import Symbol, simplify

vo = Symbol("vo") #amplitude of output voltage
vr = Symbol("vr") #amplitude of voltage r
ir = Symbol("ir") #amplitude of R-current
ic = Symbol("ic") #amplitude of C-current
il = Symbol("il") #amplitude of L-current
r = Symbol("r") #resistance
omega = Symbol("omega") #angular frequency
c = Symbol("c") #capacitance
l = Symbol("l") #inductance

eq1 = (vr + vo - 1,
 ir - ic - il,
 vr - ir*r,
 vo - ic/(1j*omega*c),
 vo - 1j*omega*l*il)

sol = solve(eq1, (vo, vr, ir, ic, il))
vos = simplify(sol[vo])
print(vos)
print(sol[vo])

其输出为:

l*omega/(I*c*l*omega**2*r + l*omega - I*r)
l*omega/(I*c*l*omega**2*r + l*omega - I*r)

这是我当前电路的Vo解决方案

然后我更改了eq1的某些部分,因为我要再次解决另一条电路的Vo,例如:

eq1 = (ir*(r + 1/ic + il) + vo - 1,
 ir - ic - il - vr/r,
 vr - ir*r,
 vo - ic/(1j*omega*c),
 vo - 1j*omega*l*il)

eq1是ive更改的唯一部分,但是当我运行它时,出现此错误:

TypeError: list indices must be integers or slices, not Symbol

有人知道如何解决此问题吗?

2 个答案:

答案 0 :(得分:1)

据我所知,唯一要为列表建立索引的地方是在您致电时:

sol[vo]

vo是Symbol类型的对象,但是列表要求您使用整数(或切片),如错误所示。例如:

sol[5]
sol[1:3]

因此,您需要先将vo转换为整数,然后才能使用它为列表建立索引。

答案 1 :(得分:1)

我添加了print(sol)行。对于原始的eq1sol是字典,而vo是有效密钥:

0936:~/mypy$ python3 stack52932207.py 
{vo: l*omega/(I*c*l*omega**2*r + l*omega - I*r), vr: I*r*(c*l*omega**2 - 1.0)/(I*c*l*omega**2*r + l*omega - I*r), ir: I*(c*l*omega**2 - 1.0)/(I*c*l*omega**2*r + l*omega - I*r), ic: I*c*l*omega**2/(I*c*l*omega**2*r + l*omega - I*r), il: -I/(I*c*l*omega**2*r + l*omega - I*r)}
l*omega/(I*c*l*omega**2*r + l*omega - I*r)
l*omega/(I*c*l*omega**2*r + l*omega - I*r)

对于较新的eq1sol是一个空列表,因此使用vo进行索引不再有效。

0937:~/mypy$ python3 stack52932207.py 
[]
Traceback (most recent call last):
  File "stack52932207.py", line 28, in <module>
    vos = simplify(sol[vo])
TypeError: list indices must be integers or slices, not Symbol

我对sympysolve不太熟悉,但是我猜想新的eq1不再具有解决方案。无论如何,这就是您需要关注的重点-为什么solve返回空列表?

请在询问错误时包括回溯。我们需要知道错误发生在哪里,而不仅仅是说什么。了解错误发生的位置后,可以添加诊断打印。在这种情况下,位置和错误消息都是相关的。