Как проверить, не является ли функция sympy нечетной? - PullRequest
0 голосов
/ 19 апреля 2020

Я новичок в симпатиях, поэтому, пожалуйста, не принимайте слишком много библиотечно-специфических c знаний с моей стороны.

Я интегрирую по четному домену сумму много экспоненциальных выражений, и чтобы ускорить этот процесс, я бы хотел игнорировать любые странные термины. Например, выражение

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

равно 0 из-за интеграла от e ^ {i2y} по четной области (это работает для e ^ {inx} для любого четного n> 0).

Я создал несколько тысяч таких терминов и разделил их в список с помощью 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)

1 Ответ

0 голосов
/ 19 апреля 2020

То есть вы пытаетесь найти мнимые показатели с четным коэффициентом?

Пусть v будет списком ваших переменных интегрирования и eq вашего подынтегрального выражения (или того же числителя) , тогда

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')))

печатает

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

Если вы замените Symbol('o') на 0, выражение свернется до 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...