sympy - как аддитивно комбинировать показатели при расширении?

Моя основная цель - определить коэффициенты перед экспонентами формы

exp(1j*k*r)

в таких выражениях, как:

(z1*exp(1j*k1*r1) + z2*exp(1j*k2*r2) + c.c.)**2

сначала расширив, а затем используя инструмент coeff в sympy.

Проблема в том, что я не знаю, как расширить таким образом, чтобы мы могли аддитивно собирать показатели. Я хотел бы видеть этот термин:

exp(1j*(k1*r1+k2*r2))

но появляется только такой термин:

exp(1j*k1*r1)*exp(1j*k2*r2)

Вот мой код:

from sympy import *
u = Symbol('u')
r1,r2 = symbols('r1 r2', real = True)
k1,k2 = symbols('k1 k2', real = True)
z1,z2 = symbols('z1 z2')
uu = z1*exp(1j*k1*r1)+ z2*exp(1j*k1*r2)
u = uu + uu.conjugate()

v = expand(u**2)
print(v)

Я не могу понять, как это сделать. Я пытался использовать упрощение или рассматривать это как многочлен с символическими коэффициентами, но это не сработало.

В более общем смысле, является ли расширение, а затем использование метода coeff лучшим способом извлечения коэффициентов перед экспонентами? Есть ли автоматизированный инструмент, который уже делает это?

Спасибо за помощь !

РЕДАКТИРОВАТЬ :

Я также пытался использовать powsimp с этой частью кода:

w = powsimp(expand(u**2))
print(w.coeff(exp(1j*(k1*r1 + k2*r2))))

он возвращает 0, потому что мы получаем только

exp(1j*k1*r1 + 1j*k2*r2)

но этого недостаточно при применении метода coeff для извлечения показателя степени 1j*(k1*r1 + k2*r2).


person A. S.    schedule 10.10.2017    source источник


Ответы (1)


Функция factor_terms будет копаться в показателях и выделять общий множитель. Это то, что вы ищите?

>>> factor_terms(powsimp(posify(u**2)[0].expand()))
z1∗∗2∗exp(2∗k1∗r1∗I)+2∗z1∗∗2+z1∗∗2∗exp(−2∗k1∗r1∗I)+
2∗z1∗z2∗exp(k1∗I∗(−r1+r2))+2∗z1∗z2∗exp(k1∗I∗(r1−r2))+
2∗z1∗z2∗exp(k1∗I∗(r1+r2))+2∗z1∗z2∗exp(−k1∗I∗(r1+r2))+
z2∗∗2∗exp(2∗k1∗r2∗I)+2∗z2∗∗2+z2∗∗2∗exp(−2∗k1∗r2∗I)

posify присваивает предположения, поэтому экспоненциальные факторы объединяются. Если они этого не делают, когда вы используете powsimp, это, вероятно, потому, что существует предположение, которое не разрешает эту перезапись для всех возможных значений переменных. Примечание: вы не сможете выполнить сопоставление непосредственно с этим, вам придется подставить свои исходные переменные обратно в результат, используя второй аргумент, который возвращается из posify — см. строку документации posify.

person smichr    schedule 17.10.2017