量子物体的测量
注意
QuTiP 4.6 中的新功能
介绍
测量是量子力学标准表述的基本部分,是从量子对象获取经典读数的过程。尽管对这一过程的解释有时存在争议,但过程本身在数学上是直接的,并在许多优秀的入门教材中有所描述。
在这里,我们将向您展示如何在QuTiP对象上执行简单的测量操作。相同的函数measure和measurement_statistics可以用于处理可观测式测量和投影式测量。
执行基本测量(可观察量)
首先,我们需要选择一些状态来测量。现在,让我们创建一个上状态和一个下状态:
up = basis(2, 0)
down = basis(2, 1)
表示自旋-1/2粒子,其自旋沿z轴指向向上或向下。
我们通过选择一个测量算子来决定要测量什么(在这种情况下)。
例如,
我们可以选择sigmaz来测量自旋1/2粒子的z分量,或者选择sigmax来测量x分量:
spin_z = sigmaz()
spin_x = sigmax()
我们如何知道这些操作符测量的是什么?答案在于测量过程本身:
量子测量通过将测量状态投影到测量算子的一个特征向量中来改变被测量的状态。
选择投影到哪个特征向量是根据状态在特征向量方向上的振幅的平方概率性地选择的。
测量返回的值是对应于所选特征向量的特征值。
注意
如何解释这种“随机选择”是著名的“量子测量问题”。
spin_z 的特征向量是自旋指向向上或向下的状态,因此它测量自旋沿 z 轴的分量。
spin_x 的特征向量是自旋指向左或右的状态,因此它测量自旋沿x轴的分量。
当我们使用操作符spin_z测量我们的上和下状态时,我们总是得到:
from qutip.measurement import measure, measurement_statistics
measure(up, spin_z) == (1.0, up)
measure(down, spin_z) == (-1.0, down)
因为 up 是 spin_z 的特征向量,特征值为 1.0,而 down 是特征值为 -1.0 的特征向量。负号只是一个任意的全局相位——up 和 -up 代表相同的量子态。
两个特征向量在彼此的方向上都没有任何分量(它们是正交的),因此measure(spin_z, up) 100% 的时间返回状态 up,而 measure(spin_z, down) 100% 的时间返回状态 down。
注意measure如何返回一对值。第一个是测量值,即算子的特征值(例如1.0),第二个是测量后量子系统的状态,即算子的特征向量(例如up)。
现在让我们考虑如果我们测量自旋的x分量会发生什么:
measure(up, spin_x)
up 状态不是 spin_x 的本征向量。spin_x 有两个本征向量,我们称之为 left 和 right。up 状态在这两个向量的方向上具有相等的分量,因此测量时会有50%的概率选择其中的每一个。
这些左和右状态是:
left = (up - down).unit()
right = (up + down).unit()
当选择left时,测量结果将为(-1.0, -left)。
当选择right时,测量结果将是(1.0, right)。
注意
当使用第二个参数作为可观察量调用measure时,它充当measure_observable的别名。
执行基本测量(投影)
我们还可以通过指定投影运算符列表来选择要测量的内容。例如,我们可以选择投影运算符 \(\ket{0} \bra{0}\) 和 \(\ket{1} \bra{1}\),它们在 \(\ket{0}, \ket{1}\) 基中测量状态。请注意,这些投影运算符是由 sigmaz 算符的本征态确定的投影器。
Z0, Z1 = ket2dm(basis(2, 0)), ket2dm(basis(2, 1))
为每个投影算子计算概率和相应的输出状态。
measure(up, [Z0, Z1]) == (0, up)
measure(down, [Z0, Z1]) == (1, down)
在这种情况下,投影算子方便地对应于维度为\(1\)的子空间的本征态。然而,这可能并非总是如此,在这种情况下,不可能为每个本征态拥有唯一的本征值。假设我们只想测量一个双量子比特系统中的第一个量子比特。考虑双量子比特状态\(\ket{0+}\)
state_0 = basis(2, 0)
state_plus = (basis(2, 0) + basis(2, 1)).unit()
state_0plus = tensor(state_0, state_plus)
现在,假设我们只想在计算基中测量第一个量子比特。 我们可以通过使用投影算子 \(\ket{0}\bra{0} \otimes I\) 和 \(\ket{1}\bra{1} \otimes I\) 来实现这一点。
PZ1 = [tensor(Z0, identity(2)), tensor(Z1, identity(2))]
PZ2 = [tensor(identity(2), Z0), tensor(identity(2), Z1)]
现在,与前面的例子一样,我们可以通过提供投影算符列表和状态来进行测量。
measure(state_0plus, PZ1) == (0, state_0plus)
测量的输出是测量结果的索引以及输入状态的完整希尔伯特空间上的输出状态。关键要注意的是,我们在测量后不会丢弃测量的量子比特(与在量子硬件上测量时不同)。
注意
当使用第二个参数作为投影仪列表调用measure时,它充当measure_povm的别名。
measure 函数也可以对密度矩阵进行测量。您可以在 measure_povm 和 measure_observable 中阅读有关这些和其他细节的内容。
现在你知道如何在QuTiP中测量量子态了!
获取测量统计信息(可观测)
你刚刚学会了如何在QuTiP中进行测量,但你也了解到测量是概率性的。如果我们不只是进行一次测量,而是想确定大量测量的概率分布,该怎么办?
一种方法是多次重复测量——这也是许多量子实验中所发生的情况。在QuTiP中,可以使用以下代码进行模拟:
results = {1.0: 0, -1.0: 0} # 1 and -1 are the possible outcomes
for _ in range(1000):
value, new_state = measure(up, spin_x)
results[round(value)] += 1
print(results)
输出:
{1.0: 497, -1.0: 503}
它测量up状态的自旋x分量1000次,并将结果存储在字典中。之后,我们预计会看到结果1.0(即左)大约500次,结果-1.0(即右)大约500次,但当然,每次运行时每个结果的数量会略有不同。
但是如果我们想精确地知道结果的分布呢?在一个物理系统中,我们不得不进行多次测量,但在QuTiP中,我们可以直接查看状态本身,并在一行代码中精确确定结果的概率分布:
>>> eigenvalues, eigenstates, probabilities = measurement_statistics(up, spin_x)
>>> eigenvalues
array([-1., 1.])
>>> eigenstates
array([Quantum object: dims = [[2], [1]], shape = (2, 1), type = ket
Qobj data =
[[ 0.70710678]
[-0.70710678]],
Quantum object: dims = [[2], [1]], shape = (2, 1), type = ket
Qobj data =
[[0.70710678]
[0.70710678]]], dtype=object)
>>> probabilities
[0.5000000000000001, 0.4999999999999999]
当使用单个可观测值调用时,measurement_statistics 函数会返回三个值:
eigenvalues 是测量算子的特征值数组,即可能的测量结果列表。在我们的例子中,该值为 array([-1., -1.])。
eigenstates 是测量算符的本征态数组,即测量完成后可能的最终状态列表。数组中的每个元素都是一个
Qobj。probabilities 是每个测量结果的概率列表。 在我们的例子中,值是 [0.5, 0.5],因为 up 状态被测量为左 (-1.0) 或 右 (1.0) 本征态的概率相等。
所有三个列表的顺序相同——即第一个特征值是 eigenvalues[0],其对应的特征态是eigenstates[0],其概率是probabilities[0],依此类推。
注意
当measurement_statistics
被调用时,如果第二个参数是一个可观测值,它相当于
measurement_statistics_observable的别名。
获取测量统计信息(投影)
同样地,当我们想要获取投影算子的测量统计时,我们可以使用measurement_statistics函数,其中第二个参数是投影算子的列表。再次考虑状态\(\ket{0+}\)。假设现在我们想要获取第二个量子位的测量结果。我们必须使用之前由PZ2指定的投影算子,这些算子允许我们仅在第二个量子位上进行测量。由于第二个量子位的状态是\(\ket{+}\),我们得到以下结果。
collapsed_states, probabilities = measurement_statistics(state_0plus, PZ2)
print(collapsed_states)
输出:
[Quantum object: dims = [[2, 2], [1, 1]], shape = (4, 1), type = ket
Qobj data =
[[1.]
[0.]
[0.]
[0.]], Quantum object: dims = [[2, 2], [1, 1]], shape = (4, 1), type = ket
Qobj data =
[[0.]
[1.]
[0.]
[0.]]]
print(probabilities)
输出:
[0.4999999999999999, 0.4999999999999999]
函数 measurement_statistics 然后返回两个值:
collapsed_states 是测量完成后可能的最终状态的数组。数组的每个元素都是一个
Qobj。probabilities 是每个测量结果的概率列表。
请注意,collapsed_states 正好是 \(\ket{00}\) 和 \(\ket{01}\),概率相等,正如预期的那样。两个列表的顺序相同。
注意
当measurement_statistics
被调用时,如果第二个参数是投影算子的列表,它将作为measurement_statistics_povm的别名。
measurement_statistics 函数也可以提供密度矩阵测量的统计数据。
您可以在
measurement_statistics_observable
和 measurement_statistics_povm 中阅读有关这些和其他细节的内容。
此外,measure_povm
和 measurement_statistics_povm 函数可以
处理比投影测量更一般的POVM测量。