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