sympy - 扩展时如何将指数加成组合?

时间:2017-10-10 17:49:06

标签: python extract sympy exponent coefficients

我的主要目标是识别表格前面的系数

exp(1j*k*r)

表达式如下:

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

首先扩展然后在sympy中使用coeff工具。

问题在于我不知道如何以这样的方式进行扩展,以便我们可以累加地收集指数。我想看看这个词:

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)是不够的。

1 个答案:

答案 0 :(得分: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的文档字符串