緒言
以前、QuTIPという量子ダイナミクスの計算のためのフレームワークについて、簡単な解説記事を書いた。
QuTIPのチュートリアルには、これ以外にも多くの例が挙げられており、ライブラリの使い方の理解などに大変役立つ。
これらは単純にcloneして動かして見ても良いのだが、ipywidgetsというライブラリを使うことでjupyter notebook上でパラメータなどをインタラクティブに操作しながら結果のグラフを表示させたりすることができ、モデルの理解に有用だと思う。
本記事では、これについて紹介したい。
ipywidgetsのインストールなど
ipywidgetsのインストールは、pipで簡単に行うことができる。
解説などは、すでに有用なページ1などがあるので、それらを参考にしてほしい。
Jammis-Cummingsモデルをinteractiveにしてみる
チュートリアルに紹介されているJaynes-Cummingsモデルを動かしてみる。
これをipywidgetsを使って書き直して見たコードは、ここにある。
やることは簡単で、チュートリアルではトップレベルに書かれているシミュレーションのプログラムを関数化して、それをinteract()
関数で呼んでやるだけだ。
def calculate(wc_per_2pi, wa_per_2pi, g_per_2pi, kappa, gamma, n_th_a, use_rwa = True):
wc = wc_per_2pi * 2 * np.pi # cavity frequency
wa = wa_per_2pi * 2 * np.pi # atom frequency
g = g_per_2pi * 2 * np.pi # coupling strength
#kappa = 0.005 # cavity dissipation rate
#gamma = 0.05 # atom dissipation rate
N = 15 # number of cavity fock states
#n_th_a = 0.0 # temperature in frequency units
#use_rwa = True
tlist = np.linspace(0,25,100)
# intial state
psi0 = tensor(basis(N,0), basis(2,1)) # start with an excited atom
# operators
a = tensor(destroy(N), qeye(2))
sm = tensor(qeye(N), destroy(2))
# Hamiltonian
if use_rwa:
H = wc * a.dag() * a + wa * sm.dag() * sm + g * (a.dag() * sm + a * sm.dag())
else:
H = wc * a.dag() * a + wa * sm.dag() * sm + g * (a.dag() + a) * (sm + sm.dag())
c_op_list = []
rate = kappa * (1 + n_th_a)
if rate > 0.0:
c_op_list.append(np.sqrt(rate) * a)
rate = kappa * n_th_a
if rate > 0.0:
c_op_list.append(np.sqrt(rate) * a.dag())
rate = gamma
if rate > 0.0:
c_op_list.append(np.sqrt(rate) * sm)
output = mesolve(H, psi0, tlist, c_op_list, [a.dag() * a, sm.dag() * sm])
fig, ax = plt.subplots(figsize=(8,5))
ax.plot(tlist, output.expect[0], label="Cavity")
ax.plot(tlist, output.expect[1], label="Atom excited state")
ax.legend()
ax.set_xlabel('Time')
ax.set_ylabel('Occupation probability')
ax.set_title('Vacuum Rabi oscillations');
from ipywidgets import interact
interact(calculate, wc_per_2pi = (0, 2, 0.1), wa_per_2pi = (0, 2, 0.1), g_per_2pi = (0.00, 0.1, 0.01),
kappa = (0.0, 0.01, 0.001), gamma = (0.0, 0.10, 0.01), n_th_a = 0 )
動かしてみよう
jupyter notebookでこれを実行すると、以下のような画面が現れる。
パラメータを変化させるためのバーが出ている。なお、この初期設定パラメータは全て公式のチュートリアルにあるパラメータと同じ値である。
これをグリグリやってみる。
QuTIPとJupyter-notebookで遊んで見た pic.twitter.com/bUgG6cnKQx
— swakamoto (@swakamoto) 2019年6月10日
こうやってみると、「共振器と原子の振動数(wcとwa)が近接していないと、振動しないのだな。。。」とか、「gの値(共振器と原子の結合定数)が大きくなると、振動数が大きくなる」などといったことがわかりやすく、自分で引数をぽちぽち変えるよりもモデルの性格などが見えて来やすいと思う。
この手の数値シミュレーションにおいては、QuTIPに限らなくても有用な場面は多いと思うので、今後も「まずは遊んでみるつもりで」このツールを積極的に使っていきたいと思った次第である。