如何在Sympy表达式中统计自由符号函数的出现次数(含幂次)
提取表达式中自由符号函数并统计出现次数(含幂次)
我需要一种方法提取SymPy表达式中的自由符号函数,atoms()这类方法无法列出函数,更核心的需求是统计函数的实际出现次数——包括幂次对应的重复次数(比如F1**2要算作2次)。
示例代码
from sympy import Symbol, Function, diff, Integral t = Symbol('t', real=True) x = Symbol('x', real=True) F1 = Function('F_1')(x,t) F2 = Function('F_2')(x,t) test = diff(F1,x,2)*20*Integral(F2,t)*Integral(F1,t)*F1**2
期望结果
优先得到展开后的出现列表:
[F1(x,t), F2(x,t), F1(x,t), F1(x,t), F1(x,t)]
或者退而求其次,保留幂次形式的列表:
[F1(x,t), F2(x,t), F1(x,t), F1(x,t)**2]
要求尽可能避免遍历每个参数分支。
尝试过的无效方法
使用test.count(F1)无法处理幂次情况,统计结果不准确。
解决方案
处理直接以函数为底数的幂次项
针对F1**2这类直接以自由函数为底数的幂次项,可通过find()方法定位:
# f为目标函数,比如F1 pow_term = list(test.find(lambda t: t.is_Pow and t.base == f))
将返回的集合转为列表后,可通过pow_term[0].exp获取幂次,以此核算该部分函数的出现次数。
处理含导数的幂次项
如果表达式中存在(diff(F1,t))**2这种以函数导数为底数的幂次项,需要调整判断逻辑,检查底数是否包含目标函数:
pow_term = list(test.find(lambda t: t.is_Pow and t.base.has(f)))
通过len(pow_term)判断是否存在这类项,若不为空,提取pow_term[0].exp得到幂次,即可统计对应函数的出现次数。
内容的提问来源于stack exchange,提问作者dwong
相关产品推荐
相关产品推荐

