Variational Quantum Eigensolver笔记

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)
  1. Hartree-Fock 状态

    • 这是量子化学计算中的初始猜测状态

    • 表示电子在分子轨道上的最低能量排布

    • 在量子计算中,用比特状态来表示电子占据情况

  2. 状态表示

    • [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)
  1. 量子节点装饰器

    python 复制代码
    @qml.qnode(dev, interface="jax")
    • 将经典函数转换为可执行的量子电路

    • interface="jax" 启用自动微分,便于梯度优化

  2. 初始状态准备

    python 复制代码
    qml.BasisState(hf, wires=wires)
    • 使用之前生成的 Hartree-Fock 状态 [1, 1, 0, 0]

    • 将量子比特初始化为化学上有意义的起始状态

  3. 双激发操作

    python 复制代码
    qml.DoubleExcitation(param, wires=[0, 1, 2, 3])
    • 实现双电子激发:将两个电子从占据轨道激发到空轨道

    • param 是变分参数,在优化过程中调整

    • 作用在 4 个量子比特上,对应分子轨道

  4. 期望值测量

    python 复制代码
    pythonreturn qml.expval(H)
    • 返回分子哈密顿量 H 的期望值

    • 这个值就是 VQE 要最小化的能量

python 复制代码
def cost_fn(param):
    return circuit(param, wires=range(qubits))
  1. 桥梁功能

    • 将量子电路包装成经典优化器可以处理的函数

    • 输入:变分参数 param

    • 输出:分子能量期望值

  2. 优化目标

    • 在 VQE 中,成本函数的值就是分子哈密顿量的期望值(能量)

    • 优化目标是最小化这个能量值,找到基态

python 复制代码
import optax

max_iterations = 100
conv_tol = 1e-06

opt = optax.sgd(learning_rate=0.4)
  1. optax 库

    • Google 开发的高性能优化库

    • 专门为 JAX 生态系统设计

    • 提供各种优化算法

  2. 随机梯度下降 (SGD)

    python 复制代码
    opt = optax.sgd(learning_rate=0.4)
    • 使用基本的梯度下降优化器

    • 学习率 0.4 控制参数更新的步长

  3. 收敛标准

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

Kaggle Notebook Editor

相关推荐
zhangrelay2 小时前
内卷式迷茫-当游戏沉迷与疯狂刷题成为“空心病”的双重面具-AI
笔记·学习
常州晟凯电子科技3 小时前
海思SS626开发笔记之环境搭建和SDK编译
人工智能·笔记·嵌入式硬件·物联网
崎岖Qiu3 小时前
【OS笔记04】:进程和线程2-进程控制
笔记·操作系统·os
悠哉悠哉愿意3 小时前
【ROS2学习笔记】URDF 机器人建模
笔记·学习·机器人·ros2
智者知已应修善业3 小时前
【51单片机32个灯,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。】2023-2-10
c语言·经验分享·笔记·嵌入式硬件·51单片机
nnerddboy4 小时前
QT(c++)开发自学笔记:1.串口
c++·笔记·qt
岑梓铭5 小时前
计算机网络第四章(10)——网络层《路由算法+路由协议》
网络·笔记·计算机网络·考研·智能路由器·408
YongCheng_Liang5 小时前
网络工程师笔记10-BGP协议
运维·网络·笔记
JJJJ_iii6 小时前
【深度学习04】PyTorch:损失函数、优化器、模型微调、保存与加载
人工智能·pytorch·笔记·python·深度学习·机器学习