SymPy求解方程遇TypeError:列表索引需为整数或切片而非Symbol
问题分析与解决
报错信息
TypeError: list indices must be integers or slices, not Symbol
原代码
from sympy import * t6,a,b,c = symbols ('t6,a,b,c') result=solve([(a*cos(t6))+(b*sin(t6))+c],[t6]) cs=[(a,-26.468147779101194),(b,4.395890741437306),(c,19.920476269921963)] t6 = result[t6].subs(cs)
问题原因
你的推测正确,这个三角函数方程确实存在两个解。sympy.solve返回的是一个列表,里面包含每个解的表达式。而你用result[t6]去索引列表,这是错误的——列表只能用整数或切片作为索引,不能用Symbol类型的t6,这就是报错的直接原因。
修正方案
既然result是列表,需要通过整数索引取到对应的解元素,再提取t6的表达式并代入参数:
方法1:获取所有解并代入计算
from sympy import * t6,a,b,c = symbols ('t6,a,b,c') result = solve([a*cos(t6) + b*sin(t6) + c], [t6]) cs = [(a,-26.468147779101194), (b,4.395890741437306), (c,19.920476269921963)] # 遍历所有解,代入参数后输出 for idx, sol in enumerate(result): t6_sol = sol[t6].subs(cs) print(f"第{idx+1}个解:{t6_sol}")
方法2:单独提取某个解(比如第一个或第二个)
from sympy import * t6,a,b,c = symbols ('t6,a,b,c') result = solve([a*cos(t6) + b*sin(t6) + c], [t6]) cs = [(a,-26.468147779101194), (b,4.395890741437306), (c,19.920476269921963)] # 提取第一个解并代入 t6_sol1 = result[0][t6].subs(cs) print("第一个解:", t6_sol1) # 提取第二个解并代入 t6_sol2 = result[1][t6].subs(cs) print("第二个解:", t6_sol2)
补充说明
形如Acosθ + Bsinθ + C = 0的三角函数方程,通常在一个周期内有两个解,sympy会把这两个解全部放在返回的列表中。你之前测试简单方程时可能只得到一个解,所以用result[t6]的写法碰巧没报错,但这本质上是错误的用法——正确逻辑是先通过列表索引拿到解元素,再提取对应变量的表达式。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

