マイコンかUSB-RS232C変換ICか
昔からデジタル音楽機器がMIDIという通信規格を持っていることは知っていたが、詳しくは知らなかったので、調べてみた。基本的には、シリアル通信で、スタートビットやストップビットがある点では、RS232Cとそっくりである。違いは、MIDIの場合は電圧が5Vで、ボーレートが31250baudという点である。USB-MIDI変換をする場合には、マイコンでやる方法以外に、USB-RS232C変換ICを使う方法もあるようである。しかし、RS232Cの場合の近いボーレートが38400baudであるので、これを変更できるようにする必要があるらしい。マイコンでプログラムを流し込むのが面倒だと思うか、変換ICでボーレートを変更する方が面倒と思うかの、どちらだろうか。
新しい物理定数
SI単位
本日からSI単位の定義が新しくなる.カンデラを除く6つの基本単位の内,秒とメートルの定義は変わらなかったが,残りの4つの基本単位が,4つの物理定数から定義されることになった.これらの物理定数の値は,今後はほぼ変わることが無いだろうから,記憶しておく価値が高まったと言えるだろう.そこで,日本人に覚えやすいように語呂合わせを考えてみた.いくつか考えた中で,まともそうなものを一つずつ紹介する.ちなみに,マイナスは「の」と読むことにしている.
プランク定数(6.62607015e-34) 室に群れ生れ,苺の実よ.
ボルツマン定数(1.380649e-23) 遺産はゼロ,無欲の罪.
電気素量(1.602176634e-19) 広間に避難路,武蔵野一区.
アボガドロ定数(6.02214076e23) 六列に石,オセロ詰み.
2022.4.7追記 電気素量(1.602176634e-19) 人群れに避難路,武蔵野一区. の方がマシかな.後半をもう少しなんとかしたいけど. 電気素量(1.602176634e-19) 人群れに避難路,無残,死の一苦. とかはなんか酷い.
多面体の描画
rglで多面体
正十二面体や正二十面体はややこしい形をしているので、描くのが困難である。rglでこれらを描画しようと思ったら、結構簡単だった。
open3d() shade3d(dodecahedron3d(col='red'))
のようにすると良いようです。任意の多面体を描くには、tmesh3dを使うと良いようです。ただ、頂点の座標を求めたり、面を定義したりするのが、面倒な気がします。
新しい時代
様々な定数
来月から,一つの新しい時代が始まろうとしている。これまで,SI単位は,七つの基本単位が定義され,それらを元に様々な単位が定義されていた。
これが五月二十日から,新しい定義に移行するのである。新しい定義では,三つの基本単位については変更はないが,四つの基本単位は,プランク定数,ボルツマン定数,アボガドロ定数,電気素量から定義されることになった。これまでも光速からメートルが定義されていたが,これで五つの基本的な物理定数が真の意味で定数となり,ここから五つの基本単位ができることとなる。カンデラはなぜ必要なのかはよく分からないが,秒はこれまで通りセシウムを使って定義されている。基本的な物理定数で一定の周期をもつものがあれば,秒もこれを使って定義できるのかも知れないが,今のところそれは難しいようである。また,いずれは精度の高いストロンチウムに置き換えられるのでは無いかと予想している。
これらの物理定数をRを使って使うことも多くなるかも知れないので,以下に定義を書いておこう。
完全な定数になったわけなので、覚えないといけないかな。
nucs<-9192631770 #1/s hyperfine structure transition frezuency of 133Cs cl<-299792458 #m/s speed of light hp<-6.62607015e-34 #Js Plank constant ec<-1.602176634e-19 #C elementary charge kb<-1.380649e-23 #J/K Boltzmann constant na<-6.02214076e23 #1/mol Avogadro constant kcd<-683 #W/sr luminous efficacy of radiation of frequency 540e12Hz
Rの行列
diagの挙動
Rで角運動量演算子を行列表現するときに、diag(seq(j,-j,-1))というようにしていた。しかし、jが0のときには、エラーが出ることが分かった。調べてみると、diagは、成分が二個以上配列を渡されたときには、それを対角成分とする行列を返すが、成分が一個のときには、それをスカラーとみなして、そのスカラーの次元を持つ単位行列を返すことが分かった。そして、0に対しては、0次元の行列をつくろうとする。これがエラーの原因であることが分かった。臨む結果を得るために、if文で条件分岐することにしたが、良い書き方がないかな。
fillの挙動
ruby/tkの互換性
昔ruby/tkで作ったプログラムを動かそうと思ったら、エラーが出て動かなかった。rubyのversionによる違いを修正しても動かないので、tk部分だと予想した。エラー箇所をよくよく見てみると、
t=TkcOval.new(@area,x-r,y-r,x+r,y+r,'fill'=>'black')
のところのfillが問題だということが分かった。これを
t=TkcOval.new(@area,x-r,y-r,x+r,y+r) t.fill='black'と直したら動くようになったが、一度変数を定義しないと属性を指定できないのは面倒に感じる。
pdfの結合
imagemagickではダメだった
複数のpdfを結合して一つのpdfにしたいと思い調べてみた。convertを使って
convert c*.pdf out.pdfとすれば良いらしいので、やってみたが、長い時間がかかってout.pdfを作ったが、エラーが出てうまくいかなかった。そこで、pdftkを使うことにした。インストールしようとしたら、すでに入っていた。コマンドラインで
pdftk c*.pdf cat output out.pdfとしたら、短時間でファイルが生成された。こちらはうまく読めた。少しコマンドが複雑だが、pdftkは便利そうだ。
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] }
androidとunix
androidとPCの間でのデータ転送
最近、タブレットを使う人が増えてきているように感じる。しかし、ipadとPCの間で、直接データの転送をするのは、なかなか面倒らしい。androidの場合には、どうなのか調べてみた。
linuxにUSBで接続すると、dmesgでは認識しているけど、マウントされない。調べてみると、androidはMTPプロトコルを使っているかららしい。そこで、linuxにjmtpfsをインストールして、android側でMTPを有効にすると、自動的にマウントされるようになり、データの転送も自由にできる。アンマウントが
あまりうまく行かないけど。
Rの高速化
データフレームの扱い
Rを使って結晶内の特定の距離の範囲内にある原子を数え上げるプログラムを作っていたのだが、実行が異様に遅い。いろいろと試してみると、データフレームを結合するために使っているrbindのところで、ほとんどの時間を使っていることが分かった。webで検索してみると、dplyrというlibraryのbind_rowsを使うと速くなるというので、試してみたら、なんとか許容範囲の実行時間になって来た。
しかし、もっと速くできるのでは無いかといろいろと試行錯誤していたら、かなり速くすることに成功した。expand.gridを使うと、指定したすべての組み合わせのデータフレームを作ってくれるので、それを利用した。極端な例でこれを説明しよう。
球の中にある格子点の数を数えるプログラムを作るとしよう。座標をふって球の中にある場合に、データフレームに加えていくということをする場合には、以下のようなプログラムになる。
d<-data.frame(x=c(),y=c(),z=c()) for(x in -10:10){ for(y in -10:10){ for(z in -10:10){ if(x^2+y^2+z^2<100){ d<-rbind(d,data.frame(x=x,y=y,z=z)) } }}}
このrbindが時間をかなり使っているようだ。これをexpand.gridで格子点を作って、それを一度に条件判定をするプログラムは、以下のようになる。
d<-expand.grid(x=-10:10,y=-10:10,z=-10:10) d<-subset(d,x^2+y^2+z^2<100)
このときの実行時間は、数百倍も違う。こんなに違うのかと、少し驚いたが、今後Rを使うときには、このようなことを考慮しようと思う。