sympy问题简化/分解/收集

时间:2019-04-23 10:04:55

标签: python-3.x sympy simplify

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

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 :(得分:0)

由于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通常更好,因为如果在trig术语前面没有一个共同的表达,那么它们将(可能)仍然无法简化:

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