1.介绍
在使用mathematica的过程中,为了使代码看起来更简洁和提高可读性,对于一些重复出现的代码块,我们会把它们定义成相应的函数,这样使用起来就不用每次都写一大串了。比如我这里要绘制三角函数的图像,并尽可能的让其达到出版水平,我们可以这么做:
可是如果我们还要绘制cos的图像的话我们可不想把它复制一份,因为看起来太繁琐了,我们只需要将需要改变的地方定义成函数,这样后面再用的时候就不需要写一大串了。比如:
以上想表达的意思是,自定义函数可以大大简化程序的表达式和提高使用效率。
对于平时使用过程中一些从来不会变化的东西,比如产生算符和湮灭算符在Fock态下的矩阵形式,我们可不希望每次使用的时候都定义一遍,我们希望它们和系统自带的其它函数一样,用的时候直接使用那该多好啊。其实,我们只需要写一个程序包,把它们都放进去,并每次启动mma的时候自动调用这个问题就解决了。
2.自定义程序包
1. 新建一个.wl文件,文件→新建→程序包/脚本→Wolfram语言程序包
2.定义程序包的名称,这里定义为QuantumNotation,然后在新建的.wl文件中输入
BeginPackage["MyFunctions`"]
和
EndPackage[]
有点像LaTeX,这里先写一个package环境,然后我们在里面定义我们的函数。
3.定义私有函数,在上面的两个命令中间输入
Begin["`Private`"]
和
End[]
然后我们就可以在它们中间自定义函数了。
4.自定义函数,这里我以Quantum Rabi Model的对角化为例,我首先需要将哈密顿量写成矩阵形式。QRM的哈密顿量长这样:
为了将哈密顿量写成矩阵,我们需要将里面所有的算符先写成矩阵。
我们首先定义光场算符:
create[n_]:=Table[Sqrt[j]KroneckerDelta[i,j-1],{i,0,n-1},{j,0,n-1}]
destory[n_]:=Table[Sqrt[j+1]KroneckerDelta[i,j+1],{i,0,n-1},{j,0,n-1}]
numO[n_]:=Table[If[i==j,i,0],{i,0,n-1},{j,0,n-1}]
再定义自旋算符:
{sx,sy,sz}=Table[PauliMatrix[i],{i,{1,2,3}}]
再定义单位矩阵:
IMatrix[n_]:=SparseArray[IdentityMatrix[n]]
有了上面的定义以后,我们就可以构造哈密顿量了。
5. 构造哈密顿量,直接利用定义好的矩阵去写即可。具体如下:
rabiHamiltonian[Ncut_,\omega_,\Omega_,g_]:=
\omega KroneckerProduct[numO[n], IMatrix[2]]+
\Omega/2 KroneckerProduct[IMatrix[n],sz]+
g KroneckerProduct[create[n]+destory[n],sx]
这样矩阵定义我们就完成了,现在我们把它们写到程序包里。
6. 构造程序包,将上面所有的东西写到一起。
直接这么写有一个问题,如果长时间不用,甚至会连定义的函数里有几个参数,以及是干嘛的都忘记了,因此我们还需要给里面的函数加一个声明进去。
7. 声明函数,具体操作就是在定义私有函数前面定义包之后用如下的格式写入声明即可:
create::usage="产生算符在Fock态下的矩阵表示。使用方式为create[Ncut],这里Ncut是截断数。
destory::usage="湮灭算符在Fock态下的矩阵表示。使用方式为destory[Ncut],这里Ncut是截断数。
numO::usage="粒子数算符在Fock态下的矩阵表示。使用方式为numO[Ncut],这里Ncut是截断数。
sx::usage="sigma_x算符";
sy::usage="sigma_y算符";
sz::usage="sigma_z算符";
IMatrix::usage="单位矩阵";
rabiHamiltonian::uasge="rabi模型哈密顿量,其中有四个参数,rabiHamiltonian[Ncut,omega,Omega,g]"
8 程序包的保存,给程序包起个名字,并将其保存在特定路径。在保存程序包的时候,一般把它们都写到一起,然后选中单元格转为InputForm,如下所示:
9 程序包的调用,使用Get函数来来完成,后者Needs也可以。这里以Get为例:
我这里文件位置为 "C:\Users\liugang\OneDrive\quantumNotation.wl"
这里就会看到,当我们调用以后,自定义的函数就会和系统预定义函数一样了。下面我们测试一下:
定义好程序包以后会方便很多,但是如果每次使用的时候都调用一次的话,也是麻烦,所以我们可以添加Get函数到初始化文件中。
10 程序包的自动调用,在mma中输入FindFile["init.m"]//SystomOpen并运行,此时会打开一个init.m的文件,然后将
Get["C:\\Users\\liugang\\OneDrive\\quantumNotation.wl"]
复制进去并保存即可。以后每次启动内核都会自动调用这个程序包。
比如,我退出内核以后再次要输入定义好的函数的时候直接就可以输入即可。
PS: 对角化不属于程序包的内容,后面就不写了。
关注公众号:小刚备忘录 获取相应代码文件。