如何批量调用QuTip的coherent_dm函数解决多输入维度不匹配问题
QuTip 批量生成多alpha值相干态密度矩阵的实现方案
报错原因
QuTip 内置 coherent_dm 函数的 alpha 参数仅支持单个标量复数输入,未兼容数组形式的批量传参。直接将100个元素的复数序列作为alpha实参传入时,函数内部按标量输入设计的矩阵构造逻辑会因输入维度超出预期,触发维度不匹配报错。
可行实现方法
方法1:逐值循环遍历(通用适配、无额外依赖)
该方法逻辑直接、兼容性最强,适合小批量计算场景,步骤如下:
- 导入依赖并提前生成目标复数序列:
import numpy as np from qutip import coherent_dm # 按需求生成c值序列 t = np.linspace(0, 2*np.pi, 100) c = 2*np.exp(-t*1j) + 0.1*10*(1 - np.exp(-t*1j))
- 遍历每个c值,逐次计算对应的相干态密度矩阵,存入结果列表:
# 固定截断维数N=10,初始化结果存储列表 N = 10 dm_results = [] for alpha_scalar in c: dm = coherent_dm(N=N, alpha=alpha_scalar, offset=0, method='operator') dm_results.append(dm)
最终得到的dm_results长度为100,每个元素对应一个c值生成的Qobj类型密度矩阵,和预期输出完全匹配。也可以用列表推导式简化循环写法,效果完全一致:
dm_results = [coherent_dm(N=10, alpha=alpha_val, offset=0, method='operator') for alpha_val in c]
方法2:向量化预计算(适合大规模c序列加速)
如果后续c序列规模扩大到数千、上万个值,纯Python循环的函数调用开销会明显拖慢计算速度,可基于相干态密度矩阵的解析公式做向量化批量计算,一次性生成所有矩阵元素:
相干态密度矩阵的矩阵元存在解析关系:<i|rho_alpha|j> = exp(-|α|²) * α^i * (α*)^j / sqrt(i! * j!),不依赖QuTip内部的逐次算符运算即可批量计算。
- 提前预计算固定截断维数N下的所有阶乘项,构造适配所有c值的张量存储矩阵元:
import numpy as np from qutip import Qobj import math t = np.linspace(0, 2*np.pi, 100) c = 2*np.exp(-t*1j) + 0.1*10*(1 - np.exp(-t*1j)) N = 10 n_c = len(c) # 初始化复数张量,形状为(100, N, N),对应100个N*N维密度矩阵 dm_tensor = np.zeros((n_c, N, N), dtype=np.complex128) # 预计算阶乘值避免重复计算 factorials = [math.factorial(i) for i in range(N)] abs_c_sq = np.abs(c)**2 c_conj = np.conj(c) # 向量化计算所有矩阵元 for i in range(N): for j in range(N): dm_tensor[:, i, j] = np.exp(-abs_c_sq) * (c**i) * (c_conj**j) / np.sqrt(factorials[i] * factorials[j]) # 将numpy张量转回QuTip支持的Qobj格式列表 dm_results = [Qobj(dm_tensor[k]) for k in range(n_c)]
该方法的计算效率比逐次循环调用coherent_dm高1~2个数量级,适合大规模参数扫描类任务。
内容的提问来源于stack exchange,提问作者Bruno Piveta
相关产品推荐
相关产品推荐

