CVXPY无显式严格不等式却触发"Strict inequalities are not allowed"报错求助
解决CVXPY与Scipy norm.logcdf的严格不等式冲突问题
你碰到的这个报错本质不是你自己写了严格不等式,而是Scipy的norm.logcdf无法处理CVXPY的符号表达式——当你把A @ a(这是CVXPY的Expression对象,不是数值数组)传给Scipy的函数时,Scipy内部会尝试对这个表达式做数值比较(比如报错栈里看到的(a < x) & (x < b)),而CVXPY禁止在符号表达式中使用严格不等式(</>),所以触发了这个错误。
解决方法:用CVXPY原生函数替代Scipy的数值函数
CVXPY提供了专门用于符号表达式的正态CDF函数cp.normcdf,我们可以用它来构建等价的目标函数,完全避开Scipy的冲突。
具体来说,Scipy的norm.logcdf(x, scale=sigma)等价于log(Φ(x/sigma))(其中Φ是标准正态分布的CDF),而CVXPY的cp.normcdf(z)就是实现了Φ(z),所以我们可以把目标函数改写成CVXPY支持的形式:
修改后的完整代码
import cvxpy as cp import numpy as np # 替换成你实际的A矩阵和sigma标量 A = np.random.randn(5, 10) # 示例矩阵 sigma = 1.0 # 示例标量 a = cp.Variable([10, 1]) # 用CVXPY原生函数构建目标函数,替代Scipy的norm.logcdf obj = cp.Maximize(cp.sum(cp.log(cp.normcdf((A @ a) / sigma)))) constraints = [a >= np.zeros([10, 1]), a <= np.ones([10, 1])] prob = cp.Problem(objective=obj, constraints=constraints) prob.solve() # 查看结果 print("最优解a:\n", a.value) print("最优目标值:", prob.value)
关键说明
- 为什么这样可行?
cp.normcdf是CVXPY原生的原子函数,专门为符号表达式设计,内部不会使用严格不等式,完全符合CVXPY的优化规则。log(Φ(z))是凹函数,最大化凹函数等价于最小化凸函数,属于CVXPY可以处理的凸优化问题范畴。
- 注意事项
- 确保
sigma是正的标量(你已经说明是特定标量,所以没问题);如果sigma是变量,建议添加约束sigma >= 1e-6(用非严格不等式避免数值问题)。
- 确保
内容的提问来源于stack exchange,提问作者JackAu
相关产品推荐
相关产品推荐

