Получите решение Используя режим выполнимости

В этом примере показано, как использовать режим выполнимости fmincon 'interior-point' алгоритм, чтобы получить допустимую точку. Чтобы использовать в своих интересах автоматическое дифференцирование, пример использует подход, основанный на проблеме. Пример взят из проблемы 9 из Moré [1].

Setup задач

Проблема имеет 5-D переменную x оптимизации наряду с пятью квадратичными ограничениями. Первый x компонент имеет нижнюю границу 0, и остающиеся четыре компонента имеют верхние границы 0.

x = optimvar("x",5,"LowerBound",[0;-Inf;-Inf;-Inf;-Inf],"UpperBound",[Inf;0;0;0;0]);

Проблема, которая прибывает из авиационной промышленности, использует аэронавигационные термины для компонентов x и имеет заданные значения некоторых параметров.

elevator = 0.1; % If elevator were 0, then [0 0 0 0 0] would be a solution
aileron = 0.0;
rudderdf = 0.0;
rollrate = x(1);
pitchrat = x(2);
yawrate = x(3);
attckang = x(4);
sslipang = x(5);

Создайте задачу оптимизации и ограничения.

prob = optimproblem;
prob.Constraints.eq1 = (-3.933*rollrate + 0.107*pitchrat + ...
    0.126*yawrate - 9.99*sslipang - 45.83*aileron - 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*elevator + 0.949*rollrate*yawrate + 0.173*rollrate*sslipang) == 0;
prob.Constraints.eq3 = (0.002*rollrate - 0.235*yawrate + ...
    5.67*sslipang - 0.921*aileron - 6.51*rudderdf - ...
    0.716*rollrate*pitchrat - 1.578*rollrate*attckang + ...
    1.132*pitchrat*attckang) == 0;
prob.Constraints.eq4 = (pitchrat - attckang - ...
    1.168*elevator - rollrate*sslipang) == 0;
prob.Constraints.eq5 = (-yawrate - 0.196*sslipang - ...
    0.0071*aileron + rollrate*attckang) == 0;

Эта проблема не имеет никакой целевой функции, не задавайте prob.Objective.

Делайте попытку решения без режима выполнимости

Попытайтесь решить задачу с помощью решателя по умолчанию и параметров, запустив с точки [0 0 0 0 0]'.

x0.x = zeros(5,1);
[sol,~,exitflag,output] = solve(prob,x0)
Solving problem using fmincon.

Solver stopped prematurely.

fmincon stopped because it exceeded the iteration limit,
options.MaxIterations = 1.000000e+03.
sol = struct with fields:
    x: [5x1 double]

exitflag = 
    SolverLimitExceeded

output = struct with fields:
              iterations: 1000
               funcCount: 1003
         constrviolation: 11.1712
                stepsize: 8.2265e-05
               algorithm: 'interior-point'
           firstorderopt: 0
            cgiterations: 0
                 message: '...'
            bestfeasible: []
     objectivederivative: "closed-form"
    constraintderivative: "closed-form"
                  solver: 'fmincon'

Решатель останавливается преждевременно. Увеличьте предел итерации и предел вычисления функции, и затем попробуйте еще раз.

options = optimoptions("fmincon","MaxIterations",1e4,"MaxFunctionEvaluations",1e4);
[sol,~,exitflag,output] = solve(prob,x0,"Options",options)
Solving problem using fmincon.

Converged to an infeasible point.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance but constraints are not
satisfied to within the value of the constraint tolerance.


Consider enabling the interior point method feasibility mode.
sol = struct with fields:
    x: [5x1 double]

exitflag = 
    NoFeasiblePointFound

output = struct with fields:
              iterations: 4089
               funcCount: 4092
         constrviolation: 5.0899
                stepsize: 5.9783e-11
               algorithm: 'interior-point'
           firstorderopt: 0
            cgiterations: 0
                 message: '...'
            bestfeasible: []
     objectivederivative: "closed-form"
    constraintderivative: "closed-form"
                  solver: 'fmincon'

Решатель сходится к неосуществимой точке.

Решите Используя режим выполнимости

Попробуйте еще раз решать задачу, на этот раз задав EnableFeasibilityMode и SubproblemAlgorithm опции. Обычно, если необходимо использовать режим выполнимости, лучший подход должен установить SubproblemAlgorithm опция к 'cg'.

options = optimoptions(options,"EnableFeasibilityMode",true,...
    "SubproblemAlgorithm","cg");
[sol,~,exitflag,output] = solve(prob,x0,"Options",options)
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
    x: [5x1 double]

exitflag = 
    OptimalSolution

output = struct with fields:
              iterations: 138
               funcCount: 139
         constrviolation: 2.9071e-04
                stepsize: 0.0057
               algorithm: 'interior-point'
           firstorderopt: 0
            cgiterations: 0
                 message: '...'
            bestfeasible: []
     objectivederivative: "closed-form"
    constraintderivative: "closed-form"
                  solver: 'fmincon'

На этот раз решатель сообщает, что достигает возможного решения. Однако нарушение ограничений в output.constrviolation очень не мал. Сожмите допуск ограничения и решите снова. Чтобы ускорить процесс решения, запустите с возвращенного возможного решения.

options.ConstraintTolerance = 1e-8;
[sol,~,exitflag,output] = solve(prob,sol,"Options",options)
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
sol = struct with fields:
    x: [5x1 double]

exitflag = 
    OptimalSolution

output = struct with fields:
              iterations: 2
               funcCount: 3
         constrviolation: 4.4409e-16
                stepsize: 1.7084e-08
               algorithm: 'interior-point'
           firstorderopt: 0
            cgiterations: 0
                 message: '...'
            bestfeasible: [1x1 struct]
     objectivederivative: "closed-form"
    constraintderivative: "closed-form"
                  solver: 'fmincon'

Нарушение ограничений теперь вполне мало. Решатель берет только две итерации, чтобы достигнуть этого улучшенного решения.

Ссылки

[1] Moré, J. J. Набор нелинейных проблем модели. Продолжения Летнего Семинара AMS-SIAM по Вычислительному Решению Нонлинир-Системс-оф-Экуэйшнс, Колорадо, 1988. Национальная лаборатория Аргонна MCS-P60-0289, 1989.

Смотрите также

|

Похожие темы