Решите ограниченную нелинейную проблему, основанную на проблеме

Типичная задача оптимизации

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

Примечание:

Для почти многочленных или рациональных выражений, необходимо преобразовать нелинейные функции с помощью fcn2optimexpr, . Видит последнюю часть этого примера, "Альтернативная Формулировка Используя fcn2optimexpr", или Преобразовывают Нелинейную Функцию в Выражение Оптимизации.

Для основанного на решателе подхода к этой проблеме смотрите, Решают Ограниченную Нелинейную проблему, Основанную на решателе.

Проблемная формулировка: функция Розенброка

Рассмотрите проблему минимизации функции Розенброка

f(x)=100(x2-x12)2+(1-x1)2,

по единичному диску, означая диск радиуса 1 сосредоточенный в начале координат. Другими словами, найти x это минимизирует функцию f(x) по набору x12+x221. Этой проблемой является минимизация нелинейного функционального предмета к нелинейному ограничению.

Функция Розенброка является стандартной тестовой функцией в оптимизации. Это имеет уникальное минимальное значение 0 достигнутых в точке [1,1]. Нахождение минимума является проблемой для некоторых алгоритмов, потому что функция имеет мелкий минимум в очень кривой долине. Решением для этой проблемы не является в точке [1,1], потому что та точка не удовлетворяет ограничение.

Эти данные показывают два представления функции Розенброка в единичном диске. Вертикальная ось масштабируется журналом; другими словами, график показывает журнал(1+f(x)). Линии контура лежат ниже объемной поверхностной диаграммы.

rosenbrock = @(x)100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2; % Vectorized function

figure1 = figure('Position',[1 200 600 300]);
colormap('gray');
axis square;
R = 0:.002:1;
TH = 2*pi*(0:.002:1); 
X = R'*cos(TH);
Y = R'*sin(TH); 
Z = log(1 + rosenbrock([X(:),Y(:)]));
Z = reshape(Z,size(X));

% Create subplot
subplot1 = subplot(1,2,1,'Parent',figure1);
view([124 34]);
grid('on');
hold on;

% Create surface
surf(X,Y,Z,'Parent',subplot1,'LineStyle','none');

% Create contour
contour(X,Y,Z,'Parent',subplot1);

% Create subplot
subplot2 = subplot(1,2,2,'Parent',figure1);
view([234 34]);
grid('on');
hold on

% Create surface
surf(X,Y,Z,'Parent',subplot2,'LineStyle','none');

% Create contour
contour(X,Y,Z,'Parent',subplot2);

% Create textarrow
annotation(figure1,'textarrow',[0.4 0.31],...
    [0.055 0.16],...
    'String',{'Minimum at (0.7864,0.6177)'});

% Create arrow
annotation(figure1,'arrow',[0.59 0.62],...
    [0.065 0.34]);

title("Rosenbrock's Function: Two Views")

hold off

Указатель на функцию rosenbrock вычисляет функцию Розенброка в любом количестве 2D точек целиком. Эта Векторизация (MATLAB) ускоряет графический вывод функции и может быть полезна в других контекстах для ускорения оценки функции в нескольких точках.

Функция f(x) вызван целевая функция. Целевая функция является функцией, которую вы хотите минимизировать. Неравенство x12+x221 называется ограничением. Ограничения ограничивают набор x по которому решатель ищет минимум. У вас может быть любое количество ограничений, которые являются неравенствами или уравнениями.

Задайте проблему Используя переменные оптимизации

Основанный на проблеме подход к оптимизации использует переменные оптимизации, чтобы задать цель и ограничения. Существует два подхода для создания выражений с помощью этих переменных:

  • Для полиномиальных или рациональных функций напишите выражения непосредственно в переменных.

  • Для других типов функций преобразуйте функции в выражения оптимизации с помощью fcn2optimexpr. Смотрите, что Альтернативная Формулировка Использует fcn2optimexpr в конце этого примера.

Для этой проблемы и целевая функция и нелинейное ограничение являются полиномами, таким образом, можно записать выражения непосредственно с точки зрения переменных оптимизации. Создайте 2D переменную оптимизации под названием 'x'.

x = optimvar('x',1,2);

Создайте целевую функцию как полином в переменной оптимизации.

obj = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;

Создайте задачу оптимизации под названием prob, имеющий obj как целевая функция.

prob = optimproblem('Objective',obj);

Создайте нелинейное ограничение как полином в переменной оптимизации.

nlcons = x(1)^2 + x(2)^2 <= 1;

Включайте нелинейное ограничение в проблему.

prob.Constraints.circlecons = nlcons;

Рассмотрите проблему.

showproblem(prob)
  OptimizationProblem : 

	minimize :
       ((100 .* (x(2) - x(1).^2).^2) + (1 - x(1)).^2)

	subject to circlecons:
       (x(1).^2 + x(2).^2) <= 1
     

Решите проблему

Чтобы решить задачу оптимизации, вызовите solve. Для проблемы нужна начальная точка, которая является структурой, дающей начальное значение переменной оптимизации. Создайте начальную структуру точки x0, имеющий x- значение [0 0].

x0.x = [0 0];
[sol,fval,exitflag,output] = solve(prob,x0)
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: [0.7864 0.6177]

fval = 0.0457
exitflag = 
    OptimalSolution

output = struct with fields:
         iterations: 24
          funcCount: 84
    constrviolation: 0
           stepsize: 6.9162e-06
          algorithm: 'interior-point'
      firstorderopt: 2.4373e-08
       cgiterations: 4
            message: '...'
             solver: 'fmincon'

Исследуйте решение

Решение показывает exitflag = OptimalSolution. Этот выходной флаг указывает, что решение является локальным оптимумом. Для получения информации о попытке найти лучшее решение, смотрите, Когда Решатель Успешно выполнится.

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

  • Проверяйте infeasibility, о котором сообщают, в поле constrviolation структуры output.

infeas = output.constrviolation
infeas = 0

infeasibility 0 указывает, что решение выполнимо.

  • Вычислите infeasibility в решении.

infeas = infeasibility(nlcons,sol)
infeas = 0

Снова, infeasibility 0 указывает, что решение выполнимо.

  • Вычислите норму x, чтобы гарантировать, что это меньше чем или равно 1.

nx = norm(sol.x)
nx = 1.0000

Структура output дает больше информации о процессе решения, таком как количество итераций (24), решатель (fmincon) и количество функциональных оценок (84). Для получения дополнительной информации об этих статистических данных смотрите Допуски и Критерий остановки.

Альтернативная формулировка Используя fcn2optimexpr

Для более сложных выражений запишите файлы функции для цели или ограничительных функций, и преобразуйте их в выражения оптимизации с помощью fcn2optimexpr. Например, основание нелинейной ограничительной функции находится в файле disk.m:

type disk
function radsqr = disk(x) 

radsqr = x(1)^2 + x(2)^2;

Преобразуйте этот файл функции в выражение оптимизации.

radsqexpr = fcn2optimexpr(@disk,x);

Кроме того, можно также преобразовать указатель на функцию rosenbrock, который был задан в начале стандартной программы графического вывода в выражение оптимизации.

rosenexpr = fcn2optimexpr(rosenbrock,x);

Создайте задачу оптимизации с помощью этих конвертированных выражений оптимизации.

convprob = optimproblem('Objective',rosenexpr,'Constraints',radsqexpr <= 1);

Просмотрите новую проблему.

showproblem(convprob)
  OptimizationProblem : 

	minimize :
       anonymousFunction2(x)

       where:

         anonymousFunction2 = @(x)100*(x(:,2)-x(:,1).^2).^2+(1-x(:,1)).^2;

	subject to :
       disk(x) <= 1
     

Решите новую проблему. Решение эквивалентно прежде.

[sol,fval,exitflag,output] = solve(convprob,x0)
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: [0.7864 0.6177]

fval = 0.0457
exitflag = 
    OptimalSolution

output = struct with fields:
         iterations: 24
          funcCount: 84
    constrviolation: 0
           stepsize: 6.9162e-06
          algorithm: 'interior-point'
      firstorderopt: 2.4373e-08
       cgiterations: 4
            message: '...'
             solver: 'fmincon'

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте