exponenta event banner

Решение нелинейной проблемы выполнимости, основанной на проблемах

В этом примере показано, как найти точку, удовлетворяющую всем ограничениям задачи, без объективной функции для минимизации.

Определение проблемы

Например, предположим, что имеются следующие ограничения:

(y + x2) 2+0.1y2≤1y≤exp (-x) - 3y≤x-4.

Удовлетворяют ли точки (x, y) всем ограничениям?

Решение на основе проблем

Создайте задачу оптимизации, которая имеет только ограничения, без целевой функции.

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
cons1 = (y + x^2)^2 + 0.1*y^2 <= 1;
cons2 = y <= exp(-x) - 3;
cons3 = y <= x - 4;
prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;
prob.Constraints.cons3 = cons3;
show(prob)
  OptimizationProblem : 

	Solve for:
       x, y

	minimize :

	subject to cons1:
       ((y + x.^2).^2 + (0.1 .* y.^2)) <= 1

	subject to cons2:
       y <= (exp(-x) - 3)

	subject to cons3:
       y - x <= -4
     

Создание структуры псевдослучайной начальной точки x0 с полями x и y для переменных оптимизации.

rng default
x0.x = randn;
x0.y = randn;

Решить проблему, начиная с x0.

[sol,~,exitflag,output] = solve(prob,x0)
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: 1.7903
    y: -3.0102

exitflag = 
    OptimalSolution

output = struct with fields:
              iterations: 6
               funcCount: 9
         constrviolation: 0
                stepsize: 0.2906
               algorithm: 'interior-point'
           firstorderopt: 0
            cgiterations: 0
                 message: '...'
            bestfeasible: [1x1 struct]
     objectivederivative: "closed-form"
    constraintderivative: "forward-AD"
                  solver: 'fmincon'

Решатель находит выполнимую точку.

Значение начальной точки

Решатель может не найти решение, начиная с некоторых начальных точек. Установка начальной точки x0.x = -1, x0.y = -4 и решить проблему, начиная с x0.

x0.x = -1;
x0.y = -4;
[sol2,~,exitflag2,output2] = solve(prob,x0)
Solving problem using fmincon.

Converged to an infeasible point.

fmincon stopped because it is unable to find a point locally that satisfies
the constraints within the value of the constraint tolerance.
sol2 = struct with fields:
    x: -2.1266
    y: -4.6657

exitflag2 = 
    NoFeasiblePointFound

output2 = struct with fields:
              iterations: 140
               funcCount: 299
         constrviolation: 1.4609
                stepsize: 1.5248e-10
               algorithm: 'interior-point'
           firstorderopt: 0
            cgiterations: 281
                 message: '...'
            bestfeasible: []
     objectivederivative: "closed-form"
    constraintderivative: "forward-AD"
                  solver: 'fmincon'

Проверьте несходимости в возвращенной точке.

inf1 = infeasibility(cons1,sol2)
inf1 = 1.1974
inf2 = infeasibility(cons2,sol2)
inf2 = 0
inf3 = infeasibility(cons3,sol2)
inf3 = 1.4609

Оба cons1 и cons3 невозможны для решения sol2. Результаты подчеркивают важность использования нескольких начальных точек для изучения и решения проблемы выполнимости.

Визуализация зависимостей

Чтобы визуализировать ограничения, постройте график точек, где каждая функция ограничения равна нулю, используя fimplicit. fimplicit функция передает числовые значения своим функциям, тогда как evaluate для функции требуется структура. Чтобы связать эти функции, используйте evaluateExpr вспомогательная функция, которая появляется в конце этого примера. Эта функция просто помещает переданные значения в структуру с соответствующими именами.

Примечание.Если для этого примера используется файл сценария в реальном времени, evaluateExpr функция уже включена в конец файла. В противном случае необходимо создать эту функцию в конце файла .m или добавить ее в качестве файла по пути MATLAB ®.

Избегайте предупреждения, которое возникает из-за evaluateExpr функция не работает на векторизированных входах.

s = warning('off','MATLAB:fplot:NotVectorized');
cc1 = (y + x^2)^2 + 0.1*y^2 - 1;
fimplicit(@(a,b)evaluateExpr(cc1,a,b),[-2 2 -4 2],'r')
hold on
cc2 = y - exp(-x) + 3;
fimplicit(@(a,b)evaluateExpr(cc2,a,b),[-2 2 -4 2],'k')
cc3 = y - x + 4;
fimplicit(@(x,y)evaluateExpr(cc3,x,y),[-2 2 -4 2],'b')
hold off

Figure contains an axes. The axes contains 3 objects of type implicitfunctionline.

warning(s);

Возможная область находится внутри красного контура и под черными и синими линиями. Возможная область находится в правом нижнем углу красного контура.

Вспомогательная функция

Этот код создает evaluateExpr функция помощника.

function p = evaluateExpr(expr,x,y)
pt.x = x;
pt.y = y;
p = evaluate(expr,pt);
end

См. также

Связанные темы