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

如何解决Python中Qobj形状不兼容错误并构造指定维度的ω

Qutip哈密顿量构造中矩阵形状不匹配问题解决

问题代码

# !pip3 install qutip
import qutip as qt
import matplotlib.pyplot as plt
import numpy as np
ω = qt.Qobj(np.arange(0.0,1.1,0.1))
Δ=o=0.1
ℏ=1.05457182*10**(-34)
σx = qt.sigmax()
σy = qt.sigmay()
σz = qt.sigmaz()
H = ℏ*(Δ*σx + o*σy + ω*σz)/2
plt.plot(ω,H)
plt.show()

报错信息

TypeError: Incompatible Qobj shapes.

错误原因

你构造的ω是维度为**(11,1)的Qobj(np.arange(0.0,1.1,0.1)生成11个元素的一维数组,转成Qobj后形状为(11,1)),而Pauli矩阵σx/σy/σz是(2,2)**的二维矩阵,直接执行ω*σz会触发形状不匹配——Qutip要求矩阵乘法的维度兼容,这里需要让ω的每个元素对应一个和σz同形状的(2,2)对角矩阵,才能完成合法的乘法操作。

解决方案:构造符合形状要求的ω序列

要生成取值范围0.0到1.1(步长0.1)、每个元素都是(2,2)对角矩阵的ω序列,有两种常用实现方式:

方法1:列表推导式生成Qobj数组

# 生成11个值的列表,每个值对应一个(2,2)的对角Qobj
ω_list = [qt.Qobj(np.diag([w, w])) for w in np.arange(0.0, 1.1, 0.1)]

每个ω都是和Pauli矩阵同形状的对角矩阵,与σz相乘时自动执行标量矩阵乘法(等价于w*σz)。

方法2:numpy广播结合Qobj构造(更简洁)

如果想保留数组形式的批量操作逻辑,可通过numpy广播生成多维Qobj:

ω_vals = np.arange(0.0, 1.1, 0.1)
# 生成形状为(11,2,2)的数组,每个2x2矩阵是对角的w矩阵
ω_arr = qt.Qobj(np.tile(np.eye(2), (len(ω_vals),1,1)) * ω_vals[:, np.newaxis, np.newaxis])

修正后的完整代码

import qutip as qt
import matplotlib.pyplot as plt
import numpy as np

# 构造每个元素都是2x2对角矩阵的ω序列
ω_vals = np.arange(0.0, 1.1, 0.1)
ω_list = [qt.Qobj(np.diag([w, w])) for w in ω_vals]

Δ = o = 0.1
ℏ = 1.05457182 * 10**(-34)
σx = qt.sigmax()
σy = qt.sigmay()
σz = qt.sigmaz()

# 生成每个ω对应的哈密顿量
H_list = [ℏ*(Δ*σx + o*σy + ω*σz)/2 for ω in ω_list]

# 提取哈密顿量的本征值(基态和激发态能量)用于绘图
ground_energies = [H.eigenenergies()[0] for H in H_list]
excited_energies = [H.eigenenergies()[1] for H in H_list]

plt.plot(ω_vals, ground_energies, label='Ground State')
plt.plot(ω_vals, excited_energies, label='Excited State')
plt.xlabel('ω')
plt.ylabel('Energy')
plt.legend()
plt.show()

补充说明

原代码中plt.plot(ω,H)无法直接运行,因为H是Qobj对象列表而非数值数组,必须提取哈密顿量的数值特征(如本征值、矩阵元)才能绘制曲线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:12:43