fmincon:任何在中间迭代执行线性不等式约束的方法吗?

99(30天)
我是解决优化问题的内点算法fmincon。
我的参数都有上下边界和线性不等式约束。
A_ineq = [1 1 0 0 0;
1 2 1 0 0;
0 1 2 1 0;
0 0 1 2 1;
0 0 0 1 1];
b_ineq = (0 0 0 0 0);
corrse,我观察到fmincon满足边界的迭代而不是线性不等式约束。
然而,线性不等式约束是至关重要的在我的情况下。如果违反了,我优化问题不能解决。
有什么可以做,以确保在中间迭代线性不等式约束得到满足吗?
6个评论
马特·J”class=
马特·J 2023年5月6日
编辑:马特·J 2023年5月6日
我想指出违反fmincon的理论假设,也许所有的优化工具箱解决者,当你的目标函数和约束的领域并不是一个开放的子集 。如果你禁止评估外部定义的闭集你的不等式约束,这就是您正在创建的情况。它并不完全清楚危害这将创建在实践中,但它可能意味着一个全局优化工具箱解决者可能更适合。

登录置评。

接受的答案

马特·J”class=
马特·J 2023年5月5日
编辑:马特·J 2023年5月23日在29
在你的目标函数、项目当前使用quadprog x在限制区域,
有趣= @ (x) myObjective (x, A_ineq b_ineq,磅,乌兰巴托);
x = fmincon(有趣,x0,[]、[][],[],[],磅,乌兰巴托,选项)
函数fval = myObjective (x, A_ineq b_ineq,磅,乌兰巴托)
C = speye(元素个数(x));
x = lsqlin (C、x, A_ineq b_ineq,[],[],磅,乌兰巴托);%编辑:quadprog了错误
fval =
结束
29日评论
Torsten”class=
Torsten 2023年5月24日在33
假设ai * x > b_i之前调用lsqlin。调用lsqlin之后,这是约束的或不活动,或者是没有通用的声明吗?
不可能在我看来一般声明。

登录置评。

更多的答案(2)

Shubham”class=
Shubham 2023年5月5日
嗨SA-W,
是的,有几个选项你可以尝试确保满足线性不等式约束在fmincon中间内点算法的迭代:
  1. 紧公差:通过严格的公差fmincon选项,你可以迫使算法采取小步骤,收敛较慢,但精度高。这有助于确保中间迭代线性不等式约束得到满足。
  2. 使用屏障功能:你可以尝试使用障碍函数惩罚违规的线性不等式约束。可以通过添加一个任期的目标函数的增长非常大的约束违反。这将鼓励算法保持在可行域内定义的约束。
  3. 使用罚函数:类似于一个障碍函数,可以使用罚函数惩罚违规的线性不等式约束。然而,而不是非常大的增长,罚函数线性增长与违反的程度。这可能是一个比一个障碍函数计算有效的方法。
  4. 结合使用的方法:你可以使用上面的方法的组合,确保中间迭代线性不等式约束得到满足。例如,您可以收紧公差和使用罚函数或屏障功能进一步加强约束。
重要的是要注意,这些方法可能会增加计算的成本优化问题,所以重要的是要平衡精度要求和可用的资源。

马特·J”class=
马特·J 2023年5月5日
在你的目标函数,检查是否线性inequalites公司。如果他们不是,中止函数并返回 。否则,计算输出值。
有趣= @ (x) myObjective (x, A_ineq b_ineq);
x = fmincon(有趣,x0, A_ineq b_ineq,[],[],磅,乌兰巴托,[],选项)
函数fval = myObjective (x, A_ineq b_ineq)
如果~所有(A_ineq * x < = b_ineq)
fval =正;返回
结束
fval =
结束

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!