如何用SymPy对列表元素求值?解决AttributeError报错
SymPy列表元素求值报错解决
问题背景
用户定义了包含SymPy符号表达式的列表,想要在θ=90°(即π/2弧度)时计算列表元素的值,相关代码如下:
列表定义代码
import sympy as sp theta = sp.symbols('theta') A = [sp.cos(theta), sp.sin(theta),0,0]
尝试求值的报错代码
theta_val = sp.pi / 2 A_evaluated = [A.subs([theta, theta_val])] print(A_evaluated)
报错信息:AttributeError: list object has no attribute subs
错误原因
A是Python列表对象,而subs是SymPy表达式对象的专属方法,列表本身不具备该方法,因此不能直接对整个列表调用subs。需要遍历列表中的每个元素,对单个SymPy表达式执行subs操作。
修正后的代码
方法一:列表推导式(推荐写法)
import sympy as sp theta = sp.symbols('theta') A = [sp.cos(theta), sp.sin(theta), 0, 0] theta_val = sp.pi / 2 # 遍历列表元素,仅对SymPy表达式执行subs,常量直接保留 A_evaluated = [elem.subs(theta, theta_val) if isinstance(elem, sp.Expr) else elem for elem in A] print(A_evaluated) # 输出结果:[0, 1, 0, 0]
方法二:普通循环处理
如果不习惯列表推导式,可使用循环逐个处理元素:
import sympy as sp theta = sp.symbols('theta') A = [sp.cos(theta), sp.sin(theta), 0, 0] theta_val = sp.pi / 2 A_evaluated = [] for elem in A: if isinstance(elem, sp.Expr): A_evaluated.append(elem.subs(theta, theta_val)) else: A_evaluated.append(elem) print(A_evaluated) # 输出结果:[0, 1, 0, 0]
简化场景说明
如果列表中所有元素都是SymPy表达式(无0这类常量),可进一步简化代码:
A_evaluated = [elem.subs(theta, theta_val) for elem in A]
内容的提问来源于stack exchange,提问作者Bors DJ
相关产品推荐
相关产品推荐

