2014-11-28 2 views
0

Когда я делаю символическую интеграцию с помощью Sympy, я хотел бы расширить выражение вдоль определенного символа, чтобы позже я мог собирать и интегрировать w.r.t. этот символ. Есть ли способ сделать такое «расширение» без изменения форм других (нерелевантных) символов?Развернуть по определенному символу в sympy

Например, рассмотрим этот Python код и запустить результаты:

>>> from sympy import * 
>>> var('x,a,b,c') 
(x, a, b, c) 
>>> f = (a + 1) * a + x * (b + exp(-c*x)) 
>>> collect(f, (exp(-c*x), x)) 
a*(a + 1) + x*(b + exp(-c*x)) 
>>> collect(expand(f), (exp(-c*x), x)) 
a**2 + a + b*x + x*exp(-c*x) 

Выходы все ожидали. Без «расширения» сначала «собрать» просто возвращает мне оригинальную форму. Если мы сначала используем «развернуть», я получаю то, что хочу. Представьте себе, если у нас есть сумма многих выше «f», а символы b и c - сложные выражения, интеграция займет много времени, если мы воспользуемся исходной формой f. Действительно, у меня есть интеграция, требующая секунд, чтобы завершить, если сначала применяется «expand», но не может быть закончена после почти одного часа прогона.

Проблема «расширения» в том, что это может быть дорого «полностью расширить» выражение. В приведенном выше примере мы видим, что * (a + 1) также был расширен (и занял вычислительное время).

У меня есть выражения (которые будут интегрированы позже), каждая из которых расширена примерно до 40 тысяч терминов. Результат расширения, как функция x, аналогичен форме в приведенном выше примере - я знал, что он должен быть такой формы. Самое время (если оно когда-либо закончилось) было потрачено на расширение этих условий, не имеющих ничего общего с «х». Могу ли я избежать этих ненужных расширений?

ответ

0

Вы можете попробовать маскировки незакрепившихся х, содержащие такие термины, как это:

>>> def ex(e,x): 
... m = [i for i in e.atoms(Mul) if not i.has(x)] 
... reps = dict(zip(m,[Dummy() for i in m])) 
... return expand(e.xreplace(reps)).subs([(v,k) for k,v in reps.items()]) 
... 
>>> f = (a + 1) * a + x * (b + exp(-c*x)) 
>>> ex(f,x) 
a*(a + 1) + b*x + x*exp(-c*x) 

Обратите внимание, что только х, содержащий термин был расширен.

Кроме того, вместо использования expand вы можете использовать только expand_mul; expand выполняет несколько типов расширений (см. docstring).

+0

спасибо. Я попробовал несколько простых примеров, и ваш код работает. Я положу его в свою программу, чтобы посмотреть, как это происходит в эти выходные. Я сообщу вам. – sunheng

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