使用np.linalg.norm计算二次成本报错,AddQuadraticErrorCost运行正常的原因
问题原因解答
你提到的两个表达式数学上完全等价,报错的核心原因是优化库的符号计算引擎不会自动做带定义域限制的代数化简,无法识别np.linalg.norm(x)**2对应的多项式结构。
具体差异说明
- 第一种写法
prog.AddQuadraticErrorCost(np.identity(len(q)), q0, q)是优化库内置的二次成本专用接口,内部会直接构造(q - q0)^T W (q - q0)的标准二次多项式表达式,完全符合多项式成本的解析要求,因此可以正常运行。 - 第二种写法
prog.AddCost(np.linalg.norm(q_variables - q_nominal)**2)触发报错的原因是:np.linalg.norm作用于符号变量时,会先生成sqrt(各分量平方和)的符号表达式,再和外层的平方运算结合,最终提交给解析器的表达式为pow(sqrt(平方和),2)- 符号计算引擎不会默认执行
sqrt(x)^2 = x的化简:该等式仅在x≥0时成立,引擎不会主动添加这个定义域假设,因此会保留完整的sqrt+平方结构 - 优化器的成本解析逻辑要求输入为多项式表达式,
sqrt属于非多项式运算节点,因此直接触发你看到的报错
可行替代方案
- 优先使用内置的
AddQuadraticErrorCost接口,是性能和兼容性最好的选择 - 若需要手动构造成本表达式,直接写平方和形式即可避免报错:
diff = q_variables - q_nominal prog.AddCost(diff.dot(diff))
内容的提问来源于stack exchange,提问作者user3180
相关产品推荐
相关产品推荐

