sympy - 如何在扩展时添加指数?

问题描述:

我的主要目标是在表述如查明形式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)。

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