1 回答
TA贡献1830条经验 获得超3个赞
如果 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)
添加回答
举报