如何解决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
相关产品推荐
相关产品推荐

