【问题标题】:Issues with sympy simplify / factor / collectsympy 简化/因素/收集的问题
【发布时间】:2019-04-23 10:04:54
【问题描述】:

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

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

【问题讨论】:

  • 在我的测试中,第三个积分使simplify 无法正常工作。仅将simplify 应用于前两个术语。 simplify 是一个复杂的函数(模块),因此很难确切知道它使用了什么启发式算法。
  • 上面的例子只是一个例子,虽然恒等式本质上很简单,但我正在使用的方程要长得多。所以我真的需要自动完成,手动简化违背了使用 sympy 的全部目的。我猜问题出在因子函数子程序中。

标签: python-3.x sympy simplify


【解决方案1】:

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

【讨论】:

  • 非常感谢。我认为您不仅解决了我的积分问题,而且可能还解决了我在简化大型方程组时遇到的另一个问题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多