python - sympy - 扩展时如何加法组合指数?

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

最佳答案

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.

关于python - sympy - 扩展时如何加法组合指数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46672897/

相关文章:

java - apktool - 提取过程永远不会完成

c - 如何根据 C 中的多个定界符分隔字符串?

python - 是否有 sympy 默认文件,例如 matplotlib 有 ~/matplotlib/.matplotlibrc ?

math - 使用 Sympy 对具有三阶多项式分母的有理函数进行拉普拉斯逆变换

python - 什么时候需要在python中使用global关键字

r - 根据r中的列名从列表中提取数据框

python - 合并具有相同命名组的正则表达式

python - sy.sympify(str(expression)) 不等于表达式

python - 识别Python进程

python - 如何在 Scipy Python 稀疏矩阵中实现 CSR_Matrix 的循环置换(左移和右移)?