スピン1/2の2粒子が自由空間に存在するときの空間分布

スピン1/2の粒子2個が存在する場合、それぞれのスピンの値によって、波動関数の空間部分は「対称」あるいは「反対称」となることが知られているね。今回は、最も簡単な1次元自由空間中で2個の粒子が平面波で表される場合の空間分布を復習するよ。波動関数の空間部分の対称関数と反対称関数はそれぞれ

\begin{align}
\psi^{(S)}(x_1, x_2, t) &\ = \frac{1}{\sqrt{2}} \left[ e^{i k_1\cdot x_1 +i k_2\cdot x_2} + e^{i k_1\cdot x_2 +i k_2\cdot x_1}\right]e^{-i\omega t} \\
\psi^{(A)}(x_1, x_2, t) &\ =\frac{1}{\sqrt{2}} \left[ e^{i k_1\cdot x_1 +i k_2\cdot x_2}- e^{i k_1\cdot x_2 +i k_2\cdot x_1}\right]e^{-i\omega t}\\
\end{align}

となるね。ただし、

\begin{align}
E_1 = \frac{\hbar^2 k_1^2}{2m_e} \ , \ E_2 = \frac{\hbar^2 k_2^2}{2m_e} \ , \ E = E_1 + E_2 \ , \ \omega = \frac{E}{\hbar}
\end{align}

の関係があるよ。この波動関数は、粒子1と粒子2のそれぞれの位置 $x_1$ と $x_2$ を与えたときの振幅を与えるので、1次元上で波動関数の様子を可視化するには工夫が必要になるね。今回は、粒子1の位置をゼロ、すなわち $x_1 =0$ として、横軸を粒子2の位置 $x_2$、縦軸を波動関数の実部、虚部、絶対値の2乗の値とするね。なお、波動関数の絶対値の2乗

\begin{align}
|\psi^{(S)}(x_1, x_2, t)|^2 &\ = 1 + \cos\left[ (k_1 – k_2)(x_1 – x_2) \right]\\
|\psi^{(A)}(x_1, x_2, t)|^2 &\ = 1 – \cos\left[ (k_1 – k_2)(x_1 – x_2) \right]\\
\end{align}

は、各点における粒子の存在確率(今回、規格化が不十分だったので最大値が2になってしまったよ)を表すよ。2粒子の場合には相対位置のみ依存しているね。

計算結果

$E_1=1.0[{\rm eV}]$(右向き)と $E_2=1.5[{\rm eV}]$(右向き)

まずは、同じ方向へ進む2粒子の場合の計算結果を示すよ。粒子1の位置を $x_1 =0$ としているよ。対称関数の場合には粒子2はゼロ近傍にいる確率が高い反面、反対称波動関数の粒子2はゼロ近傍が一番低くなっているね。

対称関数

反対称関数

$E_1=1.0[{\rm eV}]$(右向き)と $E_2=1.5[{\rm eV}]$(左向き)

次は、反対方向へ進む2粒子の場合の計算結果を示すよ。粒子1の位置を $x_1 =0$ としているよ。異なるエネルギー(波数)の干渉なのに、粒子2の存在確率が時間に依存しないのは、ちょっと不思議だけれども、先に示した絶対値の2乗の表式は時間に依存しないから当たり前だよね。あと、絶対値の2乗の波数が大きくなったね。これは、波数 $k_1$ と $k_2$ の差が存在確率の波数に対応していることで理解できるね。

対称関数

反対称関数

$E_1=1.0[{\rm eV}]$(右向き)と $E_2=1.0[{\rm eV}]$(左向き)

最後に、同じエネルギーの2粒子が反対方向へ進む場合の計算結果を示すよ。粒子1の位置を $x_1 =0$ としているよ。

対称関数

反対称関数

粒子が1個の場合は単純な平面波だけれども、2個になった途端に複雑さが増していくね。


「波束」の作り方(量子力学シミュレーション超入門【第3回】)

ポテンシャルが0のシュレーディンガー方程式の解である平面波は前回示したね。この平面波を重ね合わせることで、任意の波形を作ることができるよ。今回は、波数分布をガウス分布とした波束の作り方を解説するよ。波束は異なる波数(速度)の平面波の重ね合わせで作ることができるよ。中心波数 $k_0$ としたときの表式は次のとおりだよ。

\begin{align}
\psi(x,t)= \frac{1}{ \sqrt{2\sigma \pi L}}\int dk\, \exp\left[ ik(x-x_0) -i\omega t-\left(\frac{ k-k_0 }{2\sigma} \right)^2 \right]
\end{align}

$k_0$ は波束が進む速度 $v$ と、 $v_0 =p_0 / m_e = \hbar k_0 / m_e$ の関係があるよ。

波束の運動の計算結果

波束の中心エネルギー: $E_0 = 10[{\rm eV}]$
空間スケール: $10^{-11}[{\rm m}]$ //横軸の値
時間スケール: $10^{-16}[{\rm s}]$ //動画1コマの時間間隔

波束の中心エネルギー: $E_0 = 0[{\rm eV}]$
空間スケール: $10^{-11}[{\rm m}]$ //横軸の値
時間スケール: $4\times 10^{-15}[{\rm s}]$ //動画1コマの時間間隔

ちなみに、どんな波束も時間とともに広がっていくよ。その理由は分散関係 $\omega$ が $k$ に比例しないからだよ。

プログラムソース(C++)


////////////////////////////////////////////////////////////////////
// 【第3回】「波束」の作り方
////////////////////////////////////////////////////////////////////
#define _USE_MATH_DEFINES
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <string>
#include <complex>

/////////////////////////////////////////////////////////////////
//物理定数
/////////////////////////////////////////////////////////////////
//光速
const double c = 2.99792458E+8;
//真空の透磁率
const double mu0 = 4.0*M_PI*1.0E-7;
//真空の誘電率
const double epsilon0 = 1.0 / (4.0*M_PI*c*c)*1.0E+7;
//プランク定数
const double h = 6.6260896 * 1.0E-34;
double hbar = h / (2.0*M_PI);
//電子の質量
const double me = 9.10938215 * 1.0E-31;
//電子ボルト
const double eV = 1.60217733 * 1.0E-19;
//複素数
const std::complex<double> I = std::complex<double>(0.0, 1.0);
/////////////////////////////////////////////////////////////////
//物理系の設定
/////////////////////////////////////////////////////////////////
//空間分割数
const int Nx = 500;
//空間分割サイズ
double dx = 1.0E-10;
//重ね合わせの数
const int N = 200;
//パルスの幅
double delta_x = 1.0E-8;
double sigma = 2.0*sqrt(2.0*log(2.0)) / (delta_x);
//波数の間隔
double dk = 30.0 / (delta_x * double(N + 1));
//電子波のエネルギー
const double E0 = 10.0 * eV;
//波数の中心
double k0 = sqrt(2.0 * me * E0 / pow(hbar, 2));
//角振動数の中心
double omega0 = hbar / (2.0*me) * pow(k0, 2);

//計算時間の幅
const int ts = 0, te = 300;
//時間間隔
double dt = 1.0 * 1.0E-16;
/////////////////////////////////////////////////////////////////
const int precision_N = 4;

int main() {
	//出力ストリームによるファイルオープン
	std::ofstream fout;
	fout.open("wave.txt");
	fout << "#x:位置" << std::endl;
	fout << "#y:確率振幅" << std::endl;
	fout << "#legend: 実部 虚部 絶対値" << std::endl;
	fout << "#showLines: true true true" << std::endl;
	fout << "#showMarkers: false false false" << std::endl;
	fout << "#xrange:" << -Nx / 2 << " " << Nx / 2 << " " << Nx / 10 << std::endl;
	fout << "#yrange:" << -0.30 << " " << 0.30 << " " << 0.1 << std::endl;

	//各時刻における計算を行う
	for (int tn = ts; tn <= te; tn++) {
		double t_real = dt * double(tn);
		std::cout << tn << std::endl;
		fout << "#coma:" << tn << std::endl;

		for (int nx = 0; nx <= Nx; nx++) {
			double x = dx * (nx - Nx/2);
			std::complex<double> Psi = std::complex<double>(0.0, 0.0);
			for (int jz = 0; jz <= N; jz++) {
				double k = (k0 + dk * double(jz - N / 2));
				double omega = hbar / (2.0*me) * pow(k, 2);
				Psi += exp(I*(k*x - omega * t_real)) * exp(-1.0 / 2.0 * pow((k - k0) / sigma, 2));
			}
			Psi = Psi / double(N);
			fout << std::setprecision(precision_N);
			fout << x / dx << " " << Psi.real() << " " << Psi.imag() << " " << abs(Psi) << std::endl;
		}
		fout << std::endl;
	}
	fout.close();
}