跳转至

用一组波形驱动两个原子

把两个原子准备在基态,用同一组激光控制驱动它们,再查看激发概率。这节课把原子位置、驱动波形和测量结果连起来,也教你检查模拟器实际采用的物理模型。

先完成安装、中性原子基础和物理单位。在仓库根目录运行脚本。实验使用两个原子、8 个时间步和 32 次采样,在本地 CPU 上运行。

先明确模型,再预测结果

AtomRegister.line(count=2, spacing=6.0) 把原子放在 (0, 0) 和 (6, 0),坐标单位为微米。虽然两个原子排成一条线,寄存器使用的仍是二维坐标。0 表示基态,1 表示 Rydberg 态。

驱动持续 0.2 us。Rabi 角频率从 0 线性升到 1 rad/us,失谐保持 -0.2 rad/us,相位为零。取 ℏ = 1,单原子 Hamiltonian 为 H(t) = Ω(t) X / 2 − Δ n,其中 n = |1⟩⟨1|。零相位的 Rabi 驱动耦合两个状态,失谐改变激发态的能量。

程序没有配置有限的 C6/r^6 相互作用,并显式选择 SimulationOptions(method="state_vector", blockade_mode="full"),保留全部四个基态。这给出两个原子独立演化的对照模型。原子位置仍参与目标约束校验。

脉冲面积为 (0 + 1) × 0.2 / 2 = 0.1 rad。先忽略较小的失谐,单原子激发概率约为 sin²(0.1 / 2) ≈ 0.0025。运行前预测:只采样 32 次,是否经常能看到两个原子同时激发?

运行实验

"""运行一个带全局控制的 Analog Hamiltonian Simulation 实验。

程序包含原子阵列、Rabi、detuning、phase、终端测量、Target 校验和本地模拟。
CASCAQit 公开 Analog API 使用微秒表示时间,使用 rad/us 表示角频率。
"""

from __future__ import annotations

import json

from cascaqit import (
    AHSProgram,
    AtomRegister,
    LocalBackend,
    MockNeutralAtomTarget,
    SimulationOptions,
    Waveform,
)


def main() -> None:
    """构建并采样一个双 site 全局驱动程序。"""
    # Register 顺序定义控制和测量使用的逻辑顺序。
    register = AtomRegister.line(count=2, spacing=6.0)
    program = AHSProgram(register, program_id="lesson.experimentalist.beginner")

    # Rabi、detuning 和 phase 共用一个显式 duration。
    program.drive(
        rabi=Waveform.linear(0.0, 1.0, duration=0.2),
        detuning=Waveform.constant(-0.2, duration=0.2),
        phase=0.0,
    ).measure()
    target = MockNeutralAtomTarget.v0_1()
    validated = program.validate(target, shots=32)
    options = SimulationOptions(method="state_vector", blockade_mode="full")
    result = (
        LocalBackend(target=target, analog_time_steps=8)
        .run(program, shots=32, seed=301, options=options)
        .result()
    )

    payload = {
        "track": "quantum_experimentalist",
        "level": "beginner",
        "lesson": "global_ahs",
        "facts": {
            "site_ids": [site.site_id for site in register.sites],
            "validation_errors": [
                item.code for item in validated.diagnostics if item.severity == "error"
            ],
            "counts_total": sum(result.counts.values()),
            "probabilities": result.probabilities,
            "finite_interaction_enabled": False,
            "blockade_mode": options.blockade_mode,
            "bit_order": result.metadata["bitstring_ordering"],
            "probability_sum": round(sum((result.probabilities or {}).values()), 12),
            "selected_simulator": result.metadata["selected_simulator"],
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()

下载完整脚本

python3 examples/user/tracks/quantum_experimentalist/01_beginner_global_ahs_zh.py

program.validate(target, shots=32) 按模拟目标的约束检查输入,随后将同一个 target 传给本地后端。validation_errors 为空,表示这组输入通过了校验;它不能证明实验精度,也不能证明可以直接在真机上执行。

{
  "boundaries": {
    "cloud_execution": false,
    "credentials_loaded": false,
    "hardware_execution": false,
    "network_accessed": false
  },
  "facts": {
    "bit_order": {
      "bitstring_index": "left_to_right_matches_logical_order",
      "convention": "logical_order",
      "logical_order": [
        "q0",
        "q1"
      ]
    },
    "blockade_mode": "full",
    "counts_total": 32,
    "finite_interaction_enabled": false,
    "probabilities": {
      "00": 0.9950108478690685,
      "01": 0.002491456824543835,
      "10": 0.0024914568245438325,
      "11": 6.238481843843723e-06
    },
    "probability_sum": 1.0,
    "selected_simulator": "ScalableIdealEngine",
    "site_ids": [
      "q0",
      "q1"
    ],
    "validation_errors": []
  },
  "lesson": "global_ahs",
  "level": "beginner",
  "track": "quantum_experimentalist"
}

先看概率,再看采样。00 的概率约为 0.9950,01 和 10 各约为 0.00249,11 约为 0.00000624。两个原子受到相同驱动,因此两种单激发状态的概率相等。这个独立原子模型还满足 P(11) = p²、P(01) = P(10) = p(1−p),其中 p = P(10) + P(11)。

bit_order.logical_order 为 ["q0", "q1"],字符串从左到右按这个顺序读取。在本地副本中加入 print(result.counts) 可查看采样计数,总和应为 32。只看到 00 很正常:这种情况发生的概率约为 0.9950^32 ≈ 0.85。增加 shots 更容易观察到稀有事件,但不会改变模型本身。

为什么要写明阻塞选项

不显式设置时,后端可能根据 target 的阻塞半径选择硬阻塞子空间。这种近似直接去掉不允许的基态,与给双激发态加入很大但有限的能量不同。本例的模拟目标把阻塞半径设为 8 um,因此自动选择可能排除间距 6 um 的两个原子的 11 状态。

研究独立原子的基准结果时,保留 blockade_mode="full"。研究有限相互作用时,把 VanDerWaalsInteraction 传给 AHSProgram,并明确设置 C6 和截断半径。Analog 使用指南介绍了接口和单位。仅修改坐标不会自动加入有限相互作用。

一次改一个条件

  1. 保留完整状态空间选项,把间距从 6 改为 10 um。分别比较概率、校验结果和采样。概率分布应该变化吗?
  2. 保持几何不变,将线性波形换成 Waveform.constant(0.5, duration=0.2),脉冲面积相同。先把两个程序的失谐都设为零,再恢复为 -0.2。为什么第一组对比可以仅凭面积预测理想末态,第二组通常不行?
  3. 将 analog_time_steps 从 8 改为 32、128,先比较概率,再考虑修改 shots。这是在检查哪一种误差?
核对思路

没有有限相互作用,也没有阻塞投影时,间距不进入这里的 Hamiltonian;两组几何仍需分别通过校验。零失谐、固定相位时,不同时刻的 Hamiltonian 都正比于 X,彼此对易,因此脉冲面积决定理想末态。非零失谐引入了与 X 不对易的项,时间形状就可能影响结果。增加时间分辨率检查数值积分误差,增加 shots 检查采样波动。粗时间步适合开始练习,不能作为所有实验的精度保证。

如果校验报错,先看错误码和对象路径,再检查单位、原子间距和波形时长。如果概率结果缺少某个基态,先核对所选状态空间,再判断是否存在物理上的抑制效应。

接着学习波形设计与局域控制,或进入第一个 D-A-D 实验,把原子演化与量子门组合起来。

English

SDK 1.0.8a · `8b227bff`