主要内容

获得解决方案使用的可行性模式

这个例子展示了如何使用的可行性模式fmincon“内点”算法获得一个可行点。利用自动分化,例子使用了具体问题具体分析的方法。更多的例子是来自问题9[1]

问题的设置

问题5 d优化变量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;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 * yawrate - 9.99 * sslipang - 45.83 *副翼- 7.64 * rudderdf -0.727 * pitchrat * yawrate + 8.39 * yawrate * attckang -684.4 * attckang * sslipang + 63.5 * pitchrat * attckang) = = 0;prob.Constraints。eq2 = (-0.987 * pitchrat - 22.95 * attckang -28.37 *电梯+ 0.949 * rollrate * yawrate + 0.173 * rollrate * sslipang) = = 0;prob.Constraints。eq3 = (0.002 * rollrate - 0.235 * yawrate +5.67 * sslipang - 0.921 *副翼- 6.51 * rudderdf -0.716 * rollrate * pitchrat - 1.578 * rollrate * attckang +1.132 * pitchrat * attckang) = = 0;prob.Constraints。eq4 = (pitchrat - attckang -1.168 *电梯——rollrate * sslipang) = = 0;prob.Constraints。eq5 = (-yawrate - 0.196 * sslipang -0.0071 *副翼+ rollrate * attckang) = = 0;

这个问题没有目标函数,所以没有指定prob.Objective

尝试解决方案没有可行性模式

试图解决问题使用默认的解决者和参数,从这一点[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 constrviolation: 11.1712 stepsize: 8.2265 e-05算法:“内点”firstorderopt: 0 cgiterations: 0消息:“解决者停止过早....“bestfeasible: [] objectivederivative:“封闭”constraintderivative:“封闭”解算器:“fmincon”

解算器停止过早。增加迭代极限和函数评价极限,然后再试一次。

选择= optimoptions (“fmincon”,“MaxIterations”1 e4,“MaxFunctionEvaluations”1 e4);[溶胶,~,exitflag、输出]=解决(x0,概率“选项”选项)
使用fmincon解决问题。聚集到一个不可行点。fmincon停止因为当前步骤的大小小于一步尺寸公差但约束的值不满足约束的值公差内。考虑启用内点方法可行性模式。
索尔=结构体字段:x1双x: [5]
exitflag = NoFeasiblePointFound
输出=结构体字段:迭代:4089 funcCount: 4092 constrviolation: 5.0899 stepsize: 5.9783 e-11算法:“内点”firstorderopt: 0 cgiterations: 0信息:一个不可行点的聚集....“bestfeasible: [] objectivederivative:“封闭”constraintderivative:“封闭”解算器:“fmincon”

求解收敛于一个不可行点。

解决使用可行性模式

再次尝试解决这个问题,这一次指定EnableFeasibilityModeSubproblemAlgorithm选项。一般来说,如果您需要使用可行性模式,最好的方法是设置SubproblemAlgorithm选项“重心”

选择= optimoptions(选项,“EnableFeasibilityMode”,真的,“SubproblemAlgorithm”,“重心”);[溶胶,~,exitflag、输出]=解决(x0,概率“选项”选项)
使用fmincon解决问题。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
索尔=结构体字段:x1双x: [5]
exitflag = OptimalSolution
输出=结构体字段:迭代:138 funcCount: 139 constrviolation: 2.9070 e-04 stepsize: 0.0057算法:“内点”firstorderopt: 0 cgiterations: 0消息:“局部最小值发现满足约束....“bestfeasible: [] objectivederivative:“封闭”constraintderivative:“封闭”解算器:“fmincon”

这一次,解决者报告说它到达一个可行的解决方案。然而,约束违反output.constrviolation不是很小。再次加强约束宽容和解决。速度解决方案过程中,从返回的可行的解决方案。

选项。ConstraintTolerance = 1 e-8;[溶胶,~,exitflag、输出]=解决(概率,溶胶,“选项”选项)
使用fmincon解决问题。局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。
索尔=结构体字段:x1双x: [5]
exitflag = OptimalSolution
输出=结构体字段:迭代:2 funcCount: 3 constrviolation: 2.1164 e-16 stepsize: 1.7083 e-08算法:“内点”firstorderopt: 0 cgiterations: 0消息:“局部最小值发现满足约束....“bestfeasible: [1 x1 struct] objectivederivative:“封闭”constraintderivative:“封闭”解算器:“fmincon”

约束违反现在很小。解算器只需要两个迭代达到这种改进的解决方案。

引用

[1],J·J。非线性模型问题的集合。学报AMS-SIAM夏季研讨会的计算解决非线性系统方程,科罗拉多州,1988。阿贡国家实验室mcs - p60 - 0289, 1989。

另请参阅

|

相关的话题