Проблемы с simpy упростить / фактор / собрать - PullRequest
0 голосов
/ 23 апреля 2019

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

from IPython.display import display
from sympy import *

# Symbolic constants
z = symbols('z')
R = symbols('R')
theta = symbols('theta')

# Functions
phi_x = Function('\phi_x')(z)
phi_y = Function('\phi_y')(z)
m = Function('m')(z)

expr = sin(theta)**2*integrate(phi_y**2*m, (z, 0, R)) + cos(theta)**2*integrate(phi_y**2*m, (z, 0, R)) + integrate(phi_x**2*m, (z, 0, R))
expr = simplify(expr)
display(expr)

Я получаю:

[out]:sin(theta)**2*Integral(\phi_y(z)**2*m(z), (z, 0, R)) + cos(theta)**2*Integral(\phi_y(z)**2*m(z), (z, 0, R)) + Integral(\phi_x(z)**2*m(z), (z, 0, R))

В то время как ожидаемая упрощенная тригонометрическая идентичность:

[expected]: Integral(\phi_y(z)**2*m(z), (z, 0, R)) + Integral(\phi_x(z)**2*m(z), (z, 0, R))

1 Ответ

0 голосов
/ 13 мая 2019

Поскольку trigsimp упростит a*cos(x)**2 + a*sin(x)**2 + b, если вы замените свои интегралы символами, это должно работать.Один из способов заключается в следующем:

>>> mask = {i: Dummy() for i in expr.atoms(Integral)}
>>> trigsimp(expr.xreplace(mask)).xreplace({v:k for k,v in mask.items()})
Integral(x0*\phi_y(z)**2, (z, 0, R)) + Integral(\phi_x(z)**2*m(z), (z, 0, R))

Но я думаю, что в общем случае cse лучше, так как, если перед терминами триггера нет общего выражения, они все равно (вероятно) не упростят:

>>> r, e = cse(expr)
>>> trigsimp(e[0]).xreplace(dict(reversed(r)))
Integral(x0*\phi_y(z)**2, (z, 0, R)) + Integral(\phi_x(z)**2*m(z), (z, 0, R))
...