密度矩阵
对于一些低量子比特系统而言,能够展示整个系统的量子态分布、密度矩阵分布或者Bloch轨迹,对于算法研究有很大帮助。 pyqpanda提供了类似的功能接口。
对于量子态,可以通过 state_to_density_matrix
转化为密度矩阵,参数是 量子态数组 ,可以参考如下示例。
- state_to_density_matrix(quantum_state)
该函数用于将量子态转换为密度矩阵。
- 参数:
quantum_state (list of complex numbers) -- 要转换的量子态,以复数列表形式表示。
- 返回:
密度矩阵。
- 返回类型:
numpy.ndarray
- 抛出:
RuntimeError -- 如果输入不是有效的量子态。
一个简单的例子:
from pyqpanda import * import numpy as np machine = CPUQVM() machine.init_qvm() qubits = machine.qAlloc_many(3) prog = QProg() prog << X(qubits[0:2])\ << Z(qubits[:2])\ << H(qubits[:]) machine.directly_run(prog) state = machine.get_qstate() density_matrix = state_to_density_matrix(state) print(density_matrix)
输出结果如下:
[[ 0.125+0.j -0.125-0.j -0.125-0.j 0.125+0.j 0.125+0.j -0.125-0.j -0.125-0.j 0.125+0.j] [-0.125+0.j 0.125+0.j 0.125+0.j -0.125+0.j -0.125+0.j 0.125+0.j 0.125+0.j -0.125+0.j] [-0.125+0.j 0.125+0.j 0.125+0.j -0.125+0.j -0.125+0.j 0.125+0.j 0.125+0.j -0.125+0.j] [ 0.125+0.j -0.125-0.j -0.125-0.j 0.125+0.j 0.125+0.j -0.125-0.j -0.125-0.j 0.125+0.j] [ 0.125+0.j -0.125-0.j -0.125-0.j 0.125+0.j 0.125+0.j -0.125-0.j -0.125-0.j 0.125+0.j] [-0.125+0.j 0.125+0.j 0.125+0.j -0.125+0.j -0.125+0.j 0.125+0.j 0.125+0.j -0.125+0.j] [-0.125+0.j 0.125+0.j 0.125+0.j -0.125+0.j -0.125+0.j 0.125+0.j 0.125+0.j -0.125+0.j] [ 0.125+0.j -0.125-0.j -0.125-0.j 0.125+0.j 0.125+0.j -0.125-0.j -0.125-0.j 0.125+0.j]]
量子态分布
如果需要打印量子态的分布,可以使用 plot_state_city
接口,函数定义如下
- plot_state_city(quantum_state, title='', figsize=None, color=None, ax_real=None, ax_imag=None)
该函数用于绘制量子态的立体分布图。
- 参数:
quantum_state (list of complex) -- 要绘制城市图的量子态,应为复数列表。
title (str, optional) -- 图的标题,默认为空字符串。
figsize (tuple, optional) -- 图的尺寸,格式为 (宽度, 高度),默认为 None。
color (str, optional) -- 图的颜色设置,默认为 None。
ax_real (matplotlib.axes.Axes, optional) -- 用于绘制实部的 Matplotlib 坐标轴,默认为 None。
ax_imag (matplotlib.axes.Axes, optional) -- 用于绘制虚部的 Matplotlib 坐标轴,默认为 None。
- 返回:
Matplotlib 图形对象。
- 返回类型:
matplotlib.figure.Figure
使用示例:
from pyqpanda import * import numpy as np machine = CPUQVM() machine.set_configure(50, 50) machine.init_qvm() q = machine.qAlloc_many(4) c = machine.cAlloc_many(4) prog = QProg() prog.insert(X(q[1]))\ .insert(T(q[0]))\ .insert(RX(q[1], np.pi/2))\ .insert(RZ(q[0], np.pi/4)) machine.directly_run(prog) result = machine.get_qstate() plot_state_city(result) machine.finalize()
终端会通过matplot绘制具体的量子态分布如下
对于密度矩阵,我们可以通过 plot_density_matrix
来打印密度矩阵,函数定义如下:
- plot_density_matrix(M, xlabels=None, ylabels=None, title=None, limits=None, phase_limits=None, fig=None, axis_vals=None, threshold=None)
该函数用于绘制给定量子态的密度矩阵图像,以直观地呈现量子态的结构和性质。
- 参数:
M (list of complex) -- 要绘制的量子态的复数列表(密度矩阵)。密度矩阵是量子力学中描述量子态的矩阵表示,包含了量子态的全部信息。
xlabels (list, optional) -- 用于自定义X轴标签的列表。每个标签对应密度矩阵的一列。默认为 None。
ylabels (list, optional) -- 用于自定义Y轴标签的列表。每个标签对应密度矩阵的一行。默认为 None。
title (str, optional) -- 图像的标题,用于指明图像的主题或特定含义。默认为 None。
limits (tuple, optional) -- 图像的显示范围,可控制颜色的映射范围。默认为 None。
phase_limits (tuple, optional) -- 相位的显示范围,用于调整相位颜色的映射范围。默认为 None。
fig (matplotlib.figure.Figure, optional) -- Matplotlib图像对象,用于在现有图像上绘制。默认为 None。
axis_vals (list, optional) -- 自定义轴的值,用于更改轴上的刻度值。默认为 None。
threshold (float, optional) -- 阈值,用于控制在图像中隐藏低于此值的元素。默认为 None。
- 返回:
Matplotlib图像对象,呈现了量子态的密度矩阵图像。
- 返回类型:
matplotlib.figure.Figure
使用示例:
from pyqpanda import * import numpy as np machine = CPUQVM() machine.set_configure(50, 50) machine.init_qvm() q = machine.qAlloc_many(4) c = machine.cAlloc_many(4) prog = QProg() prog.insert(X(q[1]))\ .insert(H(q[0]))\ .insert(H(q[1]))\ .insert(T(q[2]))\ .insert(RX(q[1], np.pi/2))\ .insert(RY(q[3], np.pi/3))\ .insert(RZ(q[0], np.pi/4))\ .insert(RZ(q[1], np.pi))\ .insert(RZ(q[2], np.pi))\ .insert(RZ(q[3], np.pi)) machine.directly_run(prog) result = machine.get_qstate() rho = state_to_density_matrix(result) plot_density_matrix(rho) machine.finalize()
终端会通过matplot绘制具体的密度矩阵分布如下:
Bloch球轨迹
对于单个比特而言,有些情况下我们需要研究它的Bloch球运动轨迹,这个功能可以通过 plot_bloch_circuit
接口,函数定义如下:
- plot_bloch_circuit(circuit, trace=True, saveas=None, fps=20, secs_per_gate=1)
该函数用于绘制一个量子线路的 Bloch 球视图,仅支持单量子比特。
- 参数:
circuit (QuantumCircuit) -- 要绘制的量子线路。
trace (bool, optional) -- 是否显示 Bloch 球轨迹。默认为 True。
saveas (str, optional) -- 保存图像的文件路径。默认为 None。
fps (int, optional) -- 动画的帧率。默认为 20。
secs_per_gate (int, optional) -- 每个门操作的显示时间(秒)。默认为 1。
- 返回:
Bloch 球视图的图像。
- 返回类型:
Figure
使用代码示例:
from pyqpanda import * import numpy as np machine = CPUQVM() machine.set_configure(50, 50) machine.init_qvm() q = machine.qAlloc_many(2) c = machine.cAlloc_many(2) cir = QCircuit() cir.insert(RX(q[0], np.pi/2)) \ .insert(RZ(q[0], np.pi / 2)) \ .insert(RZ(q[0], np.pi/6))\ .insert(RY(q[0], np.pi/3))\ .insert(RX(q[0], np.pi/9)) plot_bloch_circuit(cir) machine.finalize()
终端会动态展示单个量子比特线路的Bloch轨迹如下:
概率分布
在运行一个量子线路得到概率分布后,可以通过 draw_probability
或 draw_probability_dict
绘制具体的概率分布,
他们的区别是第一个函数参数是dict类型,包含量子态二进制表示与对应的概率,另一个函数参数是list,表示量子态概率数组,运行示例如下:
- draw_probability(probability_dict)
该函数用于绘制量子态概率分布的字典。
- 参数:
probability_dict (dict) -- 要绘制的量子态概率分布字典,其中键是量子态,值是概率值。
- 返回:
无返回值。
- 返回类型:
None
一个简单的例子如下:
from pyqpanda import * machine = CPUQVM() machine.init_qvm() qubits = machine.qAlloc_many(3) prog = QProg() prog << Z(qubits[0])\ << X1(qubits[1])\ << H(qubits[:2]) machine.directly_run(prog) result_dict = machine.prob_run_dict(prog, qubits, -1) draw_probability_dict(result_dict) machine.finalize()
绘制的概率分布图如下: