1.构建氢分子电子哈密顿量
            
            
              python
              
              
            
          
          from jax import numpy as np
import jax
jax.config.update("jax_platform_name", "cpu")
jax.config.update('jax_enable_x64', True)
import pennylane as qml
dataset = qml.data.load('qchem', molname="H2")[0]
H, qubits = dataset.hamiltonian, len(dataset.hamiltonian.wires)
print("Number of qubits = ", qubits)
print("The Hamiltonian is ", H)
        作用:
- 
使用JAX作为数值计算后端
 - 
设置为CPU模式运行
 - 
启用64位浮点数精度(量子化学计算需要高精度)
 - 
使用PennyLane的量子化学数据集服务
 - 
直接下载H₂分子的预计算数据
 
2.VQE算法实现
2.1定义量子设备
            
            
              python
              
              
            
          
          dev = qml.device("lightning.qubit", wires=qubits)
        - 
"lightning.qubit":PennyLane的高性能量子模拟器 - 
wires=qubits:量子比特数量,这里qubits=4 
            
            
              python
              
              
            
          
          electrons = 2
hf = qm1.qchem.hf_state(electrons, qubits)
print(hf)
        - 
Hartree-Fock 状态:
- 
这是量子化学计算中的初始猜测状态
 - 
表示电子在分子轨道上的最低能量排布
 - 
在量子计算中,用比特状态来表示电子占据情况
 
 - 
 - 
状态表示:
- 
[1 1 0 0]表示前两个轨道被占据,后两个轨道空置 - 
每个
1表示该轨道有一个电子 - 
对于 2 电子系统,通常需要 4 个量子比特来表示
 
 - 
 
            
            
              python
              
              
            
          
          @qml.qnode(dev, interface="jax")
def circuit(param, wires):
    qml.BasisState(hf, wires=wires)
    qml.DoubleExcitation(param, wires=[0, 1, 2, 3])
    return qml.expval(H)
        - 
量子节点装饰器:
python@qml.qnode(dev, interface="jax")- 
将经典函数转换为可执行的量子电路
 - 
interface="jax"启用自动微分,便于梯度优化 
 - 
 - 
初始状态准备:
pythonqml.BasisState(hf, wires=wires)- 
使用之前生成的 Hartree-Fock 状态
[1, 1, 0, 0] - 
将量子比特初始化为化学上有意义的起始状态
 
 - 
 - 
双激发操作:
pythonqml.DoubleExcitation(param, wires=[0, 1, 2, 3])- 
实现双电子激发:将两个电子从占据轨道激发到空轨道
 - 
param是变分参数,在优化过程中调整 - 
作用在 4 个量子比特上,对应分子轨道
 
 - 
 - 
期望值测量 :
pythonpythonreturn qml.expval(H)- 
返回分子哈密顿量 H 的期望值
 - 
这个值就是 VQE 要最小化的能量
 
 - 
 
            
            
              python
              
              
            
          
          def cost_fn(param):
    return circuit(param, wires=range(qubits))
        - 
桥梁功能:
- 
将量子电路包装成经典优化器可以处理的函数
 - 
输入:变分参数
param - 
输出:分子能量期望值
 
 - 
 - 
优化目标:
- 
在 VQE 中,成本函数的值就是分子哈密顿量的期望值(能量)
 - 
优化目标是最小化这个能量值,找到基态
 
 - 
 
            
            
              python
              
              
            
          
          import optax
max_iterations = 100
conv_tol = 1e-06
opt = optax.sgd(learning_rate=0.4)
        - 
optax 库:
- 
Google 开发的高性能优化库
 - 
专门为 JAX 生态系统设计
 - 
提供各种优化算法
 
 - 
 - 
随机梯度下降 (SGD):
pythonopt = optax.sgd(learning_rate=0.4)- 
使用基本的梯度下降优化器
 - 
学习率
0.4控制参数更新的步长 
 - 
 - 
收敛标准:
- 
max_iterations = 100:最大迭代次数 - 
conv_tol = 1e-06:收敛容差(10⁻⁶) 
 - 
 
            
            
              python
              
              
            
          
          # 将电路参数θ初始化为0,这意味着我们从Hartree-Fock状态开始
theta = np.array(0.)
# 存储成本函数值(能量)的历史记录
energy = [cost_fn(theta)]
# 存储电路参数值的历史记录
angle = [theta]
# 初始化优化器状态
opt_state = opt.init(theta)
# 开始优化循环,最多迭代max_iterations次
for n in range(max_iterations):
    
    # 计算成本函数关于参数θ的梯度
    gradient = jax.grad(cost_fn)(theta)
    
    # 使用优化器计算参数更新量和新的优化器状态
    updates, opt_state = opt.update(gradient, opt_state)
    
    # 应用参数更新
    theta = optax.apply_updates(theta, updates)
    # 记录更新后的参数值和对应的能量值
    angle.append(theta)
    energy.append(cost_fn(theta))
    
    # 计算当前能量与前一次能量的绝对差值,用于收敛判断
    conv = np.abs(energy[-1] - energy[-2])
    # 每2次迭代打印一次当前能量值
    if n % 2 == 0:
        print(f"Step = {n}, Energy = {energy[-1]:.8f} Ha")
    # 检查是否达到收敛容差,如果收敛则提前退出循环
    if conv <= conv_tol:
        break
# 输出最终的基态能量结果
print("\n" f"Final value of the ground-state energy = {energy[-1]:.8f} Ha")
# 输出最优的电路参数值
print("\n" f"Optimal value of the circuit parameter = {angle[-1]:.4f}")
        
            
            
              python
              
              
            
          
          # 导入绘图库
import matplotlib.pyplot as plt
# 创建图形对象并设置图形大小
fig = plt.figure()
fig.set_figheight(5)
fig.set_figwidth(12)
# 经典计算得到的全组态相互作用(FCI)能量,作为基准参考值
E_fci = -1.136189454088
# 在左侧创建第一个子图(能量随优化步数的变化)
ax1 = fig.add_subplot(121)
# 绘制能量变化曲线:绿色圆点,虚线连接
ax1.plot(range(n + 2), energy, "go", ls="dashed")
# 绘制FCI能量参考线:红色水平线
ax1.plot(range(n + 2), np.full(n + 2, E_fci), color="red")
# 设置坐标轴标签
ax1.set_xlabel("Optimization step", fontsize=13)
ax1.set_ylabel("Energy (Hartree)", fontsize=13)
# 添加文本标注:Hartree-Fock能量和FCI能量
ax1.text(0.5, -1.1176, r"$E_\mathrm{HF}$", fontsize=15)
ax1.text(0, -1.1357, r"$E_\mathrm{FCI}$", fontsize=15)
# 设置坐标轴刻度字体大小
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# 在右侧创建第二个子图(门参数θ随优化步数的变化)
ax2 = fig.add_subplot(122)
# 绘制参数变化曲线:绿色圆点,虚线连接
ax2.plot(range(n + 2), angle, "go", ls="dashed")
# 设置坐标轴标签
ax2.set_xlabel("Optimization step", fontsize=13)
ax2.set_ylabel("Gate parameter $\theta$ (rad)", fontsize=13)
# 设置坐标轴刻度字体大小
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# 调整子图间距和底部边距
plt.subplots_adjust(wspace=0.3, bottom=0.2)
# 显示图形
plt.show()
        
            
            
              python
              
              
            
          
          """
VQE 算法应用总结
在这个案例中,VQE 算法经过 13 次迭代后收敛。
最优电路参数 θ* = 0.208 定义了分子的量子态:
|Ψ(θ*)⟩ = 0.994 |1100⟩ - 0.104 |0011⟩
这个态正是 H₂ 分子在最小基组近似下的精确基态。
## 结论
在本教程中,我们实现了 VQE 算法来寻找氢分子的基态。我们使用了一个简单的电路来制备超越 Hartree-Fock 近似的分子量子态。
通过最小化定义为分子哈密顿量在试探态中期望值的成本函数,我们获得了基态能量。
VQE 算法还可以用于模拟其他化学现象:
1. 化学反应模拟
   - 教程:在量子计算机上模拟化学反应
   - 用途:探索分子的势能面来模拟化学反应
2. 特定希尔伯特空间扇区中的低激发态探测
   - 教程:不同自旋扇区中的 VQE
   - 用途:研究分子在特定对称性下的激发态
3. 分子几何结构优化
   - 教程:分子几何结构的优化
   - 用途:寻找分子的平衡几何构型
这些扩展应用展示了 VQE 算法在量子计算化学中的广泛适用性。
"""