仮想計算機構

IT業界と無縁な派遣社員のブログ

1次元調和振動子の可視化 その2

はじめに

前回のつづきです。

今回も数値計算っぽいことをやります。

小出昭一郎『量子力学』のp.53よりx^2 の期待値は


\overline{x^2}=\frac{\hbar}{mw}(n+\frac{1}{2})=\frac{1}{Mw}(n+\frac{1}{2})

となります。前回と同様 M=w=1 とし、これを数値計算で確かめます。

方法

p_n(x)=X_n(x)X_n(x) から x をサンプリングして、x^2 の平均値をとれば \overline{x^2} が計算できます。p_n(x) からサンプリングする方法については下記サイトを参考にしました。

任意の確率密度分布に従う乱数の生成(von Neumannの棄却法) | Pacocat's Life

プログラム再掲します。

def X(n,M,w):
    A = sqrt(sqrt(w*M/pi)/2^n/factorial(n))

    return lambda x : A*hermite(n,x)*exp(-x^2*M*w/2)

def X2(n,M,w):
    A = sqrt(sqrt(w*M/pi)/2^n/factorial(n))

    return lambda x : (A*hermite(n,x)*exp(-x^2*M*w/2))^2

サンプリング用の関数も作っておきます。

import numpy as np

def sample(f,xmax,xmin,ymax,n):
    xs = []
    ys = []
    x2s = []
    while True:
        x = xmin + (xmax - xmin) * np.random.random()
        y = ymax * np.random.random()
        if f(x)>=y:
            xs.append(x)
            ys.append(y)
            x2s.append(x*x)
        if len(xs)>=n:
            break
    return {"x":xs,"y":ys,"x2":x2s}

今回は n=12 の場合を考えます。p_{12}(x) のグラフは以下のとおりです。

sage: plot(X2(12,1,1),(-10,10))
Launched png viewer for Graphics object consisting of 1 graphics primitive

f:id:riverta1992:20201220140716p:plain

実際にサンプリングできるのか試してみます。

sage: histogram(sample(X2(12,1,1),10,-10,0.6,2000)["x"], bins=100,density=True)+plot(X2(12,1,1),(-10,10))
Launched png viewer for Graphics object consisting of 2 graphics primitives

f:id:riverta1992:20201220140538p:plain

グラフとヒストグラムがちゃんと重なっているので大丈夫そうです。

n=12 の場合、\overline{x^2}=\frac{1}{1\times 1}(12+\frac{1}{2})=12.5 になるはずなので、計算してみましょう。

sage: np.mean(sample(X2(12,1,1),10,-10,0.6,2000)["x2"])
12.347786052776227

いい感じの値が出ました。