2017-10-10 47 views
3

我的主要目標是在表述如查明形式sympy - 如何在擴展時添加指數?

exp(1j*k*r) 

的指數的前係數:由第一膨脹,然後使用在sympy的係數_工具

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

問題是,我不知道如何擴展,以便我們可以相加收集指數。我想看看這個詞:

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) 

但應用係數_當它不是足夠方法來提取指數1j *(k1 * r1 + k2 * r2)。

回答

0

函數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