Этот пример показывает, как решить ограниченную нелинейную задачу оптимизации с помощью основанного на проблеме подхода. Пример демонстрирует типовой процесс работы: создайте целевую функцию, создайте ограничения, решите задачу и исследуйте результаты.
Примечание:
Если ваша целевая функция или нелинейные ограничения не состоят из элементарных функций, необходимо преобразовать нелинейные функции в выражения оптимизации с помощью fcn2optimexpr
.
См. последнюю часть этого примера, Альтернативная формулировка с использованием fcn2optimexpr или Преобразование нелинейной функции в выражение оптимизации.
Для основанного на решателе подхода к этой задаче, смотрите Решить Ограниченную Нелинейную Задачу, Основанную на решателе.
Рассмотрим проблему минимизации функции Розенбрка
над единичным диском, означающим диск радиуса 1 с центром в начале координат. Другими словами, найти что минимизирует функцию над набором . Эта задача является минимизацией нелинейной функции, удовлетворяющей нелинейному ограничению.
Функция Розенбрка является стандартной тестовой функцией в оптимизации. Это имеет уникальное минимальное значение 0, достигнутое в точке [1,1]
. Нахождение минимума является проблемой для некоторых алгоритмов, потому что функция имеет неглубокий минимум в глубоко изогнутом овраге. Решение этой задачи не на точке [1,1]
поскольку эта точка не удовлетворяет ограничению.
Этот рисунок показывает два представления функции Розенбрка в единичном диске. Вертикальная ось логарифмизирована; другими словами, график показывает . Контурные линии находятся под объемной поверхностной диаграммой.
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
The rosenbrock
указатель на функцию вычисляет функцию Розенбрка в любом количестве точек 2-D сразу. Эта векторизация ускоряет графическое изображение функции и может быть полезна в других контекстах для ускорения оценки функции в нескольких точках.
Функция называется целевой функцией. Целевой функцией является функция, которую вы хотите минимизировать. Неравенство называется ограничением. Ограничения ограничивают набор над которым решатель ищет минимум. Вы можете иметь любое количество ограничений, которые являются неравенствами или уравнениями.
Основанный на проблеме подход к оптимизации использует переменные оптимизации, чтобы задать цель и ограничения. Существует два подхода к созданию выражений с использованием этих переменных:
Для полиномиальных или рациональных функций запишите выражения непосредственно в переменные.
Для других типов функций преобразуйте функции в выражения оптимизации с помощью fcn2optimexpr
. См. Альтернативная формулировка с использованием fcn2optimexpr
в конце этого примера.
Для этой задачи и целевая функция, и нелинейное ограничение являются полиномами, поэтому можно записать выражения непосредственно в терминах переменных оптимизации. Создайте 2-D переменную оптимизации с именем '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;
Проверьте проблему.
show(prob)
OptimizationProblem : Solve for: x minimize : ((100 .* (x(2) - x(1).^2).^2) + (1 - x(1)).^2) subject to circlecons: (x(1).^2 + x(2).^2) <= 1
Чтобы решить задачу оптимизации, позвоните solve
. Задача нуждается в начальной точке, которая является структурой, задающей начальное значение переменной оптимизации. Создайте начальную структуру точек x0
имеющий -значение [0 0]
.
x0.x = [0 0]; [sol,fval,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: [0.7864 0.6177]
fval = 0.0457
exitflag = OptimalSolution
output = struct with fields:
iterations: 24
funcCount: 34
constrviolation: 0
stepsize: 6.9161e-06
algorithm: 'interior-point'
firstorderopt: 2.1625e-08
cgiterations: 4
message: '...'
bestfeasible: [1x1 struct]
objectivederivative: "reverse-AD"
constraintderivative: "closed-form"
solver: 'fmincon'
Решение показывает exitflag = OptimalSolution
. Этот выходной флаг указывает, что решение является локальным оптимумом. Для получения информации о попытке найти лучшее решение, см., Когда решатель преуспевает.
Выходное сообщение указывает, что решение удовлетворяет ограничениям. Можно проверить, что решение действительно является допустимым, несколькими способами.
Проверьте сообщение о неосуществимости в constrviolation
поле output
структура.
infeas = output.constrviolation
infeas = 0
Недопустимость 0 указывает, что решение допустимо.
Вычислите недопустимость в решении.
infeas = infeasibility(nlcons,sol)
infeas = 0
Снова, недопустимость 0 указывает, что решение допустимо.
Вычислите норму x
чтобы убедиться, что он меньше или равен 1.
nx = norm(sol.x)
nx = 1.0000
The 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);
Просмотр новой проблемы.
show(convprob)
OptimizationProblem : Solve for: x 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)
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: [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: '...'
bestfeasible: [1x1 struct]
objectivederivative: "finite-differences"
constraintderivative: "finite-differences"
solver: 'fmincon'
Список поддерживаемых функций см. в Поддерживаемые операции с переменными оптимизации и выражениями.