首页 > 解决方案 > 使用 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 的功能重现这种简化:

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

归根结底,我正在编写一个函数作为这些东西的总和,并且需要整合结果。问题是因为这些表达式没有简化,得到的被积函数又长又复杂,而且积分需要很长时间。

我无法对 SWSH 的表达式进行硬编码,因为我使用的表达式太多,因此我必须计算它们。

因此,如果有人可以引导我使用内置的 Sympy 简化函数来简化这个表达式,那就太好了。希望该方法也能简化其他 SWSH。

标签: pythonsympy

解决方案


该模块fu.py包含几个专门的三角变换程序。例如,TR2 将 tan-cot 转换为 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);但另一件事还不是你想要的。事实证明很难说服 SymPy1-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 的倒数。


推荐阅读