当函数积分存在时,我无法获得简化函数来简化三角恒等式。我举了一个简单的例子,说明它无法按预期工作。
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))
答案 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))