You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:30:14