sympy 的问题简化/分解/收集

Issues with sympy simplify / factor / collect

存在函数积分时,我无法获得简化三角恒等式的简化函数。我举了一个简单的例子,它没有按预期工作。

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

因为 trigsimp 会简化 a*cos(x)**2 + a*sin(x)**2 + b 如果您将 Integrals 替换为符号,它应该可以工作。一种方法是:

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