1. 振动光谱的物理基础
分子的振动光谱——红外(IR)光谱与拉曼(Raman)光谱—— 是研究分子结构、官能团和化学键信息的核心工具。 两者都起源于分子的振动运动,但物理机制截然不同: IR 依赖于振动过程中偶极矩的变化, Raman 依赖于振动过程中极化率的变化。
1.1 偶极矩与红外活性
分子在外部光场(电磁波)的振荡电场 $\mathbf{E}(t)$ 中, 其固有偶极矩 $\vec{\mu}$ 与外场发生相互作用,引起能量吸收。 根据量子力学跃迁矩阵元理论,振动跃迁 $v_i \to v_f$ 的红外吸收概率正比于:
在谐振子近似下,将偶极矩对正则坐标 $Q_k$ 做 Taylor 展开:
利用谐振子选择定则 $\Delta v = \pm 1$,只有展开式中一次项对跃迁有贡献,因此:
1.2 极化率与拉曼活性
拉曼散射是光子与分子振动的非弹性散射。 入射光(频率 $\nu_0$)诱导分子产生瞬时偶极矩:
其中 $\boldsymbol{\alpha}$ 是 $3\times3$ 极化率张量。 将极化率对正则坐标展开:
类似地,拉曼活性条件为:
1.3 互斥定则(Mutual Exclusion Rule)
群论 对称性
对于具有对称中心(inversion center, $i$)的分子, IR 活性和 Raman 活性互斥:
- 对称($g$)振动模式:偶极矩导数为零 → 无 IR 活性,但可有 Raman 活性
- 反对称($u$)振动模式:极化率导数为零 → 无 Raman 活性,但可有 IR 活性
代表例子:线性分子 CO₂($D_{\infty h}$)——对称伸缩($\Sigma_g^+$)有 Raman 活性无 IR 活性; 反对称伸缩($\Sigma_u^+$)有 IR 活性无 Raman 活性。
| 分子 | 对称性 | 振动模式 | IR | Raman |
|---|---|---|---|---|
| H₂O | $C_{2v}$(无对称中心) | 全部 3 个 | 活性 | 活性 |
| CO₂ | $D_{\infty h}$(有对称中心) | 对称伸缩 $\Sigma_g^+$ | 非活性 | 活性 |
| CO₂ | $D_{\infty h}$ | 反对称伸缩 $\Sigma_u^+$ | 活性 | 非活性 |
| 苯 C₆H₆ | $D_{6h}$(有对称中心) | $E_{2g}$ 模式 | 非活性 | 活性 |
2. 红外吸收强度的计算
2.1 偶极矩对正则坐标的导数
设分子有 $3N-6$(非线性)或 $3N-5$(线性)个简正模式, 第 $k$ 个简正模式的正则坐标为 $Q_k$,约化质量为 $\mu_k$(单位:amu)。 以质量加权笛卡尔位移 $\Delta\mathbf{x}$ 表示分子构型变化:
其中 $\mathbf{L}_k$ 是第 $k$ 个简正模式的质量加权本征向量 (Gaussian 输出中的 "normal mode eigenvectors",单位为 amu$^{-1/2}$)。
偶极矩导数的数值差分近似(中心差分,误差 $O(\Delta Q^2)$):
2.2 强度公式与单位
红外积分强度(单位:km/mol)由偶极矩三个方向分量的导数平方之和决定:
其中换算常数 $C_{\mathrm{IR}}$(将 Debye/(amu$^{1/2}$·Å) 换算为 km/mol):
Gaussian 直接计算与数值差分的关系:
使用 freq 关键词时,Gaussian 解析计算偶极矩导数,
直接输出 IR 强度(km/mol)。
数值差分程序 NumIR_Raman.py 通过多次单点计算来验证这一结果,
两者在步长适当时一致性应在 0.1% 以内。
2.3 数值差分方法详解
中心差分法相比前向/后向差分精度更高,误差阶为 $O(\Delta Q^2)$:
步长 $\Delta Q$ 的选择影响计算精度:
| 步长 $\Delta Q$(amu$^{1/2}$·Å) | 优点 | 缺点 |
|---|---|---|
| $10^{-3}$(太小) | 截断误差小 | SCF 精度不足,数值噪声主导 |
| $0.01$(推荐) | 截断误差与数值误差平衡 | — |
| $0.1$(太大) | 数值稳健 | 高阶非线性项贡献显著,精度下降 |
3. 拉曼散射活性的计算
3.1 极化率张量
极化率张量 $\boldsymbol{\alpha}$ 是描述分子在外电场作用下 诱导偶极矩响应的 $3\times3$ 实对称矩阵:
由于对称性,只有 6 个独立分量。 Gaussian 输出按以下顺序给出(原子单位,1 a.u. = 1.48185$\times$10⁻²⁵ cm³):
Polarizability (field-independent basis, a.u.):
XX= 39.294 YX= -0.049 YY= 156.727
ZX= 0.000 ZY= 0.000 ZZ= 112.948
程序内部按顺序存储为: $[\alpha_{xx},\,\alpha_{yx},\,\alpha_{yy},\,\alpha_{zx},\,\alpha_{zy},\,\alpha_{zz}]$。
3.2 各向同性与各向异性导数
对极化率张量的每个独立分量计算对正则坐标 $Q_k$ 的导数:
由此定义两个关键量:
各向同性极化率导数(Mean polarizability derivative)
各向异性极化率导数(Anisotropy derivative)
3.3 拉曼活性公式
拉曼活性(Raman scattering activity)由各向同性和各向异性导数共同贡献:
3.4 去偏振比(Depolarization Ratio)
对于 $90°$ 散射,平面偏振激发光的去偏振比 $\rho_p$ 定义为:
| 振动类型 | $\alpha'$ | $\rho_p$ | 偏振性 |
|---|---|---|---|
| 完全对称(fully symmetric) | $\neq 0$ | $0 \leq \rho_p < 3/4$ | 偏振光(polarized) |
| 非完全对称(non-totally symmetric) | $= 0$ | $\rho_p = 3/4$ | 退偏振光(depolarized) |
4. Gaussian 数值差分计算流程
optfreq$\mathbf{L}_k$, $\mu_k$
单点计算
$\partial\mu/\partial Q$
强度
4.1 输入文件设置
步骤 1–2:几何优化 + 频率计算
%chk=H2O.chk
%mem=2GB
%nprocshared=4
#p b3lyp/6-311+g(d,p) opt freq=raman
H2O 几何优化与频率计算(含 Raman 活性)
0 1
O 0.0 0.00000000 -0.11081188
H 0.0 -0.78397589 0.44324751
H 0.0 0.78397589 0.44324751
freq=raman 关键词让 Gaussian 解析计算拉曼活性(需极化率二阶导数)。
若只需 IR 强度,freq 即可。
freq=noraman 可跳过极化率计算以节省时间。
步骤 4:对每个正则模式生成 ±ΔQ 位移的单点输入
%chk=H2O_mode1_plus.chk
#p b3lyp/6-311+g(d,p) iop(1/21=1) scf=tight prop=(dipole,polar) nosymm
H2O mode 1 +DeltaQ (正则坐标位移 +0.01 amu^(1/2)*Angstrom)
0 1
O [displaced coords]
H [displaced coords]
H [displaced coords]
- 必须加
nosymm,禁止 Gaussian 内部对称化坐标(否则位移会被重新对称化) - 加
scf=tight提高 SCF 收敛精度,减少数值误差 prop=(dipole,polar)输出偶极矩和极化率- 每个模式需要 2 次计算($+\Delta Q$ 和 $-\Delta Q$),共 $2(3N-6)$ 次
4.2 数据提取
从 .log 文件提取偶极矩
Dipole moment (field-independent basis, Debye):
X= 0.0000 Y= 0.0000 Z= -0.0052 Tot= 0.0052
从 .log 文件提取极化率
Polarizability (field-independent basis, a.u.):
XX= 39.294 YX= -0.049 YY= 156.727
ZX= 0.000 ZY= 0.000 ZZ= 112.948
Python 正则表达式提取
import re
def extract_dipole(logfile):
"""提取偶极矩 (Debye),返回 [X, Y, Z]"""
pattern = r'X=\s+([\d\.\-]+)\s+Y=\s+([\d\.\-]+)\s+Z=\s+([\d\.\-]+)'
with open(logfile) as f:
text = f.read()
matches = re.findall(pattern, text)
if matches:
last = matches[-1] # 取最后一次出现(收敛后的结果)
return [float(x) for x in last]
return None
def extract_polarizability(logfile):
"""提取极化率张量 (a.u.),返回 [XX, YX, YY, ZX, ZY, ZZ]"""
pattern = (r'XX=\s+([\d\.\-]+)\s+YX=\s+([\d\.\-]+)\s+YY=\s+([\d\.\-]+)\s+'
r'ZX=\s+([\d\.\-]+)\s+ZY=\s+([\d\.\-]+)\s+ZZ=\s+([\d\.\-]+)')
with open(logfile) as f:
text = f.read()
matches = re.findall(pattern, text)
if matches:
return [float(x) for x in matches[-1]]
return None
4.3 H₂O 示例
H₂O 属于 $C_{2v}$ 点群,有 $3N-6 = 3$ 个简正模式,均具有 IR 和 Raman 活性:
| 模式 | 对称性 | 频率 (cm⁻¹) | IR 强度 (km/mol) | Raman 活性 (Å⁴/amu) | 描述 |
|---|---|---|---|---|---|
| $\nu_1$ | $A_1$ | ~3657 | ~4 | ~51 | 对称 O–H 伸缩 |
| $\nu_2$ | $A_1$ | ~1595 | ~70 | ~8 | H–O–H 弯曲 |
| $\nu_3$ | $B_1$ | ~3756 | ~65 | ~21 | 反对称 O–H 伸缩 |
5. Python 程序:NumIR_Raman
NumIR_Raman.py 位于 program/ 子目录,
实现了从 Gaussian 输出数据出发,通过数值差分计算 IR 和 Raman 强度的完整流程。
5.1 程序结构与主要函数
| 函数名 | 功能描述 | 输入参数 | 返回值 |
|---|---|---|---|
calculate_ir_intensity() |
计算红外强度 | dipole±, red_mass | IR 强度 (km/mol) |
calculate_raman_derivatives() |
计算极化率导数 | alpha±, red_mass | $\mathrm{d}\alpha/\mathrm{d}Q$(6分量) |
calculate_raman_intensity() |
计算拉曼活性 | $\mathrm{d}\alpha/\mathrm{d}Q$ | $(S_k,\;\alpha'^2,\;\gamma'^2)$ |
convert_dpdQ_to_atomic() |
单位转换 | $\mathrm{d}\mu/\mathrm{d}Q$(物理单位) | $\mathrm{d}\mu/\mathrm{d}Q$(原子单位) |
5.2 使用示例
计算 IR 强度
from NumIR_Raman import calculate_ir_intensity
# 从 Gaussian 输出读取的偶极矩分量 (Debye)
# 以 H2O mode1 为例(仅 z 分量有值)
dipole_plus = [0.0, 0.0, -0.0052] # Q + ΔQ
dipole_minus = [0.0, 0.0, 0.0052] # Q - ΔQ
reduced_mass = 1.0803 # amu
ir = calculate_ir_intensity(dipole_plus, dipole_minus, reduced_mass)
print(f"IR 强度: {ir:.4f} km/mol")
# → IR 强度: 3.8762 km/mol
计算拉曼活性
from NumIR_Raman import calculate_raman_derivatives, calculate_raman_intensity
# 极化率张量独立分量 [XX, YX, YY, ZX, ZY, ZZ](原子单位)
alpha_plus = [39.294, -0.049, 156.727, 0.000, 0.000, 112.948]
alpha_minus = [39.294, 0.049, 156.727, 0.000, 0.000, 112.948]
reduced_mass = 1.0803 # amu
# 计算极化率导数
dalpha_dQ = calculate_raman_derivatives(alpha_plus, alpha_minus, reduced_mass)
# 计算拉曼活性
S_k, ai2, ga2 = calculate_raman_intensity(dalpha_dQ)
print(f"拉曼活性 S_k = {S_k:.4f} Å⁴/amu")
print(f"各向同性 α'² = {ai2:.4f}")
print(f"各向异性 γ'² = {ga2:.4f}")
# 去偏振比
rho = 3*ga2 / (45*ai2 + 4*ga2)
print(f"去偏振比 ρ = {rho:.4f}")
直接运行(使用内置示例数据)
python program/NumIR_Raman.py
输出示例:
======================================================================
数值计算红外(IR)和拉曼(Raman)强度
======================================================================
红外强度计算结果
----------------------------------------------------------------------
模式 dμ/dQ (au) IR强度 (km/mol) 相对强度
----------------------------------------------------------------------
mode1 -0.000527 2.8454 1.0000
mode6 -0.002384 24.3745 8.5671
mode14 -0.005692 138.6566 48.7392
5.3 物理常数与单位换算
| 常数名称 | 符号 | 数值 | 单位 |
|---|---|---|---|
| 普朗克常数 | $h$ | $6.62607 \times 10^{-34}$ | J·s |
| 光速 | $c$ | $2.99792 \times 10^8$ | m/s |
| 真空介电常数 | $\varepsilon_0$ | $8.85419 \times 10^{-12}$ | F/m |
| 阿伏伽德罗常数 | $N_A$ | $6.02214 \times 10^{23}$ | mol⁻¹ |
| 原子质量单位 | $m_u$ | $1.66054 \times 10^{-27}$ | kg |
| 偶极矩 (1 a.u.) | — | $2.54175$ | Debye |
| 长度 (1 a.u. = 1 Bohr) | $a_0$ | $0.529177$ | Å |
IR 强度换算因子
6. 常见问题与调试
Q1:计算的 IR 强度与 Gaussian 直接输出不一致?
- 位移步长 $\Delta Q$ 是否合适(推荐 0.01 amu$^{1/2}$·Å)
- 约化质量单位是否为 amu(不是 kg)
- 偶极矩是否为 Debye(不是原子单位;1 a.u. = 2.54175 D)
- 是否加了
nosymm关键词 - SCF 是否充分收敛(加
scf=tight)
Q2:拉曼活性数值偏差较大?
prop=polar 关键词对应的输出,
而非 Gaussian 自动计算的极化率(两者格式可能不同)。
Q3:某振动模式 IR 强度为 0,但预期有活性?
- 坐标系方向与选择定则有关——确认偶极矩的 $x,y,z$ 分量都被纳入计算
- 分子具有高对称性,该模式对称性确实禁戒 IR(如 CO₂ 对称伸缩)
- 单点计算中未指定
prop=dipole导致偶极矩未输出
Q4:如何快速验证 Gaussian 频率计算中的 IR 强度?
grep "IR Inten" *.log 提取所有模式的 IR 强度。
对于 Raman,使用 grep "Raman Activ" *.log。
GaussView 的光谱窗口也可直接可视化 IR/Raman 谱。
核心公式总览
| 物理量 | 公式 | 备注 |
|---|---|---|
| IR 活性条件 | $\partial\vec{\mu}/\partial Q_k \neq 0$ | 偶极矩导数非零 |
| Raman 活性条件 | $\partial\boldsymbol{\alpha}/\partial Q_k \neq 0$ | 极化率导数非零 |
| IR 积分强度 | $I_{\mathrm{IR},k} = C_{\mathrm{IR}}|\partial\vec{\mu}/\partial Q_k|^2$ | 单位:km/mol |
| 各向同性导数 | $\alpha' = \tfrac{1}{3}(\partial\alpha_{xx}+\partial\alpha_{yy}+\partial\alpha_{zz})/\partial Q$ | — |
| 拉曼活性 | $S_k = 45\alpha'^2 + 7\gamma'^2$ | 单位:Å⁴/amu |
| 去偏振比 | $\rho_p = 3\gamma'^2/(45\alpha'^2+4\gamma'^2)$ | $0 \leq \rho_p \leq 3/4$ |
| 数值差分 | $f'(x) \approx [f(x+h)-f(x-h)]/(2h)$ | 误差 $O(h^2)$ |