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 的功能重现这种简化:
simplify
和trigsimp
expr.rewrite(exp).simplify().expand().rewrite(sin).simplify()
expr.rewrite(exp).simplify().expand().rewrite(cos).simplify()
但不幸的是,它只是不想简化,我看不到任何其他方式。
归根结底,我正在编写一个函数作为这些东西的总和,并且需要整合结果。问题是因为这些表达式没有简化,得到的被积函数又长又复杂,而且积分需要很长时间。
我无法对 SWSH 的表达式进行硬编码,因为我使用的表达式太多,因此我必须计算它们。
因此,如果有人可以引导我使用内置的 Sympy 简化函数来简化这个表达式,那就太好了。希望该方法也能简化其他 SWSH。
解决方案
该模块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
. 逻辑是:
- 加倍角度,得到
-2*cos(2*th)/(cos(2*th) - 1)
- TR11 - 减少双角,得到
-2*(-sin(th)**2 + cos(th)**2)/(-sin(th)**2 + cos(th)**2 - 1)
- TR6 - cos 的力量到罪的力量,得到
(-2*sin(th)**2 + 1)/sin(th)**2
. 这实现了所需的分母形式;仍然需要消除对分子的附带损害。 - TR5 - 罪恶的力量到cos的力量,得到
(2*cos(th)**2 - 1)/sin(th)**2
- TR7 - 降低 cos 功率(增加角度),得到
cos(2*th)/sin(th)**2
- 半角,得到
cos(th)/sin(th/2)**2
步骤 4、5、6 本质上是 3、2、1 的倒数。
推荐阅读
- javascript - React-native-arkit/ 如何使用 ARKit.Sprite 设置位置
- c++ - 创建和管理查找容器的正确方法
- javascript - 无法将生成的 jsPdf 发送到服务器
- c++ - 还使用“外部模板类”语法时模板类静态成员变量的特化
- bash - 用于组合图像堆栈的 bash 脚本。命令不存在
- c# - 为什么该方法不返回自定义异常消息
- spring-boot - 如何在@StreamListener 中添加日期条件
- ruby-on-rails - IO.read("#.../layouts/application.html.erb") 返回行 'application...s-track' 而不是 'application'
- elasticsearch - elasticsearch中聚合的排序结果
- swift - 创建实例时如何识别init?