python - 使用 SymPy 简化索引指数
问题描述
我正在尝试使用 SymPy 处理一些求和和乘积,但我无法让 SymPy 简化涉及索引符号的表达式。
这是一个简单的例子:
A = symbols('A', real=True)
A_i = Indexed(A, i)
expr_1 = exp(-1/A)**A
expr_2 = exp(-1/A_i)**A_i
然后,运行powsimp(expr_1)
按预期返回 e^-1 但powsimp(expr_2)
只返回原始未简化的表达式。
尝试简化索引变量时,使用索引变量的正确方法是什么?
注意:引入实际求和,因为这是我想要做的,运行powsimp(summation(expr_1, (i, 1, I)))
按预期返回 I/e,但powsimp(summation(expr_2, (i, 1, I)))
仍返回未简化的表达式。
解决方案
如果 A 是实数,则表达式exp(-1/A)**A
等于exp(-1)
,但不是一般情况。例如,
a = symbols('a')
expr = (exp(-1/a)**a).subs(a, I/(2*pi)) # returns 1
(这I
是一个内置的 SymPy 常量I
,即虚数单位)。
因此,为了简化,假设是真实的是必要的。目前 (v1.3) SymPy不支持对索引符号的假设。尽管powsimp
有一个标志force=True
旨在通过忽略假设来强制简化,但这对exp(-1/a)**a
.
作为一种解决方法,我提供了一个powsimp_indexed
接受表达式和可选参数的函数:force
如上所述,并且indexed_assumptions
. 表达式中的所有索引符号都被替换为带有 的“哑元” indexed_assumptions
,进行了简化,然后撤消了替换。
例子:
>>> powsimp_indexed(expr_2)
exp(-1/A[i])**A[i]
>>> powsimp_indexed(expr_2, real=True)
exp(-1)
>>> powsimp_indexed(Sum(expr_2, (i, 1, M)), real=True).doit()
exp(-1)*M
在后者中,简化需要在求和之前进行:因此,Sum
是一个惰性(未评估的)和,它首先被简化,然后doit()
执行求和。
def powsimp_indexed(expr, force=False, **indexed_assumptions):
indexed_syms = {t for t in expr_2.free_symbols if isinstance(t, Indexed)}
subs = {}
inverse_subs = {}
for s in indexed_syms:
d = Dummy('xi', **indexed_assumptions)
subs[s] = d
inverse_subs[d] = s
return powsimp(expr.xreplace(subs), force=force).xreplace(inverse_subs)
推荐阅读
- javascript - 如何在不更改选择框值的情况下选择选择框时更改html中的输入框值
- javascript - 如何在单页登录页面中创建滑动效果到可滚动登录页面?
- docker-compose - Docker-compose 如何创建从 Yaml 文件创建 anconda 环境并激活 Enviroment 的服务
- c# - 如何延长 Hangfire 作业的超时时间?
- reactjs - React — 这是对 useCallback 钩子的好用吗?
- sharepoint - 查询有关在 SharePoint 2013 上创建新项目网站的不同方法
- reactjs - 如何在映射所有元素之前显示 ActivityIndicator
- java - 执行查询时 MongoDB Reactive Streams 挂起
- python - 使用掩蔽层进行 LSTM 训练时出错
- c# - 为什么将 Xamarin Android .csproj 加载到 Microsoft.Build.Evaluation.Project 会由于缺少 .targets 文件而引发 InvalidPropectFileException?