読者です 読者をやめる 読者になる 読者になる

どせいたんさき。

ナスダヨー

?:演算子と Rydberg fomula

計算天文学の範囲だとほぼ触れることのない ?: 演算子について.三項間演算子/条件演算子なんて呼ばれる演算子のことでほとんどのプログラミング言語に存在している.しかしながら, if/else 文が存在しているので初学者が触れることはほとんどないと思う.僕も使ったことなかった.

しかし,gnuplot では if 文が使えない(たぶん)ので条件分岐を用いたいときはこれを用いるしかない.*1そんなわけで ?: 演算子を使ってみた.細かな設定(unset clip)は次の記事を参考にした.

Q:関数のある部分だけを表示させたいのですが?
A1:'set clip' と 三項演算子(ternary) 'a ? b : c' を組み合わせましょう.

まず,条件演算子 ?: の使い方から.

 (条件式) ? (条件が成立した場合) : (条件が不成立の場合)

例えばこんな風に使う.

F(x) = -cos(x)
G(x) = exp(-(x-pi)**2/4)
H(x) = x < pi ? F(x) : G(x)
plot [0:*] H(x)


これを今回(もう終わってしまったけれど)の電波天文のレポートに当てはめてみる.

Rydberg fomula

励起した電子が下位の軌道に落ち込むときに放出する光の振動数は次の式によって表される.

\frac{\nu}{c} = R_yZ^2\left(\frac{1}{n^2}-\frac{1}{m^2}\right)
ただし,R_y は Rydberg constant,Z は core charge.

Plot with gnuplot

これを利用して,様々な n,m,Z に対応する光の振動数をまとめて表示してみる.そんなわけで,まず下準備として次のように諸定数,関数を定義する.

Ry = 1.09737315e+7  # Rydberg constant
c  = 3.00e+8        # Speed of light
F(n,m) = (1.0/n**2 - 1.0/m**2) # m to n の遷移を表す
N(x,n,m) = \        # 各 core charge に対応するプロットを定義する
              x < 2.5 ? 2**2*Ry*F(n,m) \ # Z = 2
: 2.51 < x && x < 3.5 ? 3**2*Ry*F(n,m) \ # Z = 3
: 3.51 < x && x < 4.5 ? 4**2*Ry*F(n,m) \ # Z = 4
: 4.51 < x && x < 5.5 ? 5**2*Ry*F(n,m) \ # Z = 5
: 5.51 < x && x < 6.5 ? 6**2*Ry*F(n,m) \ # Z = 6 
: 6.51 < x && x < 7.5 ? 7**2*Ry*F(n,m) \ # Z = 7
: -1000                 # ちょっとした細工
unset clip              # これを設定することでグラフのはみ出した部分を消去できる

範囲指定が微妙にずれているのはグラフを綺麗に表示するためのちょっとしたテクニック.これをやらずにグラフを書いてしまうとグラフを繋ごうとして不必要な縦線が引かれてしまう.そこで,範囲を微妙にずらして定められた部分以外は -1000 に飛ばしてしまい,最後の unset clip ではみ出た部分を絵画しないように設定する.

設定に関しては以上.あとは欲しい遷移について plot するだけ.

set format x "%1.0f"    # x軸の書式設定
set format y "%1.2t%+T" # y軸の書式設定
set xrange [1.5:7.5]
set yrange [0:*]
plot N(x,7,8) title "8 to 7",\
     N(x,8,9) title "9 to 8",\
     N(x,9,10)  title "10 to 9",\
     N(x,10,11) title "11 to 10",\
     N(x,11,12) title "12 to 11",\
     N(x,9,11) title "11 to 9"

ここに重ねて与えられた振動数をプロットすれば,どんな遷移に対応するのかが大雑把に予想できる.細かな部分の判断は難しいが,大まかな目安をつけるためにはまずまず役立つと思う.

また,電子遷移ではなく回転量子状態の遷移に関しても同じ方法を用いることができる.不連続な値をとるグラフについても gnuplot である程度綺麗に絵画することができるというお話でした.

*1:本当は set parametric を用いるという方法もある