2018年
12月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2018-12-19 Rで角運動量

_ 固有値と変換行列

最近はPCの性能が上がり、便利なフリーソフトが増えてきたので、PCを使って簡単にいろいろなことができるようになってきている。 様々な学習にもPCを利用すると、理解が深まることがある。 私は式変形にはmaximaを、数値計算にはRを使って、理解の助けにしている。 例として、角運動量をRを使っていじってみよう。

角運動量演算子は、Jzの固有関数を使うと行列表示できる。 これをRで表すと、以下のようになる。

mjz<-function(j){return( diag(seq(j,-j,-1)) )}
mjp<-function(j){
 jp<-matrix(0,nrow=2*j+1,ncol=2*j+1,byrow=TRUE)
 for(i in 1:(j*2)){jp[i,i+1]<-sqrt(i*(j*2+1-i))}
 return(jp)
}
mjm<-function(j){return( t(mjp(j)) )}
mjx<-function(j){return( (mjp(j)+mjm(j))/2 )}
mjy<-function(j){return( (mjp(j)-mjm(j))/2i )}
me<-function(j){return( diag(2*j+1) )}
ここで、mjpとmjmはそれぞれJ+とJ-を、meは2J+1次元の単位行列を表す。 Jxを対角化するには、例えばeigen(mjx(3/2))とすると良い。 valuesに対角成分に対応する固有値が、vectorsには変換係数が出てくる。 このような振る舞いを見てみると、いろいろと理解が深まる。

_ 2020/1/29追記

2019/3/21に指摘したバグも含めて、単純化したものも公開しておきます。そのプログラムがすぐに見つからなくて、公開した方が自分が便利なので。
mjz<-function(j){ diag(j:-j,2*j+1) }
mjp<-function(j){ matrix(sqrt(cumsum(j:-j)*2)*!1:(2*j+1)^2%%(2*j+2),2*j+1) }
mjm<-function(j){ t(mjp(j)) }
mjx<-function(j){ (mjp(j)+mjm(j))/2 }
mjy<-function(j){ (mjp(j)-mjm(j))/2i }
me<-function(j){ diag(2*j+1) }

_ 2020/3/17追記

さらに、シンプルに書くことができたので、更新しておきます。
mjp<-function(j){ diag(sqrt(diffinv(j:-j)*2))[-1,-2*j-2] }