Некоторые проблемы требуют нахождения точки, удовлетворяющей всем ограничениям, без объективной функции для минимизации. Например, предположим, что имеются следующие ограничения:
3y≤x-4.
Удовлетворяют ли какие-либо точки ) ограничениям? Чтобы выяснить это, напишите функцию, которая возвращает ограничения в поле структуры.Ineq. Запишите ограничения в терминах двухэлементного вектора x2) вместо , y). Запишите каждое неравенство как c (x), означающую (x) ≤0, вычитая правую сторону каждого неравенства из обеих сторон. Чтобы включить печать, запишите функцию векторизированным образом, где каждая строка представляет одну точку. Код для этой вспомогательной функции с именемobjconstr, появляется в конце этого примера.
Постройте график точек, в которых три функции удовлетворяют уравнениям для 2≤x≤2 и 4≤y≤2, и укажите неравенства путем построения линий уровня для значений функций, равных -1/2.
[XX,YY] = meshgrid(-2:0.1:2,-4:0.1:2); ZZ = objconstr([XX(:),YY(:)]).Ineq; ZZ = reshape(ZZ,[size(XX),3]); h = figure; ax = gca; contour(ax,XX,YY,ZZ(:,:,1),[-1/2 0],'r','ShowText','on'); hold on contour(ax,XX,YY,ZZ(:,:,2),[-1/2 0],'k','ShowText','on'); contour(ax,XX,YY,ZZ(:,:,3),[-1/2 0],'b','ShowText','on'); hold off

График показывает, что возможные точки существуют вблизи [1,75, -3].
Задайте нижние границы -5 и верхние границы 3 и решите проблему с помощью surrogateopt.
rng(1) % For reproducibility
lb = [-5,-5];
ub = [3,3];
[x,fval,exitflag,output,trials] = surrogateopt(@objconstr,lb,ub)
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
x = 1×2
1.7312 -3.0312
fval = 1x0 empty double row vector
exitflag = 0
output = struct with fields:
elapsedtime: 31.7004
funccount: 200
constrviolation: -0.0800
ineq: [-0.0800 -0.2083 -0.7625]
rngstate: [1x1 struct]
message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ...'
trials = struct with fields:
X: [200x2 double]
Ineq: [200x3 double]
Проверьте выполнимость возвращенного решения. x.
disp(output.ineq)
-0.0800 -0.2083 -0.7625
Эквивалентно, вычислить функцию objconstr в возвращенном решении x.
disp(objconstr(x).Ineq)
-0.0800 -0.2083 -0.7625
Эквивалентно, проверьте Ineq в поле trials структура для решения x. Сначала найдите индекс x в trials.X поле.
indx = ismember(trials.X,x,'rows');
disp(trials.Ineq(indx,:))-0.0800 -0.2083 -0.7625
Все значения функции ограничения отрицательные, указывая, что точка x выполнимо.
Просмотр возможных точек, оцененных surrogateopt.
opts = optimoptions("surrogateopt"); indx = max(trials.Ineq,[],2) <= opts.ConstraintTolerance; % Indices of feasible points figure(h); hold on plot(trials.X(indx,1),trials.X(indx,2),'*') xlim([1 2]) ylim([-3.5 -2.5]) hold off

Этот код создает objconstr функция помощника.
function f = objconstr(x) c(:,1) = (x(:,2) + x(:,1).^2).^2 + 0.1*x(:,2).^2 - 1; c(:,2) = x(:,2) - exp(-x(:,1)) + 3; c(:,3) = x(:,2) - x(:,1) + 4; f.Ineq = c; end