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 算法在量子计算化学中的广泛适用性。
"""