Qiskit unitary接口报错TwoQubitWeylDecomposition:failed to diagonalize M2求助
Qiskit
qiskit.unitary 接口幺正矩阵传入异常问题排查 问题复现
使用Qiskit的qiskit.unitary接口将幺正矩阵转换为可在量子硬件、模拟器或FakeHW上运行的量子电路,并与自研算法生成的电路级联。遇到以下异常:
- 直接传入代码计算得到的幺正矩阵时,触发错误:
TwoQubitWeylDecomposition:failed to diagonalize M2 - 将矩阵通过
np.set_printoptions(threshold=sys.maxsize, linewidth=2000)打印后,再把打印结果重新传入接口,运行完全正常 - 仅特定矩阵会出现该问题
核心原因
打印操作本质上对矩阵的浮点数元素做了精度截断/格式化——尽管你设置了threshold和linewidth,numpy打印浮点数时默认仍会保留有限精度(默认8位),会自动抹平计算过程中产生的极小数值误差。
你的原始矩阵可能因为自研算法的浮点运算累积误差,存在极其微小的非幺正性(比如元素模平方和偏离1、矩阵共轭转置与自身乘积不是严格单位矩阵),而Qiskit的TwoQubitWeylDecomposition分解逻辑对这种数值误差非常敏感,导致分解失败;打印后重新输入的矩阵经过精度截断,误差被消除,满足了幺正性的数值要求,因此可以正常处理。
解决方法
修正矩阵的幺正性
通过SVD分解重新构造严格幺正的矩阵,抹平数值误差,示例代码:import numpy as np from scipy.linalg import svd def enforce_unitary(matrix): U, _, Vh = svd(matrix) return U @ Vh将自研算法输出的矩阵先传入
enforce_unitary处理,再传给qiskit.unitary接口。检查自研算法的数值稳定性
排查生成幺正矩阵的计算流程,是否存在不必要的浮点运算累积,比如多次矩阵乘法、开方等操作,可以通过调整计算顺序、使用更高精度的浮点类型(比如np.float128)来减少误差。手动控制打印精度后转换(不推荐)
如果想模拟打印的效果,可以用np.array2string指定精度后再转回矩阵,但这种方法依赖字符串解析,可靠性低于直接修正幺正性:import numpy as np mat = 你的原始矩阵 # 指定足够高的精度,避免有效位数丢失 mat_str = np.array2string(mat, precision=15, suppress_small=True) fixed_mat = eval(mat_str)
内容的提问来源于stack exchange,提问作者mchaudh4
相关产品推荐
相关产品推荐

