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

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分解逻辑对这种数值误差非常敏感,导致分解失败;打印后重新输入的矩阵经过精度截断,误差被消除,满足了幺正性的数值要求,因此可以正常处理。

解决方法

  1. 修正矩阵的幺正性
    通过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接口。

  2. 检查自研算法的数值稳定性
    排查生成幺正矩阵的计算流程,是否存在不必要的浮点运算累积,比如多次矩阵乘法、开方等操作,可以通过调整计算顺序、使用更高精度的浮点类型(比如np.float128)来减少误差。

  3. 手动控制打印精度后转换(不推荐)
    如果想模拟打印的效果,可以用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:52:17