読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

(25) 軌道狙い撃ち法

調和振動子の定常状態のSchrödinger方程式

は、
なるg(x)を使うことで、形式的に以下の1階微分方程式に変換できます。

ψ(x)からg(x)からへの変換式を見ると、ψ(x)が偶函数の時g(0)=0、ψ(x)が奇函数の時であることがわかります。

また、ポテンシャルV(x)が調和振動子のように極限で無限大になると仮定すると、解が有限になるには、でなければならないことがわかります。従って、(nは0以上の整数)。境界条件は偶函数と奇函数で共有することに成るので、偶関数はn偶数、奇函数はn奇数と割り当てると、
(nは0以上の整数)と書き直せます。

この微分方程式と狙い撃ち法を使って、まず、調和振動子の励起エネルギー準位を求めましょう。狙い撃ち法というのは、望みの境界条件を得るように初期パラメータを変えて、微分方程式を数値的に解かせる方法です。

/* 5.2.40m */
load(dynamics)$

v(x) := x^2$
n : 1$

g0 : if mod(n, 2) = 0 then 0 else -%pi/2$
asympt : (2 * floor(n / 2) + 1) * %pi / 2$

elow : 0$
ehigh : 8$
dz : 0.05$
zlim : 7$ /* 無限大の代わり */
while ehigh - elow > 10^(-14) do (
  e : (elow + ehigh) / 2,
  print(float(e)),
  s : sqrt(e),
  traj : rk(1 - v(z/s)/s^2*cos(g)^2, g, g0, [z, 0, zlim, dz]),
  final : traj[length(traj)][2],
  if final > asympt then ehigh : e else elow : e)$

厳密解に近い固有値が求められました。

本番です。摂動パラメータを0.01と仮定して、の基底固有値を求めてみましょう。

/* 5.2.41m */
v(x) := x^2 + 0.01*x^4$
n : 0$
gam0 : if mod(n, 2) = 0 then 0 else -%pi/2$
asympt : (2 * floor(n / 2) + 1) * %pi / 2$
elow : 1$
ehigh : 1.01$
dz : 0.02$
zlim : 5$
while ehigh - elow > 10^(-14) do (
  e : (elow + ehigh) / 2,
  print(float(e)),
  s : sqrt(e),
  traj : rk(1 - v(z/s)/s^2*cos(gam)^2, gam, gam0, [z, 0, zlim, dz]),
  final : traj[length(traj)][2],
  if final > asympt then ehigh : e else elow : e)$

(24) 摂動計算で求めた式

を代入してみると、1.00736875ですから、先に試した摂動なしの場合の精度と同程度で一致しています。