python - 如何检查 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 标记)
解决方案
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.
推荐阅读
- node.js - 将对象扁平化为相对字符串
- python - ImportError:没有名为 azure.storage.blob 的模块
- java - 即使我得到更多已经在集合中的对象,我也需要保留按“排名”属性排序的对象集合
- vba - 无法在 VBA 中定义工作表
- android - 如何在 android studio 中增加堆大小?
- shell - 您可以通过读取该文件执行 shell 命令吗?
- javascript - 导致不兼容类型的乘法在 ES6 中引发错误
- html - 第一个孩子和列表中的列表
- ruby-on-rails - Rails (5.2.0) reCaptcha Devise (4.4.3) 未定义方法 users_url
- scala - 存储为字符串变量时如何执行spark sql多行查询?