首页 > 解决方案 > 如何检查 sympy 函数是否为奇数?

问题描述

我有点同情初学者,所以请不要假设我有太多特定于图书馆的知识。

我正在一个偶数域上整合许多指数表达式的总和,为了加快这个过程,我想忽略任何奇怪的术语。例如,表达式

        #   / pi  / pi  / pi
        #  |     |     |
        #  |     |     |   exp(-I*x1)exp(I*2*y)exp(I*5*z)  
        #  |     |     |   _____________________________ dx1 dy dz
        #  |     |     |              101
        #  |     |     |  
        # / -pi / -pi / -pi

为 0,因为 e^{i2y} 在偶数域上的积分(对于任何偶数 n > 0,这适用于 e^{inx})。

我创建了几千个这样的术语并使用 Add.make_args() 将它们分成一个列表;该列表的一部分是

[exp(I*x1)/4 - 1/2 + exp(-I*x1)/4, 
exp(I*x1/2)*exp(-I*y1/2)*exp(-I*z1/2)/2 + exp(-I*x1/2)*exp(I*y1/2)*exp(I*z1/2)/2]

对于单个 exp() 函数,我知道如何使用

f = exp(I*x1)/4
print(log(numer(f)).subs(x1,1)/I)

哪个打印

1

然后我可以使用 %2==0 进行测试。但是,我不确定如何扫描多个连续的 exp() 函数,每个函数可能具有 6 个不同的积分变量之一,或者是否有更简单的方法来做到这一点。

如何检查多元 sympy 函数是否为奇数,或提取其每个 exp() 参数进行检查?

(编辑:更改了我的测试整数是否为偶数的方法;添加了 python 标记)

标签: pythonsympy

解决方案


So you are trying to find exponents that are imaginary that have an even coefficient?

Let v be a list of your variables of integration and eq your integrand (or numerator of the same), then

from sympy import exp, I, Symbol
v = x, y = symbols('x y')
eq = exp(2*x)*exp(2*I*x)*exp(3*I*y)
print(eq.replace(lambda e:
    e.func==exp and
    e.exp.is_Mul and I in e.exp.args and
    e.exp.coeff(I).as_independent(*v)[0].is_even,
lambda x: Symbol('o')))

prints

o*exp(2*x)*exp(3*I*y)

If you replace Symbol('o') with 0 the expression will collapse to 0.


推荐阅读