量子叠加态代码实参运行正常,复参出现异常问题求助
问题分析与修复方案
问题根源
你的代码在复数参数下异常的核心原因有两个:
参数逻辑不匹配
函数参数percentage被定义为float,但你传入了复数50j,类型冲突的同时,“百分比”这个概念本身不适用于复数——量子叠加态中是振幅的模平方对应概率,而非直接用复数表示百分比。归一化逻辑错误
量子态要求系数的模平方和为1,但你当前用q = sqrt(1 - p*p)计算第二个系数:- 当
p是复数时,p*p是复数的平方(而非模的平方),导致1 - p*p可能是负数或非实数,开根号后得到的q无法满足归一化条件,最终输出异常值。
- 当
修正后的代码
import numpy as np from cmath import sqrt from typing import Tuple, Union # 标准基 |0>, |1>(Z轴) zero_qubit = np.matrix([[1.+0.j], [0.+0.j]]) one_qubit = np.matrix([[0.+0.j], [1.+0.j]]) standard_basis: Tuple[np.matrix] = (zero_qubit, one_qubit) def superposition( amplitude: Union[float, complex] = 1.0, basis: Tuple[np.matrix] = (zero_qubit, one_qubit)): # 计算振幅的模平方,确保满足归一化前提 p_mod_sq = amplitude.conjugate() * amplitude if p_mod_sq > 1.0: raise ValueError("振幅的模平方不能大于1,否则无法构建合法量子态") # 计算第二个系数的模,相位默认取0(可按需添加相位,比如 q = q_mod * np.exp(1j * theta)) q_mod = sqrt(1 - p_mod_sq) q = q_mod q1 = amplitude * basis[0] + q * basis[1] q2 = amplitude * basis[0] - q * basis[1] q3 = -amplitude * basis[0] + q * basis[1] q4 = -amplitude * basis[0] - q * basis[1] return q1, q2, q3, q4 # 实数振幅测试(对应原50%概率,振幅为sqrt(0.5)) print("实数振幅输出:") q1,q2,q3,q4 = superposition(sqrt(0.5), standard_basis) print(q1) print(q2) print(q3) print(q4) # 复数振幅测试(示例振幅:0.5+0.5j,模平方为0.5,对应50%概率) print("\n复数振幅输出:") q1,q2,q3,q4 = superposition(0.5 + 0.5j, standard_basis) print(q1) print(q2) print(q3) print(q4)
关键调整说明
- 将参数从
percentage改为amplitude,直接接收复数振幅,符合量子力学中叠加态的定义逻辑。 - 用
amplitude.conjugate() * amplitude计算模平方,确保归一化条件|p|² + |q|² = 1成立。 - 支持实数和复数输入,添加了参数合法性检查,避免非法输入导致错误。
- 保留了你原有的四种符号组合的叠加态计算逻辑。
内容的提问来源于stack exchange,提问作者Sourcerer
相关产品推荐
相关产品推荐

