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

Qiskit VQC中振幅编码状态制备的Parameter参数错误求助

Qiskit参数化振幅编码 TypeError 问题解决

问题原因

直接使用qc.initialize()传入Qiskit Parameter列表时,StatePreparation模块会自动执行归一化检查(计算振幅平方和是否为1),但Parameter是符号化变量,无法计算绝对值和平方运算,因此触发TypeError: bad operand type for abs(): 'Parameter'。

解决方案

方案1:使用RawFeatureVector(推荐)

RawFeatureVector是Qiskit专门为特征向量编码设计的模块,不会提前执行归一化检查,仅在绑定参数时处理,完美支持Parameter输入。

修改你的振幅编码函数:

from qiskit.circuit.library import RawFeatureVector

def amplitude_encoding(num_qubits, x):  
    # RawFeatureVector的维度是2^num_qubits,对应16维向量→4qubit
    feature_map = RawFeatureVector(2 ** num_qubits)
    return feature_map.to_instruction()

调用方式不变,直接传入你的self.X(Parameter列表)即可。

方案2:手动构建参数化状态制备电路(需归一化约束时)

如果必须保证输入向量归一化,需要手动实现支持Parameter的振幅编码逻辑,比如用Givens旋转构建参数化电路:

from qiskit.circuit.library import GivensRotation
import numpy as np

def parameterized_amplitude_encoding(num_qubits, params):
    qc = QuantumCircuit(num_qubits, name="Param Amplitude Encoding")
    
    # 符号化归一化处理(保证后续绑定参数后向量归一)
    norm = sum(p**2 for p in params) ** 0.5
    normalized_params = [p / norm for p in params]
    
    # 用Givens旋转逐个构建状态(完整实现需遍历所有振幅对,此处为简化示例)
    for i in range(len(normalized_params)-1):
        # 计算Givens旋转角度(符号化)
        angle = 2 * np.arcsin(normalized_params[i+1])
        qc.append(GivensRotation(angle, i, i+1), [i, i+1])
    
    return qc.to_instruction()

这个方法会在符号层面保证归一化,绑定具体数值后自动满足振幅平方和为1的要求。

方案3:绕过归一化检查(不推荐)

依赖Qiskit内部实现,跳过StatePreparation的归一化检查,存在版本兼容风险:

def amplitude_encoding(num_qubits, x):  
    qc = QuantumCircuit(num_qubits,name ="Amplitude Encoding")
    init = Initialize(x)
    # 强制设置num_qubits,避免自动计算时触发检查
    init._stateprep.num_qubits = num_qubits
    qc.append(init, range(num_qubits))
    encode = qc.to_instruction()
    return encode

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:31:01