首页 > 解决方案 > scipy 优化 trust-constr 违反线性约束

问题描述

我正在尝试使用 scipy.optimize.minimize 和方法 trust-constr 来优化 8 个变量的函数。不幸的是,该功能太复杂,无法在此处完整发布;它涉及大约 1000 个术语,每个术语都涉及一个积分。但这里有一段我​​认为已经表明它不能按预期工作的摘录。

def objective(variables):
    starts_neg=variables[0]
    starts_neu=variables[1]
    etc
    return _____

(这是导致问题的两个变量)

定义了目标函数后,我需要定义约束。共有 12 个约束,涉及 8 个变量;但我只会展示那些涉及有问题的变量。

constraint_matrix=[[0 for j in range(8)] for i in range(12)]
constraint_matrix[0][0]=1
constraint_matrix[1][1]=1
constraint_matrix[2][0]=1
constraint_matrix[2][1]=1
etc
lower_bounds=[10**(-12) for i in range(12)]
upper_bounds=[1 for i in range(12)]
prob_constraints=LinearConstraint(constraint_matrix,lower_bounds,upper_bounds,keep_feasible=True)

我的意图是说 0 < starts_neg < 1, 0 < starts_neu < 1, 0 < start_neg + starts_neu < 1。下界从 0 更改为 10^-12 以避免 nan 错误,因为目标函数涉及采用变量的日志。

然后我给 scipy 一个初始估计 x0=[estimate,estimate,etc.]

最后,调用优化如下:

result=minimize(objective,x0,method='trust-constr',constraints=[prob_constraints],options={'xtol':10**(-9)}).x

不幸的是,这产生了一个 nan 错误。所以我尝试在目标函数中插入以下内容并再次运行:

if starts_neg<=0 or starts_neg>=1 or starts_neu<=0 or starts_neu>=1 or starts_neu+starts_neg>=1:
    print(starts_neg,starts_neu)

-0.02436406136453448 0.7588112085953852在 nan 错误和回溯之前输出,这似乎是一个太大的约束违规,无法用舍入误差来解释。不,这不是最初的估计 x0;我也检查过。

很明显 scipy 违反了我的限制之一,尽管我的设置keep_feasible=True。我是不是设置错了?抱歉,功能太长,无法完整包含。

标签: constraintsscipy-optimize

解决方案


推荐阅读