Выражение exp(-1/A)**A
равно exp(-1)
, если A вещественно, но не в целом.Например,
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)