refineE_schrodinger1d プログラム仕様

概要: シュレーディンガー方程式の固有エネルギーをBrent法で精密化するスクリプト。

詳細説明: 本スクリプトは、schrodinger1d`モジュールを使用してシュレーディンガー方程式を解き、 その結果に基づいて境界条件が満たされない残差関数を定義します。 与えられた初期エネルギー値から出発し、残差関数の符号反転区間を自動的に探索します。 その後、SciPyライブラリのBrent法 (`scipy.optimize.brentq) を利用して、 残差がゼロとなるエネルギー(固有エネルギー)を高精度で求めます。 精密化された固有エネルギーと計算の詳細は、`refineE.csv`ファイルに記録されます。

関連リンク: refineE_schrodinger1d.py 技術ドキュメント

compute_maxiter(E_low, E_high, E_tol)[ソース]

概要: Brent法の最大反復回数を自動的に計算する。

詳細説明: Brent法は、探索区間の幅を指数関数的に減少させる。 この関数は、初期区間 [E_low, E_high] の幅と目標精度 E_tol に基づいて、 必要な反復回数を推定する。これにより、不要な計算を避けつつ、 十分な精度に達するための反復回数を設定できる。 経験的に5回の余裕を持たせている。

パラメータ:
  • E_low -- float: 符号反転区間の下限。

  • E_high -- float: 符号反転区間の上限。

  • E_tol -- float: ターゲットとするエネルギーの許容誤差。

戻り値:

int: Brent法に推奨される最大反復回数。

find_bracket(E0, args, max_expand=20, direction='both')[ソース]

概要: 与えられた初期エネルギー E0 を中心に、残差関数の符号が反転するエネルギー区間を探索する。

詳細説明: E0 を出発点とし、初期の delta 値を用いて E0 - deltaE0 + delta の範囲で residual 関数の符号をチェックする。 もし符号反転が見つからない場合、delta を2倍にして探索範囲を広げ、 max_expand 回数までこのプロセスを繰り返す。 符号反転区間が見つかった場合、その下限 E_low と上限 E_high を返す。

パラメータ:
  • E0 -- float: 探索を開始する初期エネルギー値。

  • args -- argparse.Namespace: residual 関数に渡すシュレーディンガー方程式のパラメータ。

  • max_expand -- int: 探索範囲を拡大する最大回数。この回数を超えても符号反転区間が見つからない場合はエラーとなる。

  • direction -- str: 探索する方向 ('upper', 'lower', 'both')。 'upper': E0より大きい側のみ探索。 'lower': E0より小さい側のみ探索。 'both': E0を挟んで両側を探索。

戻り値:

tuple[float, float]: 符号反転区間の下限 E_low と上限 E_high のタプル。

例外:
  • ValueError -- direction が 'upper', 'lower', 'both' のいずれでもない場合。

  • RuntimeError -- max_expand 回数内に符号反転区間が見つからなかった場合。

main()[ソース]

概要: コマンドライン引数を受け取り、Brent法を用いてシュレーディンガー方程式の固有エネルギーを精密化する。

詳細説明: このメイン関数は以下の手順で動作する: 1. argparse を用いてコマンドライン引数を解析し、初期エネルギー E0、許容誤差 E_tol

およびシュレーディンガー方程式の物理パラメータなどを取得する。

  1. find_bracket 関数を呼び出し、与えられた初期エネルギー args.E を含む符号反転区間 [E_low, E_high] を探索する。

  2. もし maxiter がコマンドラインで指定されていない場合、compute_maxiter 関数を用いて、 目標精度に基づいて自動的に最大反復回数を設定する。

  3. scipy.optimize.brentq 関数を使用して、residual 関数がゼロとなるエネルギー値 (すなわち固有エネルギー)を E_lowE_high の間で精密に探索する。 探索中には residual 関数の呼び出しごとに途中経過が出力される。

  4. 精密化された固有エネルギーと、その探索結果(反復回数、関数呼び出し回数など)を出力する。

  5. 最終的な結果は refineE.csv ファイルに追記される。ファイルが存在しない場合は、 最初にヘッダー行が追加される。

residual(E, args, print_level=0)[ソース]

概要: シュレーディンガー方程式を解き、波動関数の右端での値 (psi(L)) を返す。

詳細説明: schrodinger1d.solve_schrodinger 関数を呼び出し、与えられたエネルギー E に対するシュレーディンガー方程式の波動関数を計算する。 この関数は、Brent法などの根探索アルゴリズムで使用される残差関数として機能し、 波動関数の右端 (x=L) での値がゼロになるエネルギーを探索するために用いられる。

パラメータ:
  • E -- float: 試行するエネルギー値。

  • args -- argparse.Namespace: main 関数で定義されたコマンドライン引数を格納するオブジェクト。 シュレーディンガー方程式のパラメータ (L, nx, psi_max, bc, eps) を含む。

  • print_level -- int: 0以外の場合、計算されたエネルギーと psi(L) の値を出力する。

戻り値:

float: 計算された波動関数の右端 (x=L) での値。