transfer_matrix.py ドキュメント
伝達行列法を用いて1次元の波動関数と透過確率を計算するモジュールです。
このスクリプトは、多層構造における電子の1次元波動関数と透過確率を、伝達行列法(Transfer Matrix Method)を用いて計算します。 ポテンシャルプロファイルは、Excelファイルから読み込むか、または多重量子井戸(Multiple Quantum Well, MQW)モデルに基づいて生成することができます。 計算結果はグラフとして表示され、透過確率データはExcelファイルに保存されます。
関連リンク: :doc:transfer_matrix_usage
モジュール内容
transfer_matrix.py は、量子力学における1次元の多層ポテンシャル問題に対する波動関数と透過確率を計算するためのPythonスクリプトです。物理定数、計算パラメータ、プロット設定がグローバル変数として定義されています。
主な機能は以下の通りです。
ポテンシャルプロファイルの定義: 多重量子井戸(MQW)モデルに基づいてポテンシャルを生成するか、または外部のExcelファイルから読み込みます。
波動関数と透過確率の計算: 伝達行列法 (
Transfer Matrix Method) を使用して、指定されたエネルギーにおける電子の波動関数と透過確率を計算します。解析解との比較: 無限に深い井戸型ポテンシャルの解析解との比較情報を提供し、計算結果の妥当性を確認するための参考情報を示します。
結果の可視化:
matplotlibを用いて、ポテンシャルプロファイル、有効質量、波数、振幅、波動関数、およびエネルギーに対する透過確率をグラフとして表示します。データのエクスポート: 透過確率データやポテンシャルプロファイルをExcelファイルに保存します。
コマンドライン引数処理: コマンドライン引数を通じて、計算モード (
wfまたはtr) や各種パラメータを柔軟に設定できます。
非標準ライブラリ
このスクリプトは以下の非標準ライブラリを使用しています。
numpy: 数値計算に使用されます。特に配列操作、数学関数 (sqrt,exp,log,sin,cos,tan,cosh,sinh)、および線形代数 (numpy.linalg) が利用されます。pandas: データフレームの操作やExcelファイルの読み書き (read_excel,to_excel) に使用されます。matplotlib(pyplot): 計算結果をグラフとして可視化するために使用されます。
グローバル定数
このスクリプトで使用される物理定数です。
pi: 円周率 (3.141592653589793)pi2:2.0 * pi(6.283185307179586)h: プランク定数 (6.6260755e-34Js)hbar: ディラック定数 (1.05459e-34Js)c: 真空中の光速 (2.99792458e8m/s)e: 素電荷 (1.60218e-19C)e0: 真空の誘電率 (8.854418782e-12C^2^ N^-1^ m^-2^)kB: ボルツマン定数 (1.380658e-23JK^-1^)me: 電子質量 (9.1093897e-31kg)R: モル気体定数 (8.314462618J/K/mol)a0: ボーア半径 (5.29177e-11m)
グローバル設定
スクリプトの動作や計算パラメータを制御するためのグローバル設定です。これらはコマンドライン引数によって上書きされる可能性があります。
mode: 実行モード。デフォルトは'wf'。'wf': 波動関数計算モード。'tr': 透過確率計算モード。
pottype: ポテンシャルの種類または定義ファイル。デフォルトは空文字列 ('')。空文字列 (デフォルト): コマンドライン引数で指定する必要があります。
'mqw': 多重量子井戸ポテンシャルを生成します。Excelファイルパス: 指定されたExcelファイルからポテンシャルデータを読み込みます(例:
'potential_defect.xlsx')。
barrierwidth: 障壁の幅 (Å)。デフォルトは1.0。wellwidth: 井戸の幅 (Å)。デフォルトは5.4064 - barrierwidth。barrierheight: 障壁の高さ (eV)。デフォルトは10.0。nbarriers: 障壁の数。デフォルトは10。Ez0: 波動関数計算モード (wf) および透過確率計算の基準エネルギー (eV)。デフォルトは0.1。Emin: 透過確率計算モード (tr) におけるエネルギーの最小値 (eV)。デフォルトは0.01。Emax: 透過確率計算モード (tr) におけるエネルギーの最大値 (eV)。デフォルトは9.5。nE: 透過確率計算モード (tr) におけるエネルギーの分割数。デフォルトは1001。zmin: 計算範囲のz座標の最小値 (Å)。デフォルトは-20.0。zmax: 計算範囲のz座標の最大値 (Å)。デフォルトは70.0。nz: 計算範囲のz座標の分割数。デフォルトは201。figsize:matplotlibの図のサイズ (幅, 高さ)。デフォルトは(8, 8)。fontsize: 図のフォントサイズ。デフォルトは12。legend_fontsize: 図の凡例のフォントサイズ。デフォルトは8。
関数一覧
pfloat(str)
文字列を浮動小数点数に安全に変換します。
float() 関数と同様に文字列を浮動小数点数に変換しますが、変換に失敗した場合はエラーを発生させずに None を返します。
:param str: 変換する文字列。
:type str: str
:returns: 変換された浮動小数点数、または変換できなかった場合は None。
:rtype: float or None
pint(str)
文字列を整数に安全に変換します。
int() 関数と同様に文字列を整数に変換しますが、変換に失敗した場合はエラーを発生させずに None を返します。
:param str: 変換する文字列。
:type str: str
:returns: 変換された整数、または変換できなかった場合は None。
:rtype: int or None
getarg(position, defval = None)
コマンドライン引数を安全に取得します。
sys.argv から指定された位置の引数を取得します。指定された位置に引数が存在しない場合は、デフォルト値を返します。
:param position: 取得する引数の位置 (0-indexed)。 :type position: int :param defval: 引数が存在しない場合に返すデフォルト値。 :type defval: any, optional :returns: 指定された位置の引数、またはデフォルト値。 :rtype: str or any
getfloatarg(position, defval = None)
コマンドライン引数を浮動小数点数として安全に取得します。
sys.argv から指定された位置の引数を取得し、pfloat() 関数を使って浮動小数点数に変換します。引数が存在しない、または変換できない場合はデフォルト値を返します。
:param position: 取得する引数の位置 (0-indexed)。 :type position: int :param defval: 引数が存在しない、または変換できない場合に返すデフォルト値。 :type defval: float or None, optional :returns: 変換された浮動小数点数、またはデフォルト値。 :rtype: float or None
getintarg(position, defval = None)
コマンドライン引数を整数として安全に取得します。
sys.argv から指定された位置の引数を取得し、pint() 関数を使って整数に変換します。引数が存在しない、または変換できない場合はデフォルト値を返します。
:param position: 取得する引数の位置 (0-indexed)。 :type position: int :param defval: 引数が存在しない、または変換できない場合に返すデフォルト値。 :type defval: int or None, optional :returns: 変換された整数、またはデフォルト値。 :rtype: int or None
usage()
プログラムの正しい使用方法を標準出力に表示します。
プログラムの実行モード (wf または tr) に応じたコマンドライン引数の例を示します。
terminate(message = None)
指定されたメッセージを表示し、プログラムを終了します。
エラーメッセージなどを表示した後、usage() 関数を呼び出して使用方法を表示し、システムを終了します。
:param message: 終了時に表示するメッセージ。 :type message: str, optional
IsInBarrier(z)
指定されたz座標がポテンシャル障壁内にあるかを判定します。
グローバル変数 wellwidth, barrierwidth, nbarriers に基づき、多重量子井戸構造における障壁領域にzが属するかをチェックします。
:param z: 判定するz座標 (Å)。 :type z: float :returns: zが障壁内にある場合は1、それ以外の場合は0。 :rtype: int
U(z)
指定されたz座標におけるポテンシャルエネルギーを返します。
IsInBarrier() 関数を使用してz座標が障壁内にあるかを判断し、障壁内であれば barrierheight (eV) を、そうでなければ 0.0 eVを返します。
:param z: ポテンシャルエネルギーを評価するz座標 (Å)。 :type z: float :returns: zにおけるポテンシャルエネルギー (eV)。 :rtype: float
build_U(pottype, xz = None)
ポテンシャルエネルギーと有効質量プロファイルを作成または読み込みます。
pottype が 'mqw' の場合、多重量子井戸モデルに基づいてポテンシャル yU と有効質量 ym を生成します。それ以外の場合、指定されたExcelファイルからポテンシャルと有効質量のデータを読み込みます。
:param pottype: ポテンシャルの種類 ('mqw' または Excelファイルパス)。
:type pottype: str
:param xz: 'mqw' タイプの場合に使用されるz座標の配列。None の場合は生成される。
:type xz: numpy.ndarray, optional
:returns: (データ点の数, z座標配列, ポテンシャルエネルギー配列, 有効質量配列)。
:rtype: tuple[int, numpy.ndarray, numpy.ndarray, numpy.ndarray]
meff(z)
指定されたz座標における有効質量を返します。
z座標に基づいて、井戸領域または障壁領域の有効質量(電子質量 me の倍数)を返します。
注記: この関数はハードコードされた領域に依存します。
:param z: 有効質量を評価するz座標 (Å)。
:type z: float
:returns: zにおける有効質量(電子質量 me の倍数)。
:rtype: float
cal_wf(xz, yU, ym, Ez)
伝達行列法を用いて1次元波動関数と透過確率を計算します。
与えられたz座標、ポテンシャル、有効質量、およびエネルギーに対して、各セクションの波数 kz、振幅 A と B、および波動関数 Psi を計算します。最終的に透過確率 T も算出します。
注記: 波動関数の規格化は、Ai、Bi、Psi の最後の要素 ([nz-1]) に対してのみ行われています。Psi 配列全体を規格化するには、別途処理が必要です。
:param xz: z座標の配列 (Å)。
:type xz: numpy.ndarray
:param yU: 各z座標におけるポテンシャルエネルギーの配列 (eV)。
:type yU: numpy.ndarray
:param ym: 各z座標における有効質量の配列 (電子質量 me の倍数)。
:type ym: numpy.ndarray
:param Ez: 電子の入射エネルギー (eV)。
:type Ez: float
:returns: (波数配列, A振幅配列, B振幅配列, 波動関数配列, 透過確率)。
:rtype: tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray, numpy.ndarray, float]
analytical_check(Ez, a)
無限に深い井戸型ポテンシャルの解析解との比較情報を提供します。
指定されたエネルギー Ez と井戸幅 a を用いて、自由粒子の波数と、無限に深い井戸型ポテンシャルの基底状態エネルギーを計算し、表示します。これは、計算結果の妥当性を確認するための参考情報です。
:param Ez: 比較に使用するエネルギー (eV)。 :type Ez: float :param a: 無限井戸の幅 (Å)。 :type a: float
tr()
エネルギーに対する透過確率を計算し、結果をプロットします。
コマンドライン引数またはグローバル設定に基づき、指定されたエネルギー範囲で透過確率を計算します。計算されたポテンシャルプロファイルと透過確率はExcelファイルに保存され、複数のグラフとして表示されます。
wf()
特定のエネルギーにおける波動関数を計算し、結果をプロットします。
コマンドライン引数またはグローバル設定に基づき、指定された単一のエネルギー Ez0 に対して波動関数 Psi を計算します。計算されたポテンシャルプロファイルと波動関数は複数のグラフとして表示されます。
使用方法
このスクリプトは、コマンドライン引数によって動作モードやパラメータを制御します。
コマンドライン引数
transfer_matrix.py は以下のコマンドライン引数を取ります。括弧 () 内の引数はオプションです。
mode: 実行モード (wfまたはtr)。wf: 波動関数計算モード。tr: 透過確率計算モード。
pottype: ポテンシャルプロファイルの種類またはファイルパス。mqw: 多重量子井戸モデル。Excelファイルパス (例:
potential_defect.xlsx)。
nz: Z座標の分割数 (整数)。Ez0: 電子の入射エネルギー (浮動小数点数、eV)。Emin: (trモードのみ) エネルギー範囲の最小値 (浮動小数点数、eV)。Emax: (trモードのみ) エネルギー範囲の最大値 (浮動小数点数、eV)。nE: (trモードのみ) エネルギー範囲の分割数 (整数)。
引数を省略した場合、グローバル設定のデフォルト値が使用されます。
使用例
usage() 関数が出力する使用例は以下の通りです。
Usage: Variables in () are optional
python transfer_matrix.py (pottype wf nz Ez0)
ex: python transfer_matrix.py (wf potential_defect.xlsx 201 0.1)
python transfer_matrix.py (tr nz Ez0 Emin Emax nE)
ex: python transfer_matrix.py (tr potential_defect.xlsx 201 0.1 0.01 9.5 1001)
注記: 上記の usage() 関数の出力例では、pottype が wf モードの4番目の引数、tr モードの2番目の引数として示されています。しかし、実際の if __name__ == "__main__": ブロックでの引数パースロジックに基づくと、getarg(1) が mode、getarg(2) が pottype、getarg(3) が nz、getarg(4) が Ez0 と解釈されます。
したがって、pottype は常に2番目の引数として指定されることを想定しています。
コードの解析に基づく正しい引数の解釈:
mode(1番目の引数):wfまたはtrpottype(2番目の引数):mqwまたは Excelファイル名nz(3番目の引数): Z座標の分割数Ez0(4番目の引数): 電子の入射エネルギー
tr モードの場合、さらに以下の引数が続きます。
Emin(5番目の引数): エネルギー範囲の最小値Emax(6番目の引数): エネルギー範囲の最大値nE(7番目の引数): エネルギー範囲の分割数
例 (コードの解析に基づく):
波動関数計算 (
wf) の場合:python transfer_matrix.py wf mqw 201 0.1
または
python transfer_matrix.py wf potential_defect.xlsx 201 0.1
透過確率計算 (
tr) の場合:python transfer_matrix.py tr mqw 201 0.1 0.01 9.5 1001
または
python transfer_matrix.py tr potential_defect.xlsx 201 0.1 0.01 9.5 1001
入出力ファイル
入力
ポテンシャル定義ファイル:
pottypeグローバル変数またはコマンドライン引数で指定されるExcelファイル。このファイルは、z座標、ポテンシャルエネルギーU(z)、および有効質量m*(z)の3列データを含むことが期待されます。 例:potential_defect.xlsx
出力
ポテンシャルデータファイル:
tr()関数が実行された際に、計算に使用されたz座標、ポテンシャルエネルギーU(z)、および有効質量m*(z)のデータがpotential.xlsxという名前のExcelファイルに保存されます。 ファイルフォーマット: 3列 (z (A),U (eV),m* (me))透過確率データファイル:
tr()関数が実行された際に、各エネルギーにおける透過確率Tのデータがtransmission.xlsxという名前のExcelファイルに保存されます。 ファイルフォーマット: 2列 (E (eV),T)グラフ:
wf()関数またはtr()関数が実行されると、matplotlibを使用して計算結果がグラフとして表示されます。wf()モードでは、ポテンシャルプロファイル、有効質量、波数kzの実部と虚部、振幅AiとBiの絶対値、および波動関数Psiの実部、虚部、絶対値二乗がプロットされます。tr()モードでは、ポテンシャルプロファイル、有効質量、基準エネルギーEz0における波数kzの実部と虚部、透過確率対エネルギー、および基準エネルギーEz0における波動関数Psiの実部、虚部、絶対値二乗がプロットされます。