---
# System prepended metadata

title: 05 測量
tags: [Pennylane]

---

# 測量
完成量子電路後，最後要透過「測量」得知運算結果，測量結果的呈現方式不只一種，端看您想從中得知什麼訊息，Pennylane 提供不同的呈現方式，以下我們提供比較常用的語法。

以下我們以簡易的 Bell state 作為舉例，來看不同語法呈現的測量結果，本篇提及的語法都是打在 def circuit 中最後 return 的後面：

```python=+
# 定義裝置
dev = qml.device('default.qubit', wires=2)

def my_circuit(): #定義函數（電路）名稱
    # 將所需的 gate 放進函數中
    # qml.量子邏輯閘（wires = qubit 編號）
    qml.Hadamard(wires = 0) # 在第一個 qubit 上放 H gate
    qml.CNOT(wires = [0,1]) # 在第一個與第二個 qubit 上放 CNOT gate

    # 本節文章主題
    return  欲呈現的測量結果

my_qnode = qml.QNode(my_circuit, dev)
# 執行電路
my_qnode()
```

## qml.state()

```python=+
return qml.state()
```

如果今天我們想知道電路的量子態，就會使用這語法，以上述 Bell state 為例，他的量子態為：

\begin{split}
|\psi\rangle=\frac{1}{\sqrt 2}(|00\rangle+|11\rangle)\approx 0.70710678(|00\rangle+|11\rangle)
\end{split}

下列是程式的輸出結果，與上式相符：

```python=+
>>> array([0.70710678+0.j, 0.        +0.j, 0.        +0.j, 0.70710678+0.j])
```

上面的矩陣從左到右分別對應 $|00\rangle$, $|01\rangle$, $|10\rangle$, 和 $|11\rangle$，因此只有第一個位置和最後一個位置是 $\frac{1}{\sqrt 2}$，其他則為 0。


## qml.probs()
今天我們想要知道每個量子態出現的機率為何，就可以使用這語法，括號中要輸入 wires 編號，像是：

```python=+
def my_circuit(): #定義函數（電路）名稱
    # 將所需的 gate 放進函數中
    # qml.量子邏輯閘（wires = qubit 編號）
    qml.Hadamard(wires = 0) # 在第一個 qubit 上放 H gate
    qml.CNOT(wires = [0,1]) # 在第一個與第二個 qubit 上放 CNOT gate

    # 輸出每個量子態的機率分佈
    return  qml.probs(wires = [0,1])
```

根據你學過的量子計算，不難得知這電路在理想情況下，測量結果出現 $|00\rangle$ 和 $|11\rangle$ 的機率各 50%（0.5）：

```python=+
>>> array([0.5, 0. , 0. , 0.5])
```

當然，你也可以只測量一個 qubit，像是

```python=+
def my_circuit(): #定義函數（電路）名稱
    # 將所需的 gate 放進函數中
    # qml.量子邏輯閘（wires = qubit 編號）
    qml.Hadamard(wires = 0) # 在第一個 qubit 上放 H gate
    qml.CNOT(wires = [0,1]) # 在第一個與第二個 qubit 上放 CNOT gate

    # 輸出每個量子態的機率分佈
    return  qml.probs(wires = 0) # 或是 wires = [0]
```
同理，根據你學過的基礎量子計算，測量第一個 qubit 後，看到 $|0\rangle$ 和 $|1\rangle$ 各 50%：

```python=+
>>> array([0.5, 0.5])
```

## qml.expval()
這語法用於輸出某個物理量的期望值，常用於凝態物理或是化學模擬中，輸出分子的能量值（能量的期望值），比方說我們今天想知道物理量 $H$ 的期望值，則：

\begin{split}
\langle H\rangle = \langle \psi|H|\psi\rangle
\end{split}

其中，$|\psi\rangle$ 就是電路的量子態。假使我們今天要測量 X （X gate 的 X）且在第一個 qubit 的期望值，語法會這樣打：

```python=+
return qml.expval(qml.X(0))
```

這相當於在計算下式：

\begin{split}
\langle X\rangle = \langle \psi|X\otimes I|\psi\rangle, \space \text{where}\space |\psi\rangle=\frac{1}{\sqrt 2}(|00\rangle+|11\rangle)
\end{split}

上式動手算出來會是 0：

```python=+
>>> 0.0
```

也可以這樣寫，相當於是兩個 operator 做 tensor product：

```python=+
return qml.expval(qml.X(0)@qml.X(1))
```
相當於在算 

\begin{split}
\langle \psi|X\otimes X|\psi\rangle=1
\end{split}

## qml.counts()
以上的測量結果都是基於理想情況下，有時候我們想知道真實情況下的測量結果，就會使用這語法。

在測量之前，dev 要多加一個參數，定義你要測量幾次（shots）

```python=+
dev = qml.device('default.qubit', wires=2, shots=1024)
```

輸出的結果為：

```python=+
>>> {'00': 507, '11': 517}
```
在 1024 次測量中，有 507 次測量到的結果是 $|00\rangle$，517 次是 $|11\rangle$，機率各為 49.5% 與 50.4%，接近理想 50%。

如果你希望所有量子態的出現次數都列出來，可以在括號中打上 "all_outcomes=True"，即：

```python=+
return qml.counts(all_outcomes=True)
```
```python=+
>>> {'00': 523, '01': 0, '10': 0, '11': 501}
```

也可以輸出每次物理量的期望值

```python=+
return qml.counts(qml.X(0))
```
以下結果表示有三次測量是 $-1$，三次是 $1$，平均起來就是 $0$
```python=+
>>> {-1.0: 3, 1.0: 3}
```

亦或是

```python=+
return  qml.counts(qml.X(0)@qml.X(1))
```
```python=+
>>> {1.0: 6}
```

## qml.sample()
想看每次測量的結果可以用 qml.sample() 語法

```python=+
>>> array([[1, 1],
       [0, 0],
       [1, 1],
       [0, 0],
       [0, 0]])
```

也可以測量特定的 qubit

```python=+
return  qml.sample(wires = 0)
```
就會輸出第一個 qubit 每次的測量結果
```python=+
>>> array([1, 1, 0, 1, 1])
```

同樣地，期望值也可以
```python=+
return  qml.sample(qml.X(0)@qml.X(1))
```

```python=+
>>> array([1., 1., 1., 1., 1., 1.])
```


