主要内容

通过可行性模式获取解决方案

这个例子展示了如何使用的可行性模式fmincon“内点”算法求可行点。为了利用自动区分,该示例使用了基于问题的方法。例子来自Moré的第9题[1]

问题的设置

这个问题有一个5维优化变量x还有五个二次约束。第一个x组件的下界为0,其余四个组件的上界为0。

x = optimvar (“x”5,“下界”,(0;负负无穷,无穷;负),“UpperBound”, (Inf, 0, 0, 0, 0));

这个问题来自于飞机工业,用航空术语来表示部件x并指定了一些参数的值。

电梯= 0.1;如果电梯是0,那么[0 0 0 0]将是一个解副翼= 0.0;rudderdf = 0.0;rollrate = x (1);pitchrat = x (2);yawrate = x (3);attckang = x (4);sslipang = x (5);

创建一个优化问题和约束条件。

概率= optimproblem;prob.Constraints。Eq1 = (-3.933*rollrate + 0.107*pitchrat +...0.126*横转- 9.99*横转- 45.83*副翼- 7.64*方向舵-...0.727*pitchrat* ywrate + 8.39* ywrate *attckang -...684.4*attckang*sslipang + 63.5*pitchrat*attckang) == 0;prob.Constraints。Eq2 = (-0.987*pitchrat - 22.95*attckang - ....28.37*电梯+ 0.949*横摇率*横摇率+ 0.173*横摇率*横摇)== 0;prob.Constraints。Eq3 =(0.002*滚动速率- 0.235*雅转速+...5.67*舷窗- 0.921*副翼- 6.51*舵面-...0.716*rollrate*pitchrat - 1.578*rollrate*attckang +...1.132 * pitchrat * attckang) = = 0;prob.Constraints。(pitchrat - attckang -...1.168*电梯- rollrate* slsliang) == 0;prob.Constraints。Eq5 = (- ywrate - 0.196*sslipang - ....0.0071*副翼+滚转率*攻击)== 0;

这个问题没有目标函数,所以不具体说明概率。客观的

没有可行性模式的尝试解

尝试使用默认的求解器和参数从这个点开始解决问题[0 0 0 0 0]'

x0。x= zeros(5,1); [sol,~,exitflag,output] = solve(prob,x0)
使用fmincon解决问题。解算器过早地停止。Fmincon停止,因为它超过了迭代限制,选项。MaxIterations = 1.000000 e + 03。
索尔=结构体字段:x1双x: [5]
exitflag = SolverLimitExceeded
输出=结构体字段:迭代:1000 funcCount: 1003 constrountion: 11.1712 stepsize: 8.2265e-05算法:' inner -point' firstorderopt: 0 cgiterations: 0消息:'求解器过早停止....' best可行性:[]objectivederivative: "closed-form" constraintderivative: "closed-form" solver: 'fmincon'

求解器提前停止。增加迭代极限和函数求值极限,然后重试。

选择= optimoptions (“fmincon”“MaxIterations”1 e4,“MaxFunctionEvaluations”1 e4);[溶胶,~,exitflag、输出]=解决(x0,概率“选项”选项)
使用fmincon解决问题。收敛到一个不可行的点。Fmincon停止,因为当前步长小于步长公差的值,但约束不满足约束公差的值。考虑启用内点方法可行性模式。
索尔=结构体字段:x1双x: [5]
exitflag = NoFeasiblePointFound
输出=结构体字段:迭代:4089 funcCount: 4092 constrbreach: 5.0899 stepsize: 5.9783e-11算法:' internal -point' firstorderopt: 0 cgiterations: 0 message: '收敛到一个不可行点....' best可行性:[]objectivederivative: "closed-form" constraintderivative: "closed-form" solver: 'fmincon'

求解器收敛到一个不可行的点。

采用可行性模型求解

再次尝试解决该问题,这次指定EnableFeasibilityMode而且SubproblemAlgorithm选项。一般情况下,如果需要使用可行性模式,最好的方法是设置SubproblemAlgorithm选项“重心”

选择= optimoptions(选项,“EnableFeasibilityMode”,真的,...“SubproblemAlgorithm”“重心”);[溶胶,~,exitflag、输出]=解决(x0,概率“选项”选项)
使用fmincon解决问题。找到了满足约束条件的局部极小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
索尔=结构体字段:x1双x: [5]
exitflag = OptimalSolution
输出=结构体字段:迭代:138 funcCount: 139 constr违规:2.9070e-04 stepsize: 0.0057算法:' internal -point' firstorderopt: 0 cgiterations: 0 message: '找到满足约束的局部最小值....' best可行性:[]objectivederivative: "closed-form" constraintderivative: "closed-form" solver: 'fmincon'

这一次,求解器报告它达到了一个可行的解。然而,约束违反output.constrviolation不是很小。收紧约束公差,重新求解。为了加快求解过程,从返回的可行解开始。

选项。ConstraintTolerance = 1 e-8;[溶胶,~,exitflag、输出]=解决(概率,溶胶,“选项”选项)
使用fmincon解决问题。找到了满足约束条件的局部极小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。
索尔=结构体字段:x1双x: [5]
exitflag = OptimalSolution
输出=结构体字段:迭代:2 funcCount: 3 constrbreach: 2.1164e-16 stepsize: 1.7083e-08算法:' inner -point' firstorderopt: 0 cgiterations: 0 message: '找到满足约束的局部最小值....' bestsible: [1x1 struct] objectivederivative: "closed-form" constraintderivative: "closed-form" solver: 'fmincon'

约束违反现在非常小。求解器只需要两次迭代就可以达到这个改进的解决方案。

参考文献

[1] Moré, j.j。非线性模型问题的集合。关于非线性方程组计算解的AMS-SIAM夏季研讨会论文集,科罗拉多,1988。阿贡国家实验室MCS-P60-0289, 1989。

另请参阅

|

相关的话题

Baidu
map