主要内容

采用可行性模式获取解决方案

实例说明了如何使用可行性模式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.0;Rudderdf = 0.0;滚动速率= x(1);Pitchrat = x(2);Yawrate = x(3);Attckang = x(4);slipang = x(5);

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

Prob =优化问题;prob.Constraints。Eq1 =(-3.933*滚速+ 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*滚速*pitchrat - 1.578*滚速*攻击+...1.132*pitchrat*attckang) == 0;prob.Constraints。Eq4 = (pitchrat - attckang -...1.168*电梯-滚动速度*滑动量)== 0;prob.Constraints。Eq5 = (-yawrate - 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.000000e+03。
索尔=带字段的结构:X: [5x1 double]
exitflag = SolverLimitExceeded
输出=带字段的结构:迭代:1000 funcCount: 1003 constrviolation: 11.1712 stepsize: 8.2265e-05算法:'内部点' firstorderopt: 0 cgiterations: 0消息:'求解器过早停止....' bestviable: [] objectivederivative: "closed-form" constraintderivative: "closed-form" solver: 'fmincon'

求解器过早地停止。增加迭代限制和函数求值限制,然后再试一次。

选项= optimoptions(“fmincon”“MaxIterations”1 e4,“MaxFunctionEvaluations”1 e4);[sol,~,exitflag,output] = solve(prob,x0,“选项”选项)
使用fmincon解决问题。收敛到一个不可行的点。Fmincon停止,因为当前步长的大小小于步长公差的值,但约束没有满足到约束公差的值之内。考虑启用内点方法可行性模式。
索尔=带字段的结构:X: [5x1 double]
exitflag = nofeasablepointfound
输出=带字段的结构:迭代:4089 funcCount: 4092 constrviolation: 5.0899 stepsize: 5.9783e-11算法:'内部点' firstorderopt: 0 cgiterations: 0消息:'收敛到一个不可行的点....' bestviable: [] objectivederivative: "closed-form" constraintderivative: "closed-form" solver: 'fmincon'

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

使用可行性模式求解

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

选项= optimoptions(选项,“EnableFeasibilityMode”,真的,...“SubproblemAlgorithm”“重心”);[sol,~,exitflag,output] = solve(prob,x0,“选项”选项)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
索尔=带字段的结构:X: [5x1 double]
exitflag = OptimalSolution
输出=带字段的结构:迭代:138 funcCount: 139 constrviolation: 2.9070e-04 stepsize: 0.0057 algorithm: ' internal -point' firstorderopt: 0 cgiterations: 0 message: '本地最小值发现满足约束....' bestviable: [] objectivederivative: "closed-form" constraintderivative: "closed-form" solver: 'fmincon'

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

选项。约束容忍= 1e-8;[sol,~,exitflag,output] = solve(问题,sol,“选项”选项)
使用fmincon解决问题。找到满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。
索尔=带字段的结构:X: [5x1 double]
exitflag = OptimalSolution
输出=带字段的结构:迭代:2 funcCount: 3 constrviolation: 2.1164e-16 stepsize: 1.7083e-08算法:'内部点' firstorderopt: 0 cgiterations: 0消息:'局部最小值发现满足约束....bestviable: [1x1 struct] objectivederivative: "closed-form" constraintderivative: "closed-form" solver: 'fmincon'

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

参考文献

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

另请参阅

|

相关的话题