В этом примере показано, как решить ограниченную нелинейную задачу с помощью решателя Optimization Toolbox™. Пример демонстрирует типичный поток операций: создайте целевую функцию, создайте ограничения, решите задачу и исследуйте результаты.
Для подхода, основанного на проблеме к этой проблеме смотрите, Решают Ограниченную Нелинейную задачу, Основанную на проблеме.
Рассмотрите задачу минимизации функции Розенброка
по unit disk, то есть, диску радиуса 1 с центром в начале координат. Другими словами, найдите x, который минимизирует функциональный f (x) на множестве . Этой проблемой является минимизация нелинейной функции с нелинейным ограничением.
Функция Розенброка является стандартной тестовой функцией в оптимизации. Это имеет уникальное минимальное значение 0 достигнутых в точке [1,1]
. Нахождение минимума является проблемой для некоторых алгоритмов, потому что функция имеет неглубокий минимум в очень кривом овраге. Решением для этой проблемы не является в точке [1,1]
потому что та точка не удовлетворяет ограничению.
Этот рисунок показывает два представления функции Розенброка на единичном диске. Вертикальная ось имеет логарифмическое масштабирование; другими словами, график показывает журнал (1+f (x)). Линии контура лежат ниже графика поверхности.
Функция Розенброка, масштабируемая журналом: два представления.
Функциональный f (x) называется целевой функцией. Целевая функция является функцией, которую вы хотите минимизировать. Неравенство называется ограничением. Ограничения ограничивают набор x, по которому решатель ищет минимум. У вас может быть любое количество ограничений, которые являются неравенствами или уравнениями.
Все оптимизационные функции Optimization Toolbox минимизируют целевую функцию. Чтобы максимизировать функциональный f, примените стандартную программу оптимизации, чтобы минимизировать –f. Для получения дополнительной информации о максимизации, смотрите Максимизацию Цели.
Чтобы использовать программное обеспечение Optimization Toolbox, выразите свою проблему следующим образом:
Задайте целевую функцию на языке MATLAB® как файл функции или анонимная функция. Этот пример использует файл функции.
Задайте ограничения как отдельный файл или анонимную функцию.
Файл функции является текстовым файлом, который содержит команды MATLAB и имеет дополнительный .m
. Создайте файл функции в любом текстовом редакторе или используйте встроенный в MATLAB редактор, как в этом примере.
В командной строке, введите:
edit rosenbrock
В редакторе MATLAB, введите:
%% ROSENBROCK(x) expects a two-column matrix and returns a column vector % The output is the Rosenbrock function, which has a minimum at % (1,1) of value 0, and is strictly positive everywhere else. function f = rosenbrock(x) f = 100*(x(:,2) - x(:,1).^2).^2 + (1 - x(:,1)).^2;
rosenbrock
векторизованная функция, которая может вычислить значения для нескольких точек целиком. Смотрите Векторизацию (MATLAB). Векторизованная функция является лучшей для графического вывода. Для невекторизованной версии, введите:
%% ROSENBROCK1(x) expects a two-element vector and returns a scalar % The output is the Rosenbrock function, which has a minimum at % (1,1) of value 0, and is strictly positive everywhere else. function f = rosenbrock1(x) f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
Сохраните файл с именем rosenbrock.m
.
Ограничительные функции имеют форму c (x) ≤ 0 или ceq (x) = 0. Ограничение не находится в форме, которую обрабатывает решатель. Чтобы иметь правильный синтаксис, переформулируйте ограничение как .
Кроме того, синтаксис для нелинейных ограничений возвращает и ограничения равенства и ограничения неравенства. Этот пример включает только ограничение неравенства, таким образом, необходимо передать пустой массив []
как ограничение равенства функционируют ceq.
Учитывая эти соображения, запишите файл функции для нелинейного ограничения.
Создайте файл с именем unitdisk.m
содержа следующий код:
function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [ ];
Сохраните файл unitdisk.m
.
Существует два способа запустить оптимизацию:
Используйте приложение Оптимизации; смотрите Минимизируют Функцию Розенброка Используя Приложение Оптимизации.
Используйте функции командной строки; смотрите Минимизируют Функцию Розенброка в Командной строке.
Приложение Оптимизации предупреждает, что будет удалено в будущем релизе. Для альтернатив смотрите Альтернативы Приложения Оптимизации.
Запустите приложение Оптимизации путем ввода optimtool
в командной строке. Для получения дополнительной информации об этом инструменте, см. Приложение Оптимизации.
Solver по умолчанию, fmincon - Constrained nonlinear minimization
, выбран. Этот решатель подходит для этой проблемы, потому что функция Розенброка нелинейна, и проблема имеет ограничение. Для получения дополнительной информации о выборе решателя, см. Таблицу решений Оптимизации.
Algorithm по умолчанию, Interior point
, также выбран.
В поле Objective function введите @rosenbrock
. Символ @ указывает на указатель на функцию (MATLAB) файла rosenbrock.m
.
В поле Start point введите [0 0]
задавать начальную точку где fmincon
начинает его поиск минимума.
В поле Nonlinear constraint function введите @unitdisk
, указатель на функцию unitdisk.m
.
Убедитесь, что ваша панель Problem Setup and Results совпадает с этим рисунком.
В панели Options, под Display to command window (в нижней части панели), выбирают iterative
из списка Level of display. (Если вы не видите опцию, нажмите Display to command window.) Эта установка показывает прогресс fmincon
в Командном окне.
В панели Problem Setup and Results, под Run solver and view results, нажимают Start.
Следующее сообщение появляется в поле Run solver and view results:
Optimization running. Objective function value: 0.04567482475812774 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.
Сообщение говорит вам что:
Поиск ограниченного оптимума закончен, потому что производная целевой функции - почти 0 в направлениях, дозволенных ограничением.
Ограничению удовлетворяют с необходимой точностью.
В нижней части панели Problem Setup and Results, минимизатор x
появляется под Final point. Для получения дополнительной информации о выходных сообщениях, смотрите Выходные Флаги и Выходные сообщения.
Можно запустить ту же оптимизацию из командной строки.
Создайте опции, которые выбирают итеративное отображение и interior-point
алгоритм.
options = optimoptions(@fmincon,... 'Display','iter','Algorithm','interior-point');
Запустите fmincon
решатель с options
структура, сообщая об обоих местоположение x
из минимизатора и значения fval
достигнутый целевой функцией.
[x,fval] = fmincon(@rosenbrock,[0 0],...
[],[],[],[],[],[],@unitdisk,options)
Шесть наборов пустых скобок представляют дополнительные ограничения, которые не используются в этом примере. Смотрите fmincon
страницы ссылки на функцию для синтаксиса.
MATLAB выводит таблицу итераций и результаты оптимизации.
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. x = 0.7864 0.6177 fval = 0.0457
Сообщение говорит вам, что поиск ограниченного оптимума, законченного, потому что производная целевой функции - почти 0 в направлениях, позволенных ограничением, и что ограничению удовлетворяют с необходимой точностью. Несколько фраз в сообщении содержат ссылки на большую информацию о терминах, использованных в сообщении. Для получения дополнительной информации об этих ссылках, смотрите Расширенные Выходные сообщения.
Таблица итерации в командном окне показывает, как MATLAB искал минимальное значение функции Розенброка в единичном диске. Эта таблица является тем же самым, используете ли вы приложение Оптимизации или командную строку. MATLAB сообщает о минимизации следующим образом:
First-order Norm of Iter F-count f(x) Feasibility optimality step 0 3 1.000000e+00 0.000e+00 2.000e+00 1 13 7.753537e-01 0.000e+00 6.250e+00 1.768e-01 2 18 6.519648e-01 0.000e+00 9.048e+00 1.679e-01 3 21 5.543209e-01 0.000e+00 8.033e+00 1.203e-01 4 24 2.985207e-01 0.000e+00 1.790e+00 9.328e-02 5 27 2.653799e-01 0.000e+00 2.788e+00 5.723e-02 6 30 1.897216e-01 0.000e+00 2.311e+00 1.147e-01 7 33 1.513701e-01 0.000e+00 9.706e-01 5.764e-02 8 36 1.153330e-01 0.000e+00 1.127e+00 8.169e-02 9 39 1.198058e-01 0.000e+00 1.000e-01 1.522e-02 10 42 8.910052e-02 0.000e+00 8.378e-01 8.301e-02 11 45 6.771960e-02 0.000e+00 1.365e+00 7.149e-02 12 48 6.437664e-02 0.000e+00 1.146e-01 5.701e-03 13 51 6.329037e-02 0.000e+00 1.883e-02 3.774e-03 14 54 5.161934e-02 0.000e+00 3.016e-01 4.464e-02 15 57 4.964194e-02 0.000e+00 7.913e-02 7.894e-03 16 60 4.955404e-02 0.000e+00 5.462e-03 4.185e-04 17 63 4.954839e-02 0.000e+00 3.993e-03 2.208e-05 18 66 4.658289e-02 0.000e+00 1.318e-02 1.255e-02 19 69 4.647011e-02 0.000e+00 8.006e-04 4.940e-04 20 72 4.569141e-02 0.000e+00 3.136e-03 3.379e-03 21 75 4.568281e-02 0.000e+00 6.437e-05 3.974e-05 22 78 4.568281e-02 0.000e+00 8.000e-06 1.083e-07 23 81 4.567641e-02 0.000e+00 1.601e-06 2.793e-05 24 84 4.567482e-02 0.000e+00 1.996e-08 6.916e-06
Ваша таблица может отличаться, в зависимости от версии тулбокса и вычислительной платформы. Следующее описание применяется к таблице, как отображено.
Первый столбец, пометил Iter
, номер итерации от 0 до 24. fmincon
взял 24 итерации, чтобы сходиться.
Второй столбец, пометил F-count
, сообщает, что накопительное число раз вычислений функции Розенброка было оценено. Итоговая строка показывает F-count
из 84, указывая на тот fmincon
функция оцененного Розенброка 84 раза в процессе нахождения минимума.
Третий столбец, пометил f(x)
, отображает значение целевой функции. Окончательное значение, 0.04567482, является минимумом, о котором сообщают в приложении Оптимизации поле Run solver and view results, и в конце выходного сообщения в командном окне.
Четвертый столбец, Feasibility
, 0 для всех итераций. Этот столбец показывает значение ограничительной функции unitdisk
в каждой итерации, где ограничение положительно. Поскольку значение unitdisk
было отрицательно во всех итерациях, каждая итерация удовлетворила ограничению.
Другие столбцы таблицы итерации описаны в Итеративном Отображении.