Sympy中derive_by_array得到的sympy.core.add.Add如何在指定点求值?
报错本质
TypeError: 'Add' object is not callable和表达式是否为Add类型无关。Sympy的所有符号表达式对象(不管具体子类是Add、Mul还是其他表达式类型)都不是可直接调用的Python函数,不支持表达式(参数)的传参写法,这是Sympy的通用设计规则,不是某类对象的特殊问题。
可行的求值方案
- 单表达式单点替换求值
直接调用表达式自带的subs()方法,通过字典映射传入变量取值即可,示例:# 传入变量与取值的映射,避免位置参数错位 result_sym = g[0].subs({a: 1, b: 1, c: 0}) # 转换为原生Python浮点数值 result_num = float(result_sym) - 全数组批量求值
因为通过derive_by_array得到的是结构化的表达式数组,用lambdify()可以一次性把整个数组转换为可调用的数值计算函数,生成的函数会将符号表达式直接转换为原生数值计算逻辑,没有符号计算的额外开销,效率远高于循环单元素替换,尤其适合后续多组取值的批量计算场景,示例:from sympy import lambdify # 按变量顺序定义输入参数,绑定符号数组生成计算函数 calc_func = lambdify((a, b, c), g) # 传入取值直接得到数组所有元素的计算结果 calc_res = calc_func(1, 1, 0)
注意点
- 用
subs()传参时优先用字典型映射,不要依赖位置顺序,很容易因为变量定义顺序和传参顺序不一致出现计算错误 subs()默认返回Sympy符号对象,如果需要对接numpy的科学计算流程,用lambdify()可以直接返回兼容的数组类型- 不需要根据表达式的具体子类调整求值逻辑,Sympy所有表达式的求值接口是完全统一的
内容的提问来源于stack exchange,提问作者Sebastian Nielsen
相关产品推荐
相关产品推荐

