我已经在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的功能来简化此过程:
simplify
和trigsimp
expr.rewrite(exp).simplify().expand().rewrite(sin).simplify()
expr.rewrite(exp).simplify().expand().rewrite(cos).simplify()
但不幸的是,它只是不想简化,我看不到其他任何方式。
最后,我要编写一个函数作为这些东西的总和,并Ineed对结果进行积分。问题是因为这些表达式不能简化,所得到的被积数又长又复杂,并且要花很长时间。
由于无法使用SWSH表达式,因此我无法对其进行硬编码,因此必须计算它们。
因此,如果有人可以引导我使用一种内置的Sympy简化函数来简化此表达式的方法,那将是很好的。希望该方法也可以简化其他SWSH。
答案 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
。逻辑是:
-2*cos(2*th)/(cos(2*th) - 1)
-2*(-sin(th)**2 + cos(th)**2)/(-sin(th)**2 + cos(th)**2 - 1)
(-2*sin(th)**2 + 1)/sin(th)**2
。这样就实现了所需的分母形式。仍然需要消除对分子的附带损害。(2*cos(th)**2 - 1)/sin(th)**2
cos(2*th)/sin(th)**2
cos(th)/sin(th/2)**2
步骤4、5、6本质上是3、2、1的倒数。