使用SymPy简化自旋加权球谐函数的三角表示

时间:2018-10-22 07:23:09

标签: python sympy

我已经在Sympy中实现了自旋加权球谐函数(SWSH),它给出了正确的表达式,但是形式没有简化。

例如,spin = 0 l = 1 m = 0的SWSH表达式为

(1/tan(0.5*th))**2.0 - 1

例如在Mathematica中可以轻松地将其简化为

cos(th)*csc(0.5*th)**2

我已经尝试过以下方法,以使用Sympy的功能来简化此过程:

  • simplifytrigsimp

  • expr.rewrite(exp).simplify().expand().rewrite(sin).simplify()

  • expr.rewrite(exp).simplify().expand().rewrite(cos).simplify()

但不幸的是,它只是不想简化,我看不到其他任何方式。

最后,我要编写一个函数作为这些东西的总和,并Ineed对结果进行积分。问题是因为这些表达式不能简化,所得到的被积数又长又复杂,并且要花很长时间。

由于无法使用SWSH表达式,因此我无法对其进行硬编码,因此必须计算它们。

因此,如果有人可以引导我使用一种内置的Sympy简化函数来简化此表达式的方法,那将是很好的。希望该方法也可以简化其他SWSH。

1 个答案:

答案 0 :(得分:0)

模块fu.py包含几个专门的三角变换程序。例如,TR2将棕褐色床转换为sin-cos。

from sympy.simplify.fu import *
expr = (1/tan(th/2))**2 - 1      # no floats please, we are symbolic
e2 = TR2(expr).trigsimp()

现在e2是-2*cos(th)/(cos(th) - 1)。它不再是两个项的总和,而是包含cos(th);但另一件事还不是您想要的。事实证明,很难说服SymPy将1-cos(th)变成2*sin(th/2)**2-也许并不奇怪,因为后者看起来确实更复杂。我明白了

e3 = TR7(TR5(TR6(TR11(e2.subs(th, 2*th))))).subs(th, th/2)

,结果为cos(th)/sin(th/2)**2。逻辑是:

  1. 加倍角度,得到-2*cos(2*th)/(cos(2*th) - 1)
  2. TR11-减小双角,得到-2*(-sin(th)**2 + cos(th)**2)/(-sin(th)**2 + cos(th)**2 - 1)
  3. TR6-cos的力量到罪恶的力量,得到(-2*sin(th)**2 + 1)/sin(th)**2。这样就实现了所需的分母形式。仍然需要消除对分子的附带损害。
  4. TR5-罪恶的力量对cos的力量,得到(2*cos(th)**2 - 1)/sin(th)**2
  5. TR7-降低cos功率(增加角度),获得cos(2*th)/sin(th)**2
  6. 半角,得到cos(th)/sin(th/2)**2

步骤4、5、6本质上是3、2、1的倒数。