mathematica实现非对易代数计算

问题描述

这个问题来源于同学一次偶然的提问。一般的符号计算推导会涉及非对易代数,尤其在理论物理中,对易关系是物理系统非常重要的代数结构,在理论物理很多领域都有广泛的应用。不过很多情况下,心算手推可以直接获得简单的对易子的结果,而在实际应用的理论中,复杂的对易子关系就不那么容易看出或者手动计算十分繁琐,所以就有必要利用符号计算软件强大的功能实现这个过程,解放理论学者的双手。当然,功能繁多的mathematica集成了非对易代数的计算模块,实现的格式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(*mathematica的非对易模块的调用格式,其中“**”表示算符操作*)
Unprotect[NonCommutativeMultiply];
A_ ** (B_ + C_) := A ** B + A ** C
(B_ + C_) ** A_ := B ** A + C ** A
A_ ** c_?NumberQ := c A
c_?NumberQ ** A_ := c A
A_ ** (B_ c_?NumberQ) := c A ** B
(A_ c_?NumberQ) ** B_ := c A ** B
A_ ** (B_ c_Rational) := c A ** B
(A_ c_Rational) ** B_ := c A ** B
A_ ** (B_ c_Power) := c A ** B
(A_ c_Power) ** B_ := c A ** B

(*定义对易关系的函数*)

commutator[A_, B_] := A ** B - B ** A
(*这里以定义坐标动量对易关系为例*)
fundamentalCommutation[expr_] :=
ExpandAll[expr //. p[i_] ** q[i_] :> q[i] ** p[i] - I h]

可以看出不那么简洁,而且有些功能需要重新定义,学习成本很高。所以这里介绍一款mathematica开源插件,彻底解决mathematica非对易计算的痛点。(btw Maple有更为成熟的解决方案,这方面mathematica要逊色一些,这里不多赘述)

解决方案

这款插件叫NCAlgebra,它是基于mathematica的非对易模块开发的,省去了原有mathematica模块非对易代数语言的学习成本和rewheel的过程。

插件获得与安装

插件可以在github上直接下载,地址是https://github.com/NCAlgebra/NC。插件作者早在2017年就完成了基本的开发,稳定版5.0可以直接在页面上下载,当然也可以直接clone作者当前的仓库。下载完解压之后会在根目录中看到一个“InstallNCAlgebra.nb”文件,直接用mathematica打开,按照英文指示安装即可。这个note文件实质上隐藏了安装命令。

插件作者十分细心给出了安装指导,他在note文件中反复强调了最重要的步骤:把一开始解压的包含note文件的根文件夹名更改为NC,以便插件集成过程中在mathematica的环境配置。

插件的使用:计算对易子

下面介绍插件关于计算对易子的使用
这里以计算

为例。
其中基本的对易关系是

调用插件,导入NC模块以及非对易模块:

1
2
3
(*Import package*)<< NC`
<< NCAlgebra`
<< NCGBX`

定义基本对易关系:
1
2
3
4
5
6
7
(*约定算符作用的方向和顺序*)
SetNonCommutative[Rp, Rm, Rz]
SetCommutative[c, s]
SetMonomialOrder[Rz, Rp, Rm] (*x to the left,p to the right*)
NCSetOutput[NonCommutativeMultiply -> True] (*pretty output*)
(*利用NCmakeGB设置基本对易关系的约束 *)
gb = NCMakeGB[{Rp ** Rm - Rm ** Rp + Rz, Rz ** Rp - Rp ** Rz - 2 Rp, Rz ** Rm - Rm ** Rz + 2 Rm}, 20]

和mathematica非对易语法一样,定义对易表达式:
1
Comm[A_, B_] := A ** B - B ** A;

然后便可以通过NC的模块算符操作
1
2
3
4
(*计算对易关系并展开,注意这里NCExpand是算符操作的展开,不要和mathematica自带的expand函数混淆*)
expression = Comm[SubPlus[\[Sigma]], SubMinus[\[Sigma]]] // NCExpand
(*对展开的对易式做基本对易关系替换,并把最后的结果展开*)
NCReplaceRepeated[expression, gb] // NCExpand

不过由于替换函数(在mathematica中是表达式后/.{x->y})过于傻瓜,只能替换形式一致的符号,所以往往一次替换并不能给出最简单的结果,所以有网友在stackexchange上提出了一个解决方案1——就是多替换几次。利用上面的关系式循环嵌套若干次直到最后形式收敛即可。或者按照该网友的方法,定义替换函数,重复调用即可:
1
2
foo[X_] := NCExpand@NCReplaceRepeated[X, gb]
expression // foo // foo // foo // foo

最后输出的结果是
1
c^4 Rz + 2 c^3 Rm s - 2 c^3 Rp s - 2 c Rm s^3 - 2 c Rp s^3 + Rz s^4

这里需要注意的是,NC的算符识别对有特殊下标的符号不是很友好,所以这里把$R_-$换成了$R_m$,其他同理。

参考

1. https://mathematica.stackexchange.com/questions/240267/calculating-commutators-in-quantum-mechanics-symbolically-with-the-help-of-mathe