用一组波形驱动两个原子¶
把两个原子准备在基态,用同一组激光控制驱动它们,再查看激发概率。这节课把原子位置、驱动波形和测量结果连起来,也教你检查模拟器实际采用的物理模型。
先完成安装、中性原子基础和物理单位。在仓库根目录运行脚本。实验使用两个原子、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 使用指南介绍了接口和单位。仅修改坐标不会自动加入有限相互作用。
一次改一个条件¶
- 保留完整状态空间选项,把间距从
6改为10 um。分别比较概率、校验结果和采样。概率分布应该变化吗? - 保持几何不变,将线性波形换成
Waveform.constant(0.5, duration=0.2),脉冲面积相同。先把两个程序的失谐都设为零,再恢复为-0.2。为什么第一组对比可以仅凭面积预测理想末态,第二组通常不行? - 将
analog_time_steps从 8 改为 32、128,先比较概率,再考虑修改 shots。这是在检查哪一种误差?
核对思路
没有有限相互作用,也没有阻塞投影时,间距不进入这里的 Hamiltonian;两组几何仍需分别通过校验。零失谐、固定相位时,不同时刻的 Hamiltonian 都正比于 X,彼此对易,因此脉冲面积决定理想末态。非零失谐引入了与 X 不对易的项,时间形状就可能影响结果。增加时间分辨率检查数值积分误差,增加 shots 检查采样波动。粗时间步适合开始练习,不能作为所有实验的精度保证。
如果校验报错,先看错误码和对象路径,再检查单位、原子间距和波形时长。如果概率结果缺少某个基态,先核对所选状态空间,再判断是否存在物理上的抑制效应。
接着学习波形设计与局域控制,或进入第一个 D-A-D 实验,把原子演化与量子门组合起来。