SymPy中method与Piecewise相乘报错:如何转换为可相乘类型?
SymPy中method与Piecewise相乘触发TypeError的解决办法
问题描述
在SymPy符号计算场景下,尝试将Piecewise表达式与另一表达式的导数相乘时触发错误:
TypeError: 不支持的操作数类型:'method' 和 'Piecewise' 相乘
报错行位于res= utag*Ntag[i]。
复现代码
import sympy as sp import numpy as np import matplotlib as plt # This is all the library's i need import mpmath n = 10 x = sp.symbols('x', positive=True) c = list(sp.symbols('c0:%d'%(n + 1))) f = 1+(((sp.exp(x) * (1 - np.exp(-1))) + (sp.exp(-x)) * (np.exp(1) - 1)) / (np.exp(-1) - np.exp(1))) xx = np.linspace(0, 1, n + 1) i = 0 N = [] a = sp.Piecewise( (((xx[i + 1] - x) / (xx[i + 1] - xx[i])), (x >= float((xx[i]))) and x <= float((xx[i + 1]))), (0, x > float(xx[i + 1])), ) N.append(a) for i in range(1, n): a = sp.Piecewise( (0, x < float(xx[i - 1])), ((xx[i - 1] - x) / (xx[i - 1] - xx[i]), ((x >= float((xx[i - 1]))) & (x <= float(xx[i])))), ((xx[i + 1] - x) / (xx[i + 1] - xx[i]), ((x >= float(xx[i])) & (x <= float(xx[i + 1])))), (0, x > float(xx[i + 1])), (0, True), ) N.append(a) i = i + 1 a = sp.Piecewise( (0, x < float(xx[i - 1])), ((xx[i - 1] - x) / (xx[i - 1] - xx[i]), ((x >= float((xx[i - 1]))) & (x <= float(xx[i])))), (0, True), ) N.append(a) k = [] #u = [] for i in range(0, n + 1): if i == 0: u = c[i] * N[i] else: u = c[i] * N[i] +u Ntag = [] for i in range(0, n + 1): tag = N[i].diff(x) Ntag.append(tag) utag = u.diff try: res= utag*Ntag[i]# for any integer except: traceback.print_exc()
错误回溯信息
回溯(最近的调用最后): 文件 ".py",第56行,在<module>中 res= utag*Ntag[i]# 任意整数i TypeError: 不支持的操作数类型:'method' 和 'Piecewise' 相乘
问题根源与修复方案
问题根源
错误的核心是utag = u.diff这行代码:diff是SymPy表达式对象的方法,直接赋值给utag后,utag是一个方法对象,而非求导后的符号表达式。而Ntag[i]是Piecewise类型的符号表达式,Python不支持方法对象与表达式直接执行乘法操作,因此触发TypeError。
修复步骤
将utag = u.diff修改为:
utag = u.diff(x)
调用diff(x)方法并传入求导变量x后,utag会成为对u关于x求导后的符号表达式,此时即可与Ntag[i]正常相乘。
内容的提问来源于stack exchange,提问作者Or Milo
相关产品推荐
相关产品推荐

