|
setup diary |
最近は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には変換係数が出てくる。 このような振る舞いを見てみると、いろいろと理解が深まる。
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) }
mjp<-function(j){ diag(sqrt(diffinv(j:-j)*2))[-1,-2*j-2] }