Этот пример показывает, как решить ограниченную нелинейную проблему с помощью решателя 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
было отрицательно во всех итерациях, каждая итерация удовлетворила ограничение.
Другие столбцы таблицы итерации описаны в Итеративном Отображении.