1

У меня есть некоторые большие выражения, которые имеют свои символы с атрибутом is_commutative=False.Ошибка максимальной глубины рекурсии в Sympy при использовании некоммутативных символов

Вот пример:

import sympy 
from sympy import pi, sin, cos, exp 
sympy.var('L, xPL, cosa, i, j, r2, sina, t, x', commutative=False) 
sin.is_commutative = False 
cos.is_commutative = False 
exp.is_commutative = False 


f = L*(r2 + sina*x)**(-1)*cosa*x*exp(10000.0*x*xPL*(2*i + 1 + i**2)**(-1)/L**2 \ 
    - 5000.0*xPL**2*(2*i + 1 + i**2)**(-1)/L**2 - 5000.0*x**2*(2*i + 1 \ 
    + i**2)**(-1)/L**2)*cos(pi*j*t - j*t**2/2 + pi*t - t**2/2) \ 
    - (r2 + sina*x)**(-1)*cosa*x**2*exp(10000.0*x*xPL*(2*i + 1 \ 
    + i**2)**(-1)/L**2 - 5000.0*xPL**2*(2*i + 1 + i**2)**(-1)/L**2 \ 
    - 5000.0*x**2*(2*i + 1 + i**2)**(-1)/L**2)*cos(pi*j*t - j*t**2/2 + pi*t - t**2/2) 

Если я пытаюсь сделать f.simplify() это вызывает ошибку:

RuntimeError: maximum recursion depth exceeded. 

Я уже пытался the "gotcha"sys.setrecursionlimit, но в данном случае это не поможет.

Что необходимо сделать, чтобы установить commutative=True в sympy.var. (Без необходимости устанавливать его True в sin, cos и exp)

Поскольку эти выражения приходят от предыдущего процесса, у меня есть следующий workaroud:

def get_new_f(f): 
    sin.is_commutative = True 
    cos.is_commutative = True 
    exp.is_commutative = True 
    str_f = str(f) 
    for s in f.free_symbols: 
     sympy.var(str(x)) 
    return eval(str_f)r 

Тогда get_new_f(f).simplify() работает!

Есть ли другой способ преодолеть эту ошибку?

+0

У меня была аналогичная проблема с глубиной рекурсии, [задан вопрос о рекурсии здесь один раз] (http://stackoverflow.com/questions/17526625/baktracking-function-which-calculates-change-exceeds-maximum-recursion- глубина), и единственный ответ, который я получил, «из-за семантики Python как языка, рекурсия не является особенно эффективной парадигмой» и ссылкой на [этот вопрос] (http://stackoverflow.com/questions/ 3323001/максимальная рекурсия-глубина) –

+0

Благодарим вас за комментарий! разработчики из SymPy говорят, что рекурсия является обычной практикой для символической оценки, но для этого случая я считаю, что проблема заключается не в рекурсии, а в том, что символы не являются «коммутативными» ... –

+0

Я не заметил, что вы 're setting is_commutative на sin, cos и exp. Это не поддерживается. – asmeurer

ответ

2

С таким маленьким выражением ошибка рекурсии, как это, скорее всего, указывает на ошибку в SymPy. Вы должны сообщить об этом как ошибку в SymPy issue tracker.

+0

Спасибо, я сообщу об этом там. Но важно сказать, что это происходит только тогда, когда 'is_commutative = False' –

+0

Это неудивительно. Там, как правило, больше ошибок с некоммутативными символами, потому что они не используются так сильно. – asmeurer

Смежные вопросы