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

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

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

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

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

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

f(x)=100(x2x12)2+(1x1)2,

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

Примечание

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

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

Функция Розенброка, масштабируемая журналом: два представления.

 Код для генерации фигуры

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

Все функции оптимизации Optimization Toolbox минимизируют целевую функцию. Чтобы максимизировать функциональный f, примените стандартную программу оптимизации, чтобы минимизировать –f. Для получения дополнительной информации о максимизации, смотрите Максимизацию Цели.

Задайте проблему в синтаксисе тулбокса

Чтобы использовать программное обеспечение Optimization Toolbox, выразите свою проблему можно следующим образом:

  1. Задайте целевую функцию на языке MATLAB® как файл функции или анонимная функция. Этот пример использует файл функции.

  2. Задайте ограничения как отдельный файл или анонимную функцию.

Файл функции для целевой функции

Файл функции является текстовым файлом, который содержит команды MATLAB и имеет дополнительный .m. Создайте файл функции в любом текстовом редакторе или используйте встроенного редактора MATLAB в качестве в этом примере.

  1. В командной строке, введите:

    edit rosenbrock
  2. В редакторе 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;
  3. Сохраните файл с именем rosenbrock.m.

Файл функции для ограничения

Ограничительные функции имеют форму c (x) ≤ 0 или ceq (x) = 0. Ограничение x12+x221 не находится в форме, которую обрабатывает решатель. Чтобы иметь правильный синтаксис, повторно сформулируйте ограничение как x12+x2210.

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

С этими факторами в памяти, запишите файл функции для нелинейного ограничения.

  1. Создайте файл с именем unitdisk.m, содержащий следующий код:

    function [c,ceq] = unitdisk(x)
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
  2. Сохраните файл unitdisk.m.

Запустите оптимизацию

Существует два способа запустить оптимизацию:

Минимизируйте функцию Розенброка Используя приложение оптимизации

Примечание

Приложение Оптимизации предупреждает, что будет удалено в будущем релизе. Для альтернатив смотрите Альтернативы Приложения Оптимизации.

  1. Запустите приложение Оптимизации путем ввода optimtool в командной строке. Для получения дополнительной информации об этом инструменте, см. Приложение Оптимизации.

    Solver по умолчанию, fmincon - Constrained nonlinear minimization, выбран. Этот решатель подходит для этой проблемы, потому что функция Розенброка нелинейна, и проблема имеет ограничение. Для получения дополнительной информации о выборе решателя, см. Таблицу решений Оптимизации.

    Algorithm по умолчанию, Interior point, также выбран.

  2. В поле Objective function введите @rosenbrock. Символ указывает на указатель на функцию (MATLAB) файла rosenbrock.m.

  3. В поле Start point введите [0 0], чтобы задать начальную точку, где fmincon начинает свой поиск минимума.

  4. В поле Nonlinear constraint function введите @unitdisk, указатель на функцию unitdisk.m.

    Гарантируйте, что ваша панель Problem Setup and Results совпадает с этой фигурой.

  5. В панели Options, под Display to command window (в нижней части панели), выбирают iterative из списка Level of display. (Если вы не видите опцию, нажмите Display to command window.) Эта установка показывает прогресс fmincon в командном окне.

  6. В панели 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.
Ваше значение целевой функции может отличаться немного, в зависимости от вашей компьютерной системы и версии Optimization Toolbox.

Сообщение говорит вам что:

  • Поиск ограниченного оптимума, законченного, потому что производная целевой функции - почти 0 в направлениях, позволенных ограничением.

  • Ограничение удовлетворено с необходимой точностью.

В нижней части панели Problem Setup and Results минимизатор x появляется под Final point. Для получения дополнительной информации о выходных сообщениях, смотрите Выходные Флаги и Выходные сообщения.

Минимизируйте функцию Розенброка в командной строке

Можно запустить ту же оптимизацию из командной строки.

  1. Создайте опции, которые выбирают итеративное отображение и алгоритм interior-point.

    options = optimoptions(@fmincon,...
        'Display','iter','Algorithm','interior-point');
  2. Запустите решатель 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 было отрицательно во всех итерациях, каждая итерация удовлетворила ограничение.

Другие столбцы таблицы итерации описаны в Итеративном Отображении.

Смотрите также

Похожие темы