使用QuTiP绘制本征能量遇'return arrays must be of ArrayType'错误求助
QuTiP哈密顿量构建错误:"return arrays must be of ArrayType" 问题解析
错误含义
这个错误表示你构建的哈密顿量返回的对象类型不符合QuTiP的要求:QuTiP处理含时哈密顿量时,需要的是Qobj(量子算子)类型或者符合规范的含时哈密顿量列表结构,而你的代码直接用numpy数值计算,还存在语法错误,导致返回的不是合法的数组/算子类型,无法被FloquetBasis处理。
代码中的核心问题
- 哈密顿量结构完全错误:QuTiP的含时哈密顿量格式为
[静态算子项, [含时系数函数/字符串, 算子]],你直接将数值计算、字符串列表混在一起,既不是Qobj,也不符合含时哈密顿量的规范格式。 - 语法错误:
np.cos(k,[e*A/h*c, "sin({w}*t)".format(w=omega)],)是非法调用,np.cos只接受数值/数组参数,不能传入列表作为第二个参数。 - 量子算子缺失:你没有定义哈密顿量对应的量子算子(比如二能级系统的
sigmaz/sigmax),直接用标量数值无法表示量子系统的哈密顿量。
修复后的代码
假设你的哈密顿量是作用在二能级系统上的形式($H(t) = 2\tau \cos\left(\frac{eA}{hc}\sin\omega t + k\right)\sigma_z$,若实际算子是其他类型可自行替换),修复后的代码如下:
import matplotlib.pyplot as plt import numpy as np from qutip import FloquetBasis, sigmaz th = 1 e = 1.602e-19 h = 6.626e-34 c = 3e8 omega = 1.0 * 2 * np.pi T = 2 * np.pi / omega # 固定k值(若要遍历k可嵌套循环,此处先取一个示例值) k = 0.0 A_list = np.linspace(1.0 * omega, 4.5 * omega, 20) quasienergies1, quasienergies2 = [], [] for A_temp in A_list: alpha = e * A_temp / (h * c) # 正确构建含时哈密顿量:拆分cos(α sinωt + k)为cosk*cos(α sinωt) - sink*sin(α sinωt) # 用字符串形式定义含时系数,QuTiP会自动解析t变量 H_temp = [ 2 * th * np.cos(k) * sigmaz(), [2 * th * np.cos(k) * f"cos({alpha}*sin({omega}*t))", sigmaz()], [-2 * th * np.sin(k) * f"sin({alpha}*sin({omega}*t))", sigmaz()] ] # 获取准能量 floquet_basis = FloquetBasis(H_temp, T, sort=True) e1, e2 = floquet_basis.e_quasi quasienergies1.append(e1) quasienergies2.append(e2) plt.scatter(A_list / omega, quasienergies1, label="e1") plt.scatter(A_list / omega, quasienergies2, label="e2") plt.xlabel("A / ω"), plt.ylabel("准能量") plt.legend() plt.show()
关键修复说明
- 添加量子算子:使用
sigmaz()作为哈密顿量的算子部分,对应二能级系统的z方向泡利矩阵,若你的模型是其他算子(如sigmax)可替换。 - 规范含时哈密顿量格式:将三角函数拆分后,用
[含时系数字符串, 算子]的形式定义含时项,QuTiP会自动解析字符串中的t变量。 - 修正数值计算:先计算无量纲参数
alpha = eA/(hc),再代入含时系数字符串,避免语法错误。 - 类型匹配:确保所有哈密顿量项都是Qobj类型或符合规范的含时列表,符合QuTiP的输入要求。
内容的提问来源于stack exchange,提问作者strings
相关产品推荐
相关产品推荐

