メインコンテンツへスキップ
見出し画像

書記が物理やるだけ#417 ハートリー-フォック法の計算-2

    ハートリー-フォック法のいくつかの方法を比較してみる。


    問題

    画像


    解答

    制限ハートリー=フォック法(RHF)は、全ての分子軌道(MO)において α スピンと β スピンの電子が同一の空間軌道を共有することを前提とする。このため、適用範囲は電子が全て対になっている閉殻系に限定される。

    非制限ハートリー=フォック法(UHF)は、α スピンと β スピンの電子がそれぞれ独立した異なる空間軌道を持つことを許容する。これにより、閉殻系に加えて、ラジカルや三重項などの開殻系にも適用可能である。

    制限開殻ハートリー=フォック法(ROHF)では、閉殻部分のMOはRHFと同様に制限するが、開殻部分のMOについては、電子が片方のスピンのみで占有する共通の空間軌道を用いる。これにより、ROHFはスピン純粋性を保ったまま開殻系を記述できる。

    画像


    RHFは、計算コストが最も低く、閉殻系に対してはスピン純粋な波動関数を与えることから、安定な閉殻分子の計算において最も効率的な手法として選択される。

    一方、開殻分子を扱う際には、計算が比較的容易でスピン分極効果を取り込めるUHFが広く用いられる。しかし、UHFではスピン汚染が発生する可能性があるため、そのチェックと評価が必須となる。

    スピン汚染とは、UHF法によって得られた波動関数が、スピン演算子 S^2 の固有関数ではないために、本来求めたい多重度(例:二重項や三重項)以外の高次スピン状態(例:四重項、五重項など)が混入してしまう現象を指す。この汚染が発生する原因は、UHFが α 軌道と β 軌道を独立させることによって、波動関数のスピン対称性が破綻することにある。結果として、計算されたエネルギーやスピン密度分布といった物性値の信頼性が低下する可能性がある。

    スピン汚染を厳密に避け、より信頼性の高い結果を得たい場合には、ROHFが選択される。

    画像


    水分子カチオンの計算を以下に示す。

    import numpy as np
    from pyscf import gto, scf
    
    # --- 分子の定義(水分子カチオン: H2O+) ---
    # H2O+ は開殻系 (9電子系、スピン多重度 2)
    # 電子数 9 (5α, 4β) -> Nα ≠ Nβ
    mol = gto.Mole()
    mol.atom = """
    O   0.000000  0.000000  0.117300
    H   0.000000  0.757200 -0.469200
    H   0.000000 -0.757200 -0.469200
    """
    
    mol.basis = '6-31g*'
    mol.charge = 1         # 総電荷 +1
    mol.spin = 1           # スピン多重度 2 (2S+1=2) -> S=1/2 -> mol.spin=1
    mol.build()
    
    print(f"--- 分子情報 ---")
    print(f"全電子数: {mol.nelectron}")
    Nalpha = (mol.nelectron + mol.spin) // 2
    Nbeta = (mol.nelectron - mol.spin) // 2
    print(f"alpha電子数 (Nα): {Nalpha}")
    print(f"beta電子数 (Nβ): {Nbeta}")
    print("----------------\n")
    
    # 理論的なスピン角運動量二乗の期待値 (S=1/2 の場合、S^2 = S(S+1) = 0.5 * 1.5 = 0.75)
    Ideal_S2 = mol.spin * (mol.spin + 2) / 4
    
    
    # ----------------------------------------------------
    # 1. UHF法 (Unrestricted Hartree-Fock: 非制限)
    # ----------------------------------------------------
    print("--- 1. UHF法(非制限)の実行 ---")
    mf_uhf = scf.UHF(mol)
    E_uhf = mf_uhf.kernel()
    
    print(f'UHF 総エネルギー: {E_uhf:.10f} Hartrees')
    
    # UHFの波動関数とエネルギーの確認
    E_alpha = mf_uhf.mo_energy[0]
    E_beta = mf_uhf.mo_energy[1]
    
    # ★ スピン汚染の確認 (S^2期待値)
    S2_uhf = mf_uhf.spin_square()[0]
    print(f"  スピン汚染 S^2 期待値: {S2_uhf:.6f} (理論値: {Ideal_S2:.2f})")
    
    print(f"  α-HOMO ({Nalpha}番目の軌道): {E_alpha[Nalpha-1]:.6f} Hartrees")
    print(f"  β-HOMO ({Nbeta}番目の軌道): {E_beta[Nbeta-1]:.6f} Hartrees")
    
    # UHFのMulliken電荷解析
    populations_uhf, charges_uhf = mf_uhf.mulliken_pop()
    print("\n  UHF Mulliken atomic charges:")
    for i, symbol in enumerate(mol.elements):
        print(f"    原子 {i} ({symbol}): {charges_uhf[i]:.4f}")
    
    
    # ----------------------------------------------------
    # 2. ROHF法 (Restricted Open-shell Hartree-Fock: 制限開殻)
    # ----------------------------------------------------
    print("\n--- 2. ROHF法(制限開殻)の実行 ---")
    mf_rohf = scf.ROHF(mol)
    E_rohf = mf_rohf.kernel()
    
    print(f'ROHF 総エネルギー: {E_rohf:.10f} Hartrees')
    
    # ROHFの波動関数とエネルギーの確認
    E_mo = mf_rohf.mo_energy
    Nocc_open = Nalpha     # 開殻部分を含めた占有軌道数 (αの数)
    
    # ★ スピン純粋性の確認 (ROHFは定義上スピン純粋: 理論値に近いことを確認)
    S2_rohf = mf_rohf.spin_square()[0]
    print(f"  スピン汚染 S^2 期待値: {S2_rohf:.6f} (理論値: {Ideal_S2:.2f})")
    
    # ROHFではαとβは同じ空間軌道を持つため、エネルギーはMO全体のリストから取得
    print(f"  ROHF HOMO-α/開殻軌道 (軌道 {Nocc_open-1}): {E_mo[Nocc_open-1]:.6f} Hartrees")
    # ROHFの場合、HOMO-βは閉殻部分の最も高い軌道エネルギーを指す
    print(f"  ROHF 閉殻部 HOMO (軌道 {Nbeta-1}): {E_mo[Nbeta-1]:.6f} Hartrees")
    
    
    # ROHFのMulliken電荷解析
    populations_rohf, charges_rohf = mf_rohf.mulliken_pop()
    print("\n  ROHF Mulliken atomic charges:")
    for i, symbol in enumerate(mol.elements):
        print(f"    原子 {i} ({symbol}): {charges_rohf[i]:.4f}")
    
    
    # ----------------------------------------------------
    # 3. RHF法 (比較用: H2O+には不適切な手法)
    # ----------------------------------------------------
    print("\n--- 3. RHF法(制限:不適切)の実行 ---")
    # 開殻系に対してRHFを強制すると、通常は高エネルギーまたは計算が破綻する
    mf_rhf = scf.RHF(mol)
    E_rhf = mf_rhf.kernel() 
    
    print(f'RHF 総エネルギー: {E_rhf:.10f} Hartrees')
    
    print("\n--- 全ての計算が完了しました ---")


    結果は以下の通りである。

    --- 分子情報 ---
    全電子数: 9
    alpha電子数 (Nα): 5
    beta電子数 (Nβ): 4
    ----------------
    
    --- 1. UHF法(非制限)の実行 ---
    converged SCF energy = -75.610498235251  <S^2> = 0.7565988  2S+1 = 2.006588
    UHF 総エネルギー: -75.6104982353 Hartrees
      スピン汚染 S^2 期待値: 0.756599 (理論値: 0.75)
      α-HOMO (5番目の軌道): -1.100760 Hartrees
      β-HOMO (4番目の軌道): -1.047942 Hartrees
     ** Mulliken pop       alpha | beta **
    pop of  0 O 1s        0.99900 | 0.99900   
    pop of  0 O 2s        0.51224 | 0.47068   
    pop of  0 O 3s        0.46678 | 0.47874   
    pop of  0 O 2px       0.68312 | 0.00000   
    pop of  0 O 2py       0.50519 | 0.46571   
    pop of  0 O 2pz       0.57267 | 0.54507   
    pop of  0 O 3px       0.31549 | 0.00000   
    pop of  0 O 3py       0.26692 | 0.26501   
    pop of  0 O 3pz       0.30687 | 0.32014   
    pop of  0 O 3dxy      0.00000 | 0.00000   
    pop of  0 O 3dyz      0.01138 | 0.01186   
    pop of  0 O 3dz^2     0.00223 | 0.00181   
    pop of  0 O 3dxz      0.00138 | 0.00000   
    pop of  0 O 3dx2-y2    0.00107 | 0.00352   
    pop of  1 H 1s        0.19088 | 0.22134   
    pop of  1 H 2s       -0.01305 | -0.00211  
    pop of  2 H 1s        0.19088 | 0.22134   
    pop of  2 H 2s       -0.01305 | -0.00211  
    In total             5.00000 | 4.00000   
     ** Mulliken atomic charges   ( Nelec_alpha | Nelec_beta ) **
    charge of  0O =     -0.20588  (     4.64435      3.56153 )
    charge of  1H =      0.60294  (     0.17782      0.21924 )
    charge of  2H =      0.60294  (     0.17782      0.21924 )
    
      UHF Mulliken atomic charges:
        原子 0 (O): -0.2059
        原子 1 (H): 0.6029
        原子 2 (H): 0.6029
    
    --- 2. ROHF法(制限開殻)の実行 ---
    converged SCF energy = -75.6060375138485
    ROHF 総エネルギー: -75.6060375138 Hartrees
      スピン汚染 S^2 期待値: 0.750000 (理論値: 0.75)
      ROHF HOMO-α/開殻軌道 (軌道 4): -0.702718 Hartrees
      ROHF 閉殻部 HOMO (軌道 3): -1.074610 Hartrees
     ** Mulliken pop  **
    pop of  0 O 1s            1.99799
    pop of  0 O 2s            0.98468
    pop of  0 O 3s            0.94723
    pop of  0 O 2px           0.67958
    pop of  0 O 2py           0.97157
    pop of  0 O 2pz           1.11807
    pop of  0 O 3px           0.31905
    pop of  0 O 3py           0.53253
    pop of  0 O 3pz           0.62671
    pop of  0 O 3dxy          0.00000
    pop of  0 O 3dyz          0.02325
    pop of  0 O 3dz^2         0.00379
    pop of  0 O 3dxz          0.00137
    pop of  0 O 3dx2-y2       0.00370
    pop of  1 H 1s            0.41130
    pop of  1 H 2s           -0.01606
    pop of  2 H 1s            0.41130
    pop of  2 H 2s           -0.01606
     ** Mulliken atomic charges  **
    charge of    0O =     -0.20952
    charge of    1H =      0.60476
    charge of    2H =      0.60476
    
      ROHF Mulliken atomic charges:
        原子 0 (O): -0.2095
        原子 1 (H): 0.6048
        原子 2 (H): 0.6048
    
    --- 3. RHF法(制限:不適切)の実行 ---
    converged SCF energy = -75.6060375138485
    RHF 総エネルギー: -75.6060375138 Hartrees
    
    --- 全ての計算が完了しました ---


    (1)総エネルギーとスピン分極効果

    総エネルギーの比較において、UHF法が最も低い総エネルギー(−75.6105 Hartrees)を与えている。これは、UHF法が α 軌道と β 軌道を独立させることで、スピン分極効果という形で電子相関の一部を間接的に取り込み、ROHFよりも柔軟な波動関数を持つためである。これは、より低いエネルギーを与えるという変分原理の観点から理論的に期待される結果である。


    (2)スピン純粋性とスピン汚染

    ROHF法は、その定義通り ⟨S^2⟩=0.750000 を与え、完璧なスピン純粋性を保っている。これが開殻計算におけるROHFの最大の優位性である。

    一方で、UHF法は ⟨S^2⟩=0.756599 であり、理論値 0.75 から僅かに逸脱している。これは、目的とする二重項状態以外の高次スピン状態(この場合は四重項など)が波動関数に混入していることを示しており、スピン汚染が発生している証拠である。


    (3)軌道エネルギーと制限性の違い

    UHF法では、α 軌道と β 軌道が独立して最適化されるため、それぞれのHOMO(最高被占有分子軌道)エネルギーが異なり、非制限的な性質を示している。

    一方、ROHF法では、開殻軌道(α のみで占有)と、それより内側の閉殻軌道(α と β で占有)のエネルギーが異なる。これは、閉殻部分には制限を課しつつ、開殻部分の軌道を特別に扱うというROHFの制限開殻の定義を反映した結果である。


    本記事のもくじはこちら:


    あなたへのおすすめ