Упрощение индексированных показателей с помощью SymPy - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь использовать 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))) все еще возвращает не упрощенное выражение.

1 Ответ

0 голосов
/ 24 октября 2018

Выражение 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...