Home
2419 words
12 minutes
s軌道-p軌道間重なり積分の数理的導出と実装

last_modified: 2026-01-23

注記:本稿では、角運動量 l=1l=1 を持つp軌道(px,py,pzp_x, p_y, p_z)とs軌道との重なり積分 SspS_{sp} を扱う。Cartesian GTO(デカルト座標型ガウス関数)を用いる場合、p軌道はs軌道の空間微分として表現できる性質を利用すると、計算が非常に簡潔になる。 注記2: 生成AIへの指示で自動生成し、検算をしておりますが、内容が誤っている可能性があります。ご了承ください。Gemini 3.0 Pro及びGPT-5.2の性能を確かめる目的も兼ねています。

1. 数理的定式化#

1.1 Cartesian p型GTOの定義#

中心 RB=(XB,YB,ZB)\mathbf{R}_B = (X_B, Y_B, Z_B) にある、指数 β\beta の正規化されていないプリミティブp型GTO(例:pxp_x)は、次のように定義される。ϕpx,B(r)=(xXB)eβrRB2(1)\phi_{px, B}(\mathbf{r}) = (x - X_B) e^{-\beta |\mathbf{r} - \mathbf{R}_B|^2} \quad (1)これは、s型GTO ϕs,B=eβrRB2\phi_{s, B} = e^{-\beta |\mathbf{r} - \mathbf{R}_B|^2}(xXB)(x - X_B) を乗じたものである。

1.2 重なり積分の導出(s-p overlap)#

中心Aのs軌道 ϕs,A\phi_{s, A} と、中心Bのp軌道 ϕpx,B\phi_{px, B} の重なり積分 Ss,pxS_{s, px} を考える。Ss,px=eαrRA2(xXB)eβrRB2dr(2)S_{s, px} = \int e^{-\alpha |\mathbf{r} - \mathbf{R}_A|^2} \cdot (x - X_B) e^{-\beta |\mathbf{r} - \mathbf{R}_B|^2} \, d\mathbf{r} \quad (2)ガウス積定理により、指数部分は中心 RP\mathbf{R}_P、合成指数 p=α+βp = \alpha + \beta のガウス関数にまとめることができる(前稿参照)。ここで重要なのは、多項式項 (xXB)(x - X_B) の処理である。積分変数変換 r=rRP\mathbf{r}' = \mathbf{r} - \mathbf{R}_P を行うと、x=x+XPx = x' + X_P となる。xXB=x+(XPXB)(3)x - X_B = x' + (X_P - X_B) \quad (3)これを積分内で展開する。(x+(XPXB))epr2dr=xepr2dr0(奇関数)+(XPXB)epr2dr(4)\int (x' + (X_P - X_B)) e^{-p r'^2} d\mathbf{r}' = \underbrace{\int x' e^{-p r'^2} d\mathbf{r}'}_{0 (\text{奇関数})} + (X_P - X_B) \int e^{-p r'^2} d\mathbf{r}' \quad (4)第1項は対称性により消滅する。したがって、s-p重なり積分は、「s-s重なり積分」に「幾何学的因子」を乗じたものとして表現される。Ss,px=(XPXB)Ss,s(5)S_{s, px} = (X_P - X_B) S_{s, s} \quad (5)ここで、XPX_P はガウス積の中心座標のx成分であり、以下で与えられる。XP=αXA+βXBα+β    XPXB=α(XAXB)α+β(6)X_P = \frac{\alpha X_A + \beta X_B}{\alpha + \beta} \implies X_P - X_B = \frac{\alpha (X_A - X_B)}{\alpha + \beta} \quad (6)

1.3 正規化#

p軌道の正規化定数 NpN_p はs軌道のそれとは異なる。プリミティブレベルでの正規化定数は以下の通りである。Np(β)=(128β5π3)1/4=2β(2βπ)3/4(7)N_{p}(\beta) = \left( \frac{128 \beta^5}{\pi^3} \right)^{1/4} = 2\sqrt{\beta} \left( \frac{2\beta}{\pi} \right)^{3/4} \quad (7)

2. Pythonによる実装#

s軌道(中心A)とp軌道(中心B、x,y,z成分)の重なりを計算するクラス設計を行う。p軌道の短縮(Contraction)においては、3つの成分(px,py,pzp_x, p_y, p_z)は通常同じ指数と係数を共有するため、一度の計算でベクトルとして処理するのが効率的である。

import numpy as np

# --- 1. 基礎的な数学関数 ---

def calculate_primitive_ss_overlap(alpha: float, beta: float, R2: float) -> float:
    """s-s プリミティブ重なり積分 (正規化定数を含まない)"""
    p = alpha + beta
    K_AB = np.exp( - (alpha * beta / p) * R2 )
    return (np.pi / p)**1.5 * K_AB

def get_normalization_primitive_s(alpha: float) -> float:
    """s型プリミティブの正規化定数"""
    return (2.0 * alpha / np.pi)**0.75

def get_normalization_primitive_p(beta: float) -> float:
    """p型プリミティブの正規化定数"""
    # N_p = 2 * sqrt(beta) * N_s
    return 2.0 * np.sqrt(beta) * (2.0 * beta / np.pi)**0.75

# --- 2. 短縮GTOの正規化 ---

def normalize_contraction_s(exponents: list[float], coeffs: list[float]) -> list[float]:
    """s軌道の短縮係数を正規化して返す"""
    n_prim = len(exponents)
    # 行列形式で計算
    S_mat = np.zeros((n_prim, n_prim))
    for i in range(n_prim):
        for j in range(n_prim):
            # s-s overlap at R=0
            sab = calculate_primitive_ss_overlap(exponents[i], exponents[j], 0.0)
            ni = get_normalization_primitive_s(exponents[i])
            nj = get_normalization_primitive_s(exponents[j])
            S_mat[i, j] = sab * ni * nj
            
    # 全体のノルム
    norm_sq = np.dot(coeffs, np.dot(S_mat, coeffs))
    norm_factor = 1.0 / np.sqrt(norm_sq)
    return [c * norm_factor for c in coeffs]

def normalize_contraction_p(exponents: list[float], coeffs: list[float]) -> list[float]:
    """p軌道の短縮係数を正規化して返す"""
    n_prim = len(exponents)
    S_mat = np.zeros((n_prim, n_prim))
    for i in range(n_prim):
        for j in range(n_prim):
            # p-p overlap at R=0 (orthogonality ensures only same components overlap)
            # <px|px> = (1/2p) * <s|s>_unnormalized (standard result for p-p same center)
            # しかしここでは定義通り計算する:
            # S_px_px = S_ss_prim * (1 / (2*(alpha+beta))) + terms depending on distance (0 here)
            alpha = exponents[i]
            beta = exponents[j]
            p = alpha + beta
            s_ss = calculate_primitive_ss_overlap(alpha, beta, 0.0)
            
            # <px|px> @ R=0 term is s_ss / (2*p)
            s_pp = s_ss / (2.0 * p)
            
            ni = get_normalization_primitive_p(alpha)
            nj = get_normalization_primitive_p(beta)
            S_mat[i, j] = s_pp * ni * nj

    norm_sq = np.dot(coeffs, np.dot(S_mat, coeffs))
    norm_factor = 1.0 / np.sqrt(norm_sq)
    return [c * norm_factor for c in coeffs]


# --- 3. s-p 重なり積分計算 (メイン) ---

def calculate_overlap_sp(
    center_A: np.ndarray, exps_A: list[float], coeffs_A: list[float], # s-orbital
    center_B: np.ndarray, exps_B: list[float], coeffs_B: list[float]  # p-orbital
) -> np.ndarray:
    """
    CGTO s軌道(A) と CGTO p軌道(B) の重なり積分ベクトルを計算する。
    
    Args:
        center_A, center_B: 原子核座標 (x, y, z)
        exps_A, coeffs_A: s軌道のパラメータ
        exps_B, coeffs_B: p軌道のパラメータ
        
    Returns:
        np.ndarray: [S_spx, S_spy, S_spz] の3要素配列
    """
    # 座標差ベクトル
    R_vec = center_A - center_B
    R2 = np.dot(R_vec, R_vec)
    
    # 正規化済み係数の取得
    norm_coeffs_A = normalize_contraction_s(exps_A, coeffs_A)
    norm_coeffs_B = normalize_contraction_p(exps_B, coeffs_B)
    
    # 結果格納用 (x, y, z)
    S_vector = np.zeros(3)
    
    # 二重ループ
    for i, alpha in enumerate(exps_A):
        ca = norm_coeffs_A[i]
        N_s_prim = get_normalization_primitive_s(alpha)
        
        for j, beta in enumerate(exps_B):
            cb = norm_coeffs_B[j]
            N_p_prim = get_normalization_primitive_p(beta)
            
            # 1. s-s プリミティブ重なりの計算
            s_ss_prim = calculate_primitive_ss_overlap(alpha, beta, R2)
            
            # 2. 幾何学的因子の計算: (XP - XB)
            # XP = (alpha*XA + beta*XB) / (alpha+beta)
            # XP - XB = alpha*(XA - XB) / (alpha+beta)
            factor_geom = (alpha / (alpha + beta)) * (center_A - center_B)
            
            # 3. 統合
            # S_sp = N_s * N_p * S_ss * (XP - XB)
            term = ca * cb * N_s_prim * N_p_prim * s_ss_prim
            
            S_vector += term * factor_geom
            
    return S_vector

# --- 実行例 ---
if __name__ == "__main__":
    # フッ化水素 (HF) 分子のモデル
    # H (Center A): s軌道
    # F (Center B): p軌道
    
    # 座標 (Z軸上に配置)
    pos_H = np.array([0.0, 0.0, -1.7328]) # 約 0.917 Angstrom
    pos_F = np.array([0.0, 0.0, 0.0])
    
    # 基底関数パラメータ (STO-3G dummy for example)
    # H 1s
    h_exps = [3.42525, 0.623913, 0.168856]
    h_coeffs = [0.154329, 0.535328, 0.444635]
    
    # F 2p (STO-3G parameters for Fluorine 2p shell)
    # Note: 2sと2pは指数を共有するが、ここでは2pとして扱う
    f_exps = [99.1111, 23.1031, 6.55627, 1.95679] # 実際はもっと複雑だが例示用
    # F 2p STO-3G (Standard Hehre values for alpha)
    f_sto3g_exps = [2.2793, 0.5287, 0.1697] # Hに近いダミー値ではなく適切な値を設定すべきだが
                                           # ここではロジック確認のため、Hと同じセットを「p軌道として」使ってみる実験
                                           # 現実的なFのデータを使うと以下のようになる:
    f_real_exps = [52.793206, 11.235948, 3.109767] # STO-3G F 2sp exponents (partial)
    f_real_coeffs_p = [0.089808, 0.456637, 0.629112]
    
    # 計算実行
    overlaps = calculate_overlap_sp(
        pos_H, h_exps, h_coeffs,
        pos_F, f_real_exps, f_real_coeffs_p
    )
    
    print("--- s-p Orbital Overlap (HF molecule along Z-axis) ---")
    print(f"H Position: {pos_H}")
    print(f"F Position: {pos_F}")
    print(f"Overlap Vector [S_spx, S_spy, S_spz]:")
    print(overlaps)
    
    print("\n--- Interpretation ---")
    print(f"S_x (pi-type): {overlaps[0]:.6f} (Should be 0.0)")
    print(f"S_y (pi-type): {overlaps[1]:.6f} (Should be 0.0)")
    print(f"S_z (sigma-type): {overlaps[2]:.6f} (Should be non-zero)")
    
    # 符号の確認:
    # HがZマイナス側、Fが原点。
    # s軌道は正、p_z軌道はZ正方向が正。
    # H(s)とF(p_z)のローブの符号関係により、負の値になる可能性がある
    # (結合性軌道を作るには位相合わせが必要)

3. 結果の物理的解釈#

配向依存性: 出力結果の overlaps ベクトルを見ると、原子がZ軸上に配置されている場合、x,yx, y 成分(π\pi 方向の重なり)は数値誤差の範囲内で 00 となる。zz 成分のみが有意な値を持ち、これが σ\sigma 結合に対応する。

符号の意味: 重なり積分の符号は、座標系と基底関数の位相定義に依存する。負の値が出た場合、それは単にp軌道の正のローブがs軌道と反対方向を向いていることを意味し、分子軌道形成時には係数の符号で調整される。

計算効率: calculate_overlap_sp 関数は、(XAXB)(X_A - X_B) ベクトルを利用することで、3成分の重なり積分をループ内で同時に計算している。これにより、個別に計算する場合と比較して指数関数の評価回数を1/3に削減している。

4. 結論#

s軌道とp軌道の重なり積分は、s-s重なり積分に対して、幾何学的な因子 α(XAXB)α+β\frac{\alpha(X_A - X_B)}{\alpha+\beta} を乗じることで解析的に求められる。この単純な関係性は、Cartesian GTOが高次角運動量の微分として定義されていることに由来し、d軌道やf軌道への拡張も同様の微分操作(または漸化式)によって体系的に行うことが可能である。

補足#

以下に、中心 AA に位置する短縮s型GTO(ΨAs\Psi_A^s)と、中心 BB に位置する短縮p型GTOの成分 γ{x,y,z}\gamma \in \{x, y, z\}ΨBpγ\Psi_B^{p_\gamma})の間の重なり積分 Ss,pγS_{s, p_\gamma} を1つの閉じた数式で示す。s-p 重なり積分公式 (CGTO)Ss,pγ=NAcontNBcontμ=1KAν=1KBdA,μdB,ν[Ns(αμ)Np(βν)αμ(AγBγ)αμ+βν(παμ+βν)3/2exp(αμβναμ+βνRAB2)]S_{s, p_\gamma} = N_A^{cont} N_B^{cont} \sum_{\mu=1}^{K_A} \sum_{\nu=1}^{K_B} d_{A,\mu} d_{B,\nu} \left[ \mathcal{N}_s(\alpha_\mu) \mathcal{N}_p(\beta_\nu) \frac{\alpha_\mu (A_\gamma - B_\gamma)}{\alpha_\mu + \beta_\nu} \left( \frac{\pi}{\alpha_\mu + \beta_\nu} \right)^{3/2} \exp\left( - \frac{\alpha_\mu \beta_\nu}{\alpha_\mu + \beta_\nu} |\mathbf{R}_{AB}|^2 \right) \right]

変数定義全体パラメータ:NAcont,NBcontN_A^{cont}, N_B^{cont}: 短縮GTO全体の正規化定数。

KA,KBK_A, K_B: 短縮の次数(プリミティブ数)。

dA,μ,dB,νd_{A,\mu}, d_{B,\nu}: 各プリミティブの短縮係数。

RAB\mathbf{R}_{AB}: 核間距離ベクトル

AB\mathbf{A} - \mathbf{B}RAB2|\mathbf{R}_{AB}|^2 はその二乗ノルム。

Aγ,BγA_\gamma, B_\gamma: 原子核座標の成分(例:Ax,BxA_x, B_x)。

プリミティブパラメータ:αμ\alpha_\mu: 中心 AAμ\mu 番目のプリミティブ軌道指数。

βν\beta_\nu: 中心 BBν\nu 番目のプリミティブ軌道指数。

プリミティブ正規化定数 (Primitive Normalization Constants): Ns(ζ)=(2ζπ)3/4Np(ζ)=(128ζ5π3)1/4\mathcal{N}_s(\zeta) = \left( \frac{2\zeta}{\pi} \right)^{3/4}\mathcal{N}_p(\zeta) = \left( \frac{128\zeta^5}{\pi^3} \right)^{1/4} 

構造的解釈#

この式は以下の3つの要素の積の総和として構成されている。

係数項: dA,μdB,νd_{A,\mu} d_{B,\nu} および各正規化定数。

幾何学的因子: αμ(AγBγ)αμ+βν\frac{\alpha_\mu (A_\gamma - B_\gamma)}{\alpha_\mu + \beta_\nu}

これがp軌道の配向性とs軌道との相対位置による符号・強度を決定する。

距離減衰項: exp()\exp(\dots)。ガウス関数の重なりによる距離依存性を示す。

s軌道-p軌道間重なり積分の数理的導出と実装
https://ss0832.github.io/posts/20260123_cgto_s_p_overlapint/
Author
ss0832
Published at
2026-01-23
License
CC BY-NC-SA 4.0

Related Posts

p軌道-p軌道間重なり積分の数理的導出と実装
2026-01-23
Cartesian GTOを用いたp軌道同士(計9成分)の重なり積分について、ガウス積定理に基づく統一的な数式表現と、厳密な正規化処理を含むPython実装を解説する。
s軌道-d軌道間重なり積分の数理的導出と実装
2026-01-23
Cartesian GTOを用いたs軌道とd軌道(6成分:xx, yy, zz, xy, xz, yz)間の重なり積分について、統一的な数式表現とPython実装を解説する。
短縮GTO(Contracted GTO)間重なり積分の数理と実装"
2026-01-23
原子軌道計算の実用標準である短縮ガウス型軌道(CGTO)について、その定義、プリミティブGTOへの展開による重なり積分の導出、およびSTO-3G基底系を例としたPython実装を記述する。
GTO 1s軌道間重なり積分の数理的導出と実装
2026-01-23
ガウス型軌道(GTO)を用いた異なる指数を持つ1s軌道間の重なり積分について、ガウス積定理に基づく解析的な導出とPythonによる実装を記述する。
NCIplot (Non-Covalent Interaction plot) の数理的基盤とアルゴリズム:密度汎関数理論からの導出と応用
2026-01-04
非共有結合性相互作用(Non-Covalent Interactions; NCI)を可視化する手法であるNCIplotについて、その理論的背景となるReduced Density Gradient(RDG)の数学的導出、QTAIMとの関係性、およびアルゴリズムの実装詳細を学術的な視点から包括的に解説する。密度汎関数理論における均一電子ガスモデルからの展開と、ヘシアン行列の固有値解析に基づく相互作用の分類について詳述する。
【計算化学】ASEでAFIR法を使用する
2025-03-04
ASEを使った人工力誘起反応法の実装について解説