构建时间依赖系统

QobjEvo

class QobjEvo

一个用于表示时间依赖的量子对象的类,例如量子算符和状态。

重要的是,QobjEvo 实例用于表示在使用 QuTiP 求解器时的时间依赖量子对象。

一个 QobjEvo 实例可以从以下之一构建:

  • 一个可调用的 f(t: double, args: dict) -> Qobj,返回在时间 t 处的量子对象的值。

  • 一个 [Qobj, Coefficient] 对,其中 Coefficient 可以是任何 coefficient 可以接受的项(例如一个函数、一个系数的numpy数组、一个字符串表达式)。

  • 一个 Qobj(它创建了一个常量 QobjEvo 项)。

  • 一个可调用对象、对或Qobj的列表。

  • 一个 QobjEvo(在这种情况下会创建一个副本,所有其他参数都会被忽略,除了 args,如果传递了,它将替换现有的参数)。

Parameters:
Q_objectcallable, list or Qobj

时间依赖量子对象的规范。请参阅上文的完整描述和下面的示例部分以获取示例。

argsdict, optional

一个包含系数参数的字典。 如果没有需要参数的函数或字符串系数存在,则可以省略参数。

tlistarray-like, optional

与作为numpy数组提供的系数值对应的时间列表。如果没有作为numpy数组提供系数,tlist可以省略,否则它是必需的。

tlist 中的时间不需要等距,但必须排序。

默认情况下,将使用三次样条插值来在时间t处插值(numpy数组)系数的值。如果系数被视为阶跃函数,请传递参数order=0(见下文)。

orderint, default=3

用于在时间t插值(numpy数组)系数值的样条插值的顺序。 0 使用前一个或左侧的值。

copybool, default=True

是否复制在Q_object参数中提供的Qobj实例。

compressbool, default=True

是否在实例创建后压缩QobjEvo实例的项。

这将单个项中的常数项相加,并将具有相同Qobj[Qobj, coefficient]对组合成一个包含系数总和的单一对。

参见 compress

function_style{None, “pythonic”, “dict”, “auto”}

Q_object 中可调用对象使用的函数签名风格。 如果风格是 None,则使用 qutip.settings.core["function_coefficient_style"] 的值。否则,提供的值将覆盖全局设置。

boundary_conditions2-Tuple, str or None, optional

样条评估的边界条件。默认值为None。 对应于scipy.interpolate.make_interp_spline的bc_type。 详情请参阅Scipy的文档: https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.make_interp_spline.html

Attributes:
dimslist

跟踪张量结构的维度列表。

shape(int, int)

跟踪张量结构的维度列表。

typestr

量子对象的类型:'bra'、'ket'、'oper'、'operator-ket'、'operator-bra' 或 'super'。

superrepstr

如果type是‘super’时使用的表示形式。可以是‘super’(Liouville形式)或‘choi’(迹为维度的Choi矩阵)。

示例

一个从函数构造的 QobjEvo

def f(t, args):
    return qutip.qeye(N) * np.exp(args['w'] * t)

QobjEvo(f, args={'w': 1j})

对于基于列表的QobjEvo,列表必须由Qobj[Qobj, Coefficient]对组成:

QobjEvo([H0, [H1, coeff1], [H2, coeff2]], args=args)

系数可以使用Coefficient对象指定,也可以通过函数、字符串、numpy数组或任何可以传递给coefficient函数的对象指定。有关完整描述,请参阅coefficient的文档。

一个由函数指定的系数的示例:

def f1_t(t, args):
    return np.exp(-1j * t * args["w1"])

QobjEvo([[H1, f1_t]], args={"w1": 1.})

以及由字符串表达式指定的系数:

H = QobjEvo(
    [H0, [H1, 'exp(-1j*w1*t)'], [H2, 'cos(w2*t)']],
    args={"w1": 1., "w2": 2.}
)

系数也可以表示为numpy数组,给出系数值的列表:

tlist = np.logspace(-5, 0, 100)
H = QobjEvo(
    [H0, [H1, np.exp(-1j * tlist)], [H2, np.cos(2. * tlist)]],
    tlist=tlist
)

系数数组的长度必须与tlist相同。

一个 QobjEvo 也可以通过简单的算术操作来构建,将 QobjCoefficient 结合,例如:

coeff = qutip.coefficient("exp(-1j*w1*t)", args={"w1": 1})
qevo = H0 + H1 * coeff
__call__()

获取在 t 时刻的 Qobj

Parameters:
tfloat

评估QobjEvo的时间。

_argsdict [optional]

新参数作为一个字典。使用arguments(new_args)更新参数。

**kwargs

新的参数作为关键字。使用 arguments(**new_args) 更新参数。

注释

如果位置参数 _args 和关键字参数都传递了新值,那么两者都会被使用。如果一个键同时存在于两者中,_args 字典中的值将优先。

arguments(_args=None, **kwargs)

更新参数。

Parameters:
_argsdict [optional]

新参数作为一个字典。使用arguments(new_args)更新参数。

**kwargs

新的参数作为关键字。使用 arguments(**new_args) 更新参数。

注释

如果位置参数 _args 和关键字参数都传递了新值,那么两者都会被使用。如果一个键同时存在于两者中,_args 字典中的值将优先。

compress()

QobjEvo组件中寻找冗余:

常量部分(没有CoefficientQobj)将被求和。 具有相同Qobj的对[Qobj, Coefficient]将被合并。

示例: [[sigmax(), f1], [sigmax(), f2]] -> [[sigmax(), f1+f2]]

QobjEvo 被原地转换。

Returns:
None
conj()

获取量子对象的逐元素共轭。

copy()

返回此QobjEvo的副本

dag()

获取量子对象的埃尔米特伴随。

dtype

QobjEvo 数据层的类型。 当使用不同的数据层时,我们返回各部分之和的类型。

expect(t, state, check_real=True)

在时间 t 时,此算符的期望值与状态。

Parameters:
tfloat

操作员应用的时间。

stateQobj

乘积的右侧矩阵

check_realbool (True)

当虚部小于实部的一个因子settings.core['rtol']时,是否将结果转换为real

Returns:
expectfloat or complex

state.adjoint() @ self @ state 如果 state 是一个 ket。 trace(self @ matrix) 如果 state 是一个算子或算子-ket。

expect_data(t, state)

期望值定义为 state.adjoint() @ self @ state 如果 state 是一个向量,或者 state 是一个算符且 self 是一个 超算符。如果 state 是一个算符且 self 是一个 算符,则期望值为 trace(self @ matrix)

isbra

指示系统是否表示一个bra状态。

isconstant

系统是否会根据 t 变化

isket

指示系统是否表示一个ket状态。

isoper

指示系统是否表示一个操作符。

isoperbra

指示系统是否表示一个操作符-左矢状态。

isoperket

指示系统是否表示一个算子-态状态。

issuper

指示系统是否表示一个超级操作符。

linear_map(op_mapping, *, _skip_check=False)

将映射应用于每个Qobj贡献。

示例

QobjEvo([sigmax(), coeff]).linear_map(spre)

给出相同的结果

QobjEvo([spre(sigmax()), coeff])

Parameters:
op_mapping: callable

应用于每个元素的函数。

Returns:
QobjEvo

修改后的对象

注释

不修改系数,因此 linear_map(conj) 不会给出 QobjEvo 的共轭。它仅适用于线性变换。

matmul(t, state)

该操作符在时间 t 对状态的作用。 self(t) @ state

Parameters:
tfloat

操作员应用的时间。

stateQobj

乘积的右侧矩阵

Returns:
productQobj

结果产品作为 Qobj

matmul_data(t, state, out=None)

计算 out += self(t) @ state

num_elements

组成系统的部件数量

tidyup(atol=1e-12)

从量子对象中移除小元素。

to(data_type)

将所有组件的基础数据存储转换为所需的存储表示形式。

可用的不同存储表示是“数据层类型”。默认情况下,这些是DenseDiaCSR,它们分别构建一个密集矩阵、对角稀疏矩阵和一个压缩稀疏行矩阵。

QobjEvo 被原地转换。

Parameters:
data_typetype

Qobj的数据应转换的数据层类型。

Returns:
None
to_list()

将QobjEvo恢复到列表形式。

Returns:
list_qevo: list

QobjEvo 作为一个列表,元素要么是 Qobj 用于 常量部分,[Qobj, Coefficient] 用于基于系数的项。 Coefficient 的原始格式不会被恢复。 最后,如果原始的 QobjEvo 是用一个 返回 Qobj 的函数构造的,该项将作为原始函数和参数(dict)的配对返回。

trans()

量子对象的转置

系数

coefficient(
base: CoefficientLike,
*,
tlist: ArrayLike = None,
args: dict = {},
args_ctypes: dict = {},
order: int = 3,
compile_opt: dict = None,
function_style: str = None,
boundary_conditions: tuple | str = None,
**kwargs,
)[source]

构建时间依赖系统的Coefficient

` QobjEvo = Qobj + Qobj * Coefficient + Qobj * Coefficient + ... `

系数可以是一个函数、字符串或numpy数组。其他包可能会添加对其他类型系数的支持。

对于基于函数的系数,函数签名必须是以下之一:

  • f(t, ...) 其中其他参数作为普通的“pythonic”参数提供(例如 f(t, w, a=5)

  • f(t, args) 其中参数在一个名为 args 的“字典”中提供

默认情况下,签名样式由qutip.settings.core["function_coefficient_style"]设置控制,但可以通过指定function_style="pythonic"function_style="dict"来覆盖。

示例:

  • Python风格的函数签名:

    def f1_t(t, w):
        return np.exp(-1j * t * w)
    
    coeff1 = coefficient(f1_t, args={"w": 1.})
    
  • 字典风格函数签名:

    def f2_t(t, args):
        return np.exp(-1j * t * args["w"])
    
    coeff2 = coefficient(f2_t, args={"w": 1.})
    

对于基于字符串的系数,字符串必须是可编译的Python代码,结果为一个复数。定义了以下符号:

sin, cos, tan, asin, acos, atan, pi, sinh, cosh, tanh, asinh, acosh, atanh, exp, log, log10, erf, zerf, sqrt, real, imag, conj, abs, norm, arg, proj, numpy as np, scipy.special as spe (python 接口) 和 cython_special (scipy cython 接口)

示例:

coeff = coefficient('exp(-1j*w1*t)', args={"w1":1.})

在编译时,字符串系数需要‘args’。 它是一个(名称:对象)的字典。键必须是有效的变量字符串。

编译选项可以作为“compile_opt=CompilationOptions(…)”传递。

对于numpy数组格式,数组必须是一个1d的dtype float或complex。 一个时间列表(float64),必须给出系数的时间点(tlist)。 系数数组的长度必须与tlist相同。 tlist中的时间点不需要等距,但必须排序。 默认情况下,将使用三次样条插值来计算时间t处的系数。关键字order设置插值的阶数。当order = 0时,插值是一个阶跃函数,其值为最近的值。

示例:

tlist = np.logspace(-5,0,100)
H = QobjEvo(np.exp(-1j*tlist), tlist=tlist)

scipy.interpolateCubicSplinePPolyBspline 也被转换为插值系数(与从 ndarray 创建的相同类型的系数)。来自 scipy 的其他插值方法被转换为基于函数的系数(与从可调用对象创建的相同类型的系数)。

Parameters:
baseobject

将基础对象转换为系数。

argsdict, optional

传递给函数或字符串系数的参数字典。

orderint, default=3

基于数组系数的样条顺序。

tlistiterable, optional

基于系数的数组每个元素的时间。

function_stylestr {“dict”, “pythonic”, None}, optional

基于系数的函数签名。

args_ctypesdict, optional

编译基于数组的系数时,args的C类型。

compile_optCompilationOptions, optional

用于编译基于字符串的系数的选项集。

boundary_conditions: 2-tupule, str or None, optional

为样条插值指定边界条件。

**kwargs

传递给系数的额外参数。

编译选项

class CompilationOptions(**options)[source]

控制基于字符串的系数编译为Cython的选项。

这些选项可以全局设置:

settings.compile["compiler_flags"] = "-O1"

在一个with块中:

with CompilationOptions(use_cython=False):

或者作为一个实例:

coefficient(coeff, compile_opt=CompilationOptions(recompile=True))

编译选项:

use_cython: bool

是否将字符串编译为cython代码或使用python的exec

recompilebool

不要使用之前制作的文件,而是构建一个新的文件。

try_parse: bool [True]

是否尝试解析字符串以进行重用和静态类型检查。

static_typesbool [True]

是否对常量和参数使用C类型。

accept_intNone, bool

是否使用类型 int 作为整数常量和参数,或者将其升级为 floatcomplex。 如果为 None,则仅在代码中找到订阅时使用 int

accept_floatbool

是否使用类型 float 或将它们升级为 complex

compiler_flagsstr

传递给编译器的标志,例如:“-Wall -O3”… 与您的编译器和操作系统不匹配的标志可能导致编译失败。 当尝试确定字符串模式是否之前被使用时,请使用“recompile=True”。

link_flagsstr

链接到传递给编译器的库。它们不能用于向字符串系数添加功能。

extra_importstr

在文件头部添加的Cython代码。可用于添加额外的导入或cimport代码,例如: extra_import=”from scipy.linalg import det” extra_import=”from qutip.core.data cimport CSR”

clean_on_errorbool [True]

当编写一个无法导入的cython文件时,请删除它。

build_dir: str [None]

cythonize的构建目录。