Julia 为什么IPOPT在违反约束的情况下评估目标函数?

Julia 为什么IPOPT在违反约束的情况下评估目标函数?,julia,mathematical-optimization,non-linear-regression,ipopt,Julia,Mathematical Optimization,Non Linear Regression,Ipopt,我在朱莉娅体内使用IPOPT。我的目标函数将为某些参数值抛出一个错误(具体来说,尽管我假设这无关紧要,但它涉及协方差矩阵的Cholesky分解,因此要求协方差矩阵是正定的)。因此,我非线性约束参数,使其不会产生错误。尽管有这个限制,IPOPT仍然坚持在参数上评估目标函数,这会导致我的目标函数抛出错误。这导致我的脚本崩溃,导致痛苦和痛苦 我感兴趣的是,通常,IPOPT为什么会在违反约束的参数下对函数进行求值。(我已经确保它确实在评估函数之前检查了约束。)如果可能的话,我想知道如何阻止它这样做 我已

我在朱莉娅体内使用IPOPT。我的目标函数将为某些参数值抛出一个错误(具体来说,尽管我假设这无关紧要,但它涉及协方差矩阵的Cholesky分解,因此要求协方差矩阵是正定的)。因此,我非线性约束参数,使其不会产生错误。尽管有这个限制,IPOPT仍然坚持在参数上评估目标函数,这会导致我的目标函数抛出错误。这导致我的脚本崩溃,导致痛苦和痛苦

我感兴趣的是,通常,IPOPT为什么会在违反约束的参数下对函数进行求值。(我已经确保它确实在评估函数之前检查了约束。)如果可能的话,我想知道如何阻止它这样做

我已将IPOPT的“bound_relax_factor”参数设置为零;这没用。我知道我可以要求目标函数返回
NaN
,而不是抛出一个错误,但当我这样做时,IPOPT似乎变得更加混乱,并且不会收敛。可怜的家伙

如果有帮助的话,我很乐意提供一些示例代码

非常感谢:):)

编辑:

一位评论员建议我要求我的目标函数在违反约束时返回一个错误的目标值。不幸的是,当我这样做时会发生这种情况:

我不确定为什么Ipopt会从2.0016x10^2的评估点变成10^10的评估点——我担心Ipopt有一些非常基本的东西我不理解


将“constr_viol_tol”和“acceptable_constr_viol_tol”设置为其最小值不会明显影响优化,也不会“过度约束”我的参数(即确保它们不能接近不可接受的值).Ipopt在所有中间迭代中保证满足的唯一约束是变量的简单上界和下界。任何其他线性或非线性等式或不等式约束都不一定满足,直到解算器在最终迭代中完成收敛(如果它可以到达满足终止条件的点)。在存在任意非凸等式和不等式约束的情况下,保证中间迭代始终是可行的是不可处理的。牛顿步长方向基于局部一阶和二阶导数信息,因此是近似值,如果问题具有非平凡曲率,则可能会留下可行点空间。以
x*y==constant
的点空间为例

您应该重新制定您的问题,以避免需要在无效点评估目标或约束函数。例如,不要对由数据构造的协方差矩阵进行Cholesky分解,而是引入单位下三角矩阵
L
和对角矩阵
D
。对1:size(D,1)中的所有
i施加下限约束
D[i,i]>=0
,非线性等式约束
L*D*L'==A
,其中
A
是协方差矩阵。然后在需要对Cholesky分解进行操作的任何地方使用
L*sqrtm(D)
(这可能是一种半定分解,因此比经典的严格正定
L*L'
分解更像是一种修改的Cholesky表示)


请注意,如果您的问题是凸的,则可能存在一种特殊的公式,即圆锥曲线解算器在求解时比像Ipopt这样的通用非线性解算器更有效。

也许(作为面片解)而不是
NaN
在违反约束时只返回一个相当糟糕的目标值,更好的是,随着违规行为的增加,情况会变得更糟。此外,IPOPT参数
constr\u viol\u tol
acceptable\u constr\u viol\u tol
可能具有相关性。感谢您在@DanGetz发表的评论——我在对我原始问题的编辑中做出了回应:)也许模型中的约束没有指定所需的区域?这将导致评价职能出现问题。在任何情况下,也许添加一个单位矩阵乘以最负特征值的大小(强制正定)将允许目标评估平稳地跨越约束限制(诚然,这有点像猜测)。