动力学模拟结果
求解器.结果类
在开始模拟量子系统的动力学之前,我们首先会看一下用于返回模拟结果的数据结构。这个对象是一个Result类,它存储了分析和绘制模拟结果所需的所有关键数据。一个通用的Result对象result包含以下用于存储模拟数据的属性:
属性 |
描述 |
|---|---|
|
字符串,指示用于生成数据的求解器。 |
|
计算模拟数据的时间列表/数组。 |
|
如果请求了期望值,则为期望值的列表/数组。 |
|
期望值的字典,如果请求了的话。 |
|
在 |
|
演化最后时刻的状态向量或密度矩阵。 |
|
关于演化的各种统计信息。 |
访问结果数据
为了理解如何访问Result对象中的数据,我们将使用一个示例作为指导,尽管在这个阶段我们不需要担心模拟的细节。与所有求解器一样,本示例中使用的Master Equation求解器返回一个Result对象,这里简称为result。要查看result中包含的内容,我们可以使用print函数:
>>> print(result)
<Result
Solver: mesolve
Solver stats:
method: 'scipy zvode adams'
init time: 0.0001876354217529297
preparation time: 0.007544517517089844
run time: 0.001268625259399414
solver: 'Master Equation Evolution'
num_collapse: 1
Time interval: [0, 1.0] (2 steps)
Number of e_ops: 1
State not saved.
>
第一行告诉我们这个数据对象是从主方程求解器mesolve生成的。接下来是统计信息,包括使用的ODE求解器、设置时间、崩溃次数。然后描述了积分区间,接着是计算的期望值数量。最后,它说明了是否存储了状态。
现在我们有了分析模拟结果所需的所有信息。 要访问两个期望值的数据,可以这样做:
expt0 = result.expect[0]
expt1 = result.expect[1]
回想一下,Python 使用从零开始的 C 风格索引(即, [0] => 第一个折叠运算符数据)。 另外,期望值可以作为字典获取:
e_ops = {"sx": sigmax(), "sy": sigmay(), "sz": sigmaz()}
...
expt_sx = result.e_data["sx"]
当 e_ops 是一个列表时,e_data 可以与列表索引一起使用。与计算这些期望值的时间数组一起:
times = result.times
我们可以绘制得到的期望值:
plot(times, expt0)
plot(times, expt1)
show()
状态向量或密度矩阵的访问方式类似,尽管通常不需要索引(即[0]),因为这些组件只有一个列表。其他求解器可能有其他输出,heomsolve的结果可以有ado_states输出,如果选项store_ados被设置,同样,fmmesolve可以返回floquet_states。
多轨迹求解器结果
求解器计算多个轨迹,例如蒙特卡罗方程求解器或随机求解器的结果将根据轨迹是否标记为保存而有所不同。 例如:
>>> mcsolve(H, psi, np.linspace(0, 1, 11), c_ops, e_ops=[num(N)], ntraj=25, options={"keep_runs_results": False})
>>> np.shape(result.expect)
(1, 11)
>>> mcsolve(H, psi, np.linspace(0, 1, 11), c_ops, e_ops=[num(N)], ntraj=25, options={"keep_runs_results": True})
>>> np.shape(result.expect)
(1, 25, 11)
当运行结果未保存时,期望值和状态会在所有轨迹上进行平均,而当它们被存储时,会给出一个运行列表。对于固定的输出格式,average_expect 返回平均值,而 runs_states 返回轨迹列表。当轨迹未保存时,runs_ 输出将返回 None。期望值的标准偏差也是可用的:
简化结果 |
轨迹结果 |
描述 |
|---|---|---|
|
|
在tlist的每个时间点计算的状态向量或密度矩阵 |
|
|
在tlist的最后一个时间计算的状态向量或密度矩阵 |
|
|
期望值的列表/数组,如果请求的话。 |
|
期望值的标准偏差列表/数组。 |
|
|
|
期望值的字典,如果请求了的话。 |
|
期望值的标准偏差字典。 |
多个轨迹结果也保留了轨迹的seeds,以便重新计算结果。
seeds = result.seeds
多轨迹结果特有的最后一个功能是可以用于合并轨迹集的加法操作。
>>> run1 = smesolve(H, psi, np.linspace(0, 1, 11), c_ops, e_ops=[num(N)], ntraj=25)
>>> print(run1.num_trajectories)
25
>>> run2 = smesolve(H, psi, np.linspace(0, 1, 11), c_ops, e_ops=[num(N)], ntraj=25)
>>> print(run2.num_trajectories)
25
>>> merged = run1 + run2
>>> print(merged.num_trajectories)
50
这允许在保持先前计算的同时改进统计。