You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QuTiP mcsolve维度不兼容TypeError问题求助

问题根源分析

错误提示的维度不兼容并非指矩阵的(4,4)这类数值维度,而是QuTiP中Qobj特有的dims属性——该属性描述希尔伯特空间的张量积分解结构:

  • 错误中的[[2, 2], [2, 2]]是L1这类算子的正确dims(对应两比特系统的张量积结构)
  • [[2, 2, 1], [2, 2, 1]]是L3的错误dims,同时初始态psi0的dims大概率为[[4], [1]],与算子的dims结构不匹配

具体问题点

  1. 初始态psi0的dims结构错误:rand_ket(dim)生成的态默认dims为[[dim], [1]](两比特时为[[4], [1]]),但算子是通过张量积构造的,dims为[[2,2],[2,2]],两者结构无法兼容。
  2. L3的构造逻辑错误:当nsite=2时,identity_nsite_3 = qeye(2**((nsite/2)-1))计算结果为qeye(1),导致L3 = tensor(identity_nsite_2, sigmap, identity_nsite_3)的dims变为[[2,2,1],[2,2,1]],与L1的[[2,2],[2,2]]结构不一致。

修复方案

1. 修正初始态psi0的dims结构

修改psi0函数,让生成的态dims匹配n比特系统的张量积结构:

from qutip import rand_ket
def psi0(n_qubits):
    """ Creates a random pure state for an n-qubit system. """
    # 指定希尔伯特空间的张量积维度结构
    dims = [[2]*n_qubits, [1]*n_qubits]
    # 创建符合dims的随机归一化态
    psi_0 = rand_ket(2**n_qubits, dims=dims)
    return psi_0

也可以手动设置dims:

psi_0 = rand_ket(dim)
psi_0.dims = [[2]*n_qubits, [1]*n_qubits]

2. 修正L3的构造(针对nsite=2的场景)

若目标是为第二个比特添加sigmap型Lindblad算子,直接构造为:

# 移除错误的identity_nsite_3定义
# identity_nsite_3 = qeye(2**((nsite/2)-1))

# 构造第二个比特的sigmap Lindblad算子
L3 = Gamma3 * tensor(qeye(2), sigmap)

修复后L3的dims会变为[[2,2],[2,2]],与L1的dims结构一致。

3. 验证所有Qobj的dims一致性

修复后可打印每个Qobj的dims属性确认:

print("H dims:", H.dims)
print("L1 dims:", L1.dims)
print("L3 dims:", L3.dims)
print("psi0 dims:", psi0.dims)

所有算子的dims应为[[2,2],[2,2]],初始态的dims应为[[2,2],[1,1]]。


修复后完整测试示例

from qutip import mcsolve, Qobj, tensor, sigmax, sigmay, qeye, rand_ket, num

# 定义两比特哈密顿量(示例)
nsite = 2
H = tensor(num(2), qeye(2)) + tensor(qeye(2), num(2)) + 0.5 * tensor(sigmax(), sigmax())

# 修正后的初始态函数
def psi0(n_qubits):
    dims = [[2]*n_qubits, [1]*n_qubits]
    return rand_ket(2**n_qubits, dims=dims)

psi_0 = psi0(nsite)

# 修正后的Lindblad算子构造
Gamma1 = 0.1
Gamma3 = 0.1
sigmap = (sigmax() + 1j * sigmay()) * 0.5

L1 = Gamma1 * tensor(sigmap, qeye(2))
L3 = Gamma3 * tensor(qeye(2), sigmap)

# 要测量的算子(示例)
op = tensor(num(2), qeye(2))

# 时间点列表(mcsolve需传入时间点列表,而非单个dt)
tlist = [0, 0.1, 0.5, 1.0]

# 运行mcsolve
mc = mcsolve(H, psi_0, tlist, [L1, L3], [op], ntraj=5)
print(mc.expect)

内容的提问来源于stack exchange,提问作者Eduardo Soares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:21:05