Решите ограниченную нелинейную задачу, основанную на решателе

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

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

Этот пример предоставляет два подхода к решению задачи. Используется задача Optimize Live Editor, визуальный подход. Другой использует MATLAB® командная строка, текстовый подход. Можно также решить этот тип задачи с помощью основанного на проблеме подхода; см. «Решение ограниченной нелинейной задачи, основанной на проблеме».

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

Задача состоит в том, чтобы минимизировать функцию Розенбрка

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. Для получения дополнительной информации о максимизации см. Раздел «Максимизация цели».

Определите и решите задачу с помощью Optimize Live Editor

Задача Optimize Live Editor позволяет вам настроить и решить проблему с помощью визуального подхода.

  1. Создайте новый live скрипт, нажав кнопку New Live Script в File разделе вкладки Home.

    New Live Script button

  2. Вставьте задачу Optimize Live Editor. Щелкните вкладку Insert, а затем в разделе Code выберите Task > Optimize.

    Optimize Live Editor task

  3. В Specify problem type разделе задачи выберите Objective > Nonlinear и Constraints > Nonlinear. Задача выбирает решатель fmincon - Constrained nonlinear minimization.

  4. Включите функцию Розенбрка в качестве целевой функции. В Select problem data разделе задачи выберите Objective function > Local function и нажмите кнопку New.... Новая локальная функция появится в разделе под задачей.

    function f = objectiveFcn(optimInput)
    % Example:
    % Minimize Rosenbrock's function
    % f = 100*(y - x^2)^2 + (1 - x)^2
    
    % Edit the lines below with your calculation
    x = optimInput(1);
    y = optimInput(2);
    f = 100*(y - x^2)^2 + (1 - x)^2;
    end

    Эта функция реализует функцию Розенбрка.

  5. В Select problem data разделе задачи выберите Objective function > objectiveFcn.

  6. Поместите начальную точку x0 = [0;0] в рабочее пространство MATLAB. Вставьте новый раздел над задачей Оптимизировать, нажав на задачу, а затем нажмите кнопку Section Break на вкладке Insert. В новом разделе над задачей введите следующий код для начальной точки.

    x0 = [0;0];
  7. Запустите раздел нажатием Ctrl+Enter. Это действие помещает x0 в рабочую область.

  8. В Select problem data разделе задачи выберите Initial point (x0) > x0.

    Objective function and x0

  9. В разделе Select problem data выберите Constraints > Nonlinear > Local function и нажмите кнопку New.... Новая локальная функция появится ниже предыдущей локальной функции.

  10. Отредактируйте новую локальную функцию следующим образом.

    function [c,ceq] = unitdisk(x)
    c = x(1)^2 + x(2)^2 - 1;
    ceq = [ ];
    end
  11. В Select problem data разделе выберите unitdisk как функция ограничения.

    Problem data: objective, initial point, nonlinear constraint

  12. Чтобы контролировать прогресс решателя, в Display progress разделе задачи выберите Text display > Each iteration. Кроме того, выберите Objective value and feasibility для графика.

    Iterative display and Objective value and feasibility plot function

  13. Чтобы запустить решатель, нажмите кнопку options в верхней части окна задачи и выберите Run Section. График появляется в отдельном окне рисунка и в области выхода.

    Function values generally decrease as iterations proceed

    Выходная область показывает таблицу итераций, обсуждаемую в Interpret Result.

  14. Чтобы найти решение, смотрите в верхней части задачи.

    solution, objectiveValue are returned from fmincon

    Решатель помещает переменные solution и objectiveValue в рабочей области. Просмотрите их значения путем вставки нового пропуска раздела под задачей и ввода этих линий.

    disp(solution); disp(objectiveValue)

  15. Запустите раздел нажатием Ctrl+Enter.

    solution = [0.7864,0.6177]. objectiveValue = 0.0457.

    Чтобы понять fmincon процесс получения результата см. в Интерпретируйте Результат.

  16. Чтобы отобразить код, который Optimize генерирует, чтобы решить проблему, нажмите кнопку options в верхней части окна задачи и выберите Controls and Code.

    Controls and Code

    В нижней части задачи появляется следующий код.

    % Set nondefault solver options
    options = optimoptions('fmincon','Display','iter','PlotFcn',...
        'optimplotfvalconstr');
    
    % Solve
    [solution,objectiveValue] = fmincon(@objectiveFcn,x0,[],[],[],[],[],[],...
        @unitdisk,options);

    Этот код является кодом, который вы используете, чтобы решить проблему в командной строке, как описано далее.

Определите и решите задачу в командной строке

Первым шагом в решении задачи оптимизации в командной строке является выбор решателя. Смотрите таблицу решений по оптимизации. Для задачи с нелинейной целевой функцией и нелинейным ограничением, обычно вы используете fmincon решатель.

Проконсультируйтесь с fmincon страница с описанием функции. Синтаксис решателя следующий.

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

The fun и nonlcon входы представляют целевую функцию и нелинейные функции ограничений, соответственно.

Выразите свою проблему следующим образом:

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

    %% 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.

Теперь, когда вы определили цель и ограничительные функции, создайте другое fmincon входы.

  1. Создайте опции для fmincon использовать 'optimplotfvalconstr' plot и для возврата итеративного отображения.

    options = optimoptions('fmincon',...
        'PlotFcn','optimplotfvalconstr',...
        'Display','iter');
  2. Создайте начальную точку.

    x0 = [0 0];
  3. Создайте пустые записи для ограничений, которые этот пример не использует.

    A = [];
    b = [];
    Aeq = [];
    beq = [];
    lb = [];
    ub = [];

Решите проблему, позвонив fmincon.

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
                                            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.440e-05    3.974e-05
   22      78    4.568281e-02    0.000e+00    8.000e-06    1.084e-07
   23      81    4.567641e-02    0.000e+00    1.601e-06    2.793e-05
   24      84    4.567482e-02    0.000e+00    2.023e-08    6.916e-06

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

Function values generally decrease as iterations proceed

Выходное сообщение говорит вам, что поиск ограниченного оптимума закончен, потому что производная целевой функции - почти 0 в направлениях, дозволенных ограничением, и что ограничение удовлетворено необходимой точности. Несколько выражений в сообщении содержат ссылки на дополнительную информацию о терминах, используемых в сообщении. Дополнительные сведения об этих ссылках см. в разделе Расширенные выходные сообщения.

Интерпретируйте результат

Таблица итерации в выходной области Live Editor и Командном окне MATLAB показывает, как MATLAB искал минимальное значение функции Розенбрка в единичном диске. Ваша таблица может отличаться, в зависимости от версии тулбокса и вычислительной платформы. Следующее описание относится к таблице, показанной в этом примере.

  • Первый столбец с меткой Iter, - число итерации от 0 до 24. fmincon потребовалось 24 итерации, чтобы сойтись.

  • Второй столбец, обозначенный F-count, сообщает, что накопительное число раз вычислений функции Розенброка была оцениваемо. В последней строке показан F-count из 84, что указывает на то, что fmincon оценивал функцию Розенбрка 84 раза в процессе нахождения минимума.

  • Третий столбец, обозначенный f(x), отображает значение целевой функции. Окончательное значение, 4.567482e-2, - это минимум, сообщенный в запуске Оптимизации и в конце выходного сообщения в Командном окне.

  • Четвертый столбец, Feasibility, 0 для всех итераций. В этом столбце показано значение функции ограничения unitdisk при каждой итерации, где ограничение положительно. Потому что значение unitdisk был отрицательным во всех итерациях, каждая итерация удовлетворяла ограничению.

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

См. также

|

Похожие темы