В этом примере показано, как решить ограниченную нелинейную задачу с помощью решателя Optimization Toolbox™. Пример демонстрирует типичный рабочий процесс: создание целевой функции, создание ограничений, решение проблемы и анализ результатов.
В этом примере представлены два подхода к решению проблемы. Используется задача Оптимизировать интерактивный редактор (Optimize Live Editor), визуальный подход. Другой использует командную строку MATLAB ®, основанный на тексте подход. Этот тип задачи также можно решить с помощью подхода, основанного на проблемах; см. раздел Решение ограниченной нелинейной проблемы на основе проблем.
Проблема заключается в минимизации функции Розенброка
(1 − x1) 2,
над единичным диском, то есть диском радиуса 1, центрированным в начале координат. Другими словами, найти x, который минимизирует функцию f (x) над x12+x22≤1 набора. Эта проблема заключается в минимизации нелинейной функции с нелинейным ограничением.
Примечание
Функция Розенброка является стандартной тестовой функцией в оптимизации. Он имеет уникальное минимальное значение 0, достигнутое в точке [1,1]. Поиск минимума является проблемой для некоторых алгоритмов, потому что функция имеет небольшой минимум внутри глубоко изогнутой долины. Решение этой проблемы не в данный момент [1,1] потому что эта точка не удовлетворяет ограничению.
На этом рисунке показаны два вида функции Розенброка на диске блока. Вертикальная ось имеет логарифмический масштаб; другими словами, график показывает log (1 + f (x)). Контурные линии лежат под графиком поверхности.
Функция Розенброка, Log-Scaled: два вида

Функция f (x) называется целевой функцией. Целевой функцией является функция, которую необходимо свернуть. x12+x22≤1 неравенства называется ограничением. Ограничения ограничивают набор x, по которому решатель ищет минимум. Можно иметь любое количество ограничений, которые являются неравенствами или равенствами.
Все функции оптимизации Optimization Toolbox минимизируют целевую функцию. Чтобы максимизировать функцию f, примените процедуру оптимизации для минимизации -f. Дополнительные сведения о максимизации см. в разделе Максимизация цели.
Задача «Оптимизировать интерактивный редактор» позволяет настроить и решить проблему с помощью визуального подхода.
Создайте новый сценарий в реальном времени, нажав кнопку «Создать сценарий в реальном времени» в разделе «Файл» вкладки «Главная».

Вставка задачи «Оптимизировать интерактивный редактор». Перейдите на вкладку Вставка, а затем в разделе Код выберите Задача > Оптимизировать.

В разделе Задание типа задачи выберите Цель > Нелинейные и Ограничения > Нелинейные. Задача выбирает решатель fmincon - Constrained nonlinear minimization.
Включите функцию Розенброка в качестве целевой функции. В разделе 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
Эта функция реализует функцию Розенброка.
В Избранном проблемном разделе данных задачи выберите Объективную функцию> objectiveFcn.
Размещение начальной точки x0 = [0;0] в рабочую область MATLAB. Вставьте новый раздел над задачей «Оптимизация», щелкнув задачу, а затем нажав кнопку «Разрыв раздела» на вкладке «Вставка». В новом разделе над задачей введите следующий код начальной точки.
x0 = [0;0];
Запустите раздел, нажав Ctrl + Enter. Это действие размещаетx0 в рабочую область.
В разделе Select problem data задачи выберите Initial point (x0) > x0.

В разделе «Выбор данных проблемы» выберите «Ограничения» > «Нелинейные» > «Локальные функции», а затем нажмите кнопку «Создать»... кнопка. Новая локальная функция появляется под предыдущей локальной функцией.
Отредактируйте новую локальную функцию следующим образом.
function [c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1; ceq = [ ]; end
В разделе Выбор данных проблемы выберите unitdisk в качестве функции ограничения.

Чтобы отслеживать ход выполнения решателя, в разделе Показать ход выполнения задачи выберите Отображение текста > Каждая итерация. Также выберите Значение цели (Objective value) и выполнимость для графика.

Чтобы запустить решатель, нажмите кнопку опций ⁝ в правом верхнем углу окна задачи и выберите Выполнить раздел. График отображается в отдельном окне рисунка и в области вывода.

В области вывода отображается таблица итераций, описанная в разделе Интерпретировать результат (Interpret Result).
Чтобы найти решение, посмотрите в верхней части задачи.
![]()
Решатель размещает переменные solution и objectiveValue в рабочей области. Просмотрите их значения, вставив новый разрыв раздела под задачей и введя эти строки.

Запустите раздел, нажав Ctrl + Enter.
![solution = [0.7864,0.6177]. objectiveValue = 0.0457.](optimizelet_viewsolution_result.png)
Чтобы понять fmincon процесс получения результата см. в разделе Интерпретация результата.
Чтобы отобразить код, генерируемый Optimize для решения проблемы, нажмите кнопку параметров ⁝ в правом верхнем углу окна задачи и выберите Элементы управления и код.

В нижней части задачи появится следующий код.
% 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)
fun и nonlcon входные данные представляют целевую функцию и функции нелинейных ограничений соответственно.
Выразите свою проблему следующим образом:
Определите целевую функцию на языке 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 является векторизованной функцией, которая может вычислять значения сразу для нескольких точек. См. раздел Векторизация. Векторизованная функция лучше всего подходит для печати. Для невекторизованной версии введите:
%% 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. x12+x22≤1 ограничения не соответствует форме, которую обрабатывает решатель. Чтобы иметь правильный синтаксис, переформулируйте ограничение x12+x22−1≤0 .
Синтаксис нелинейных ограничений возвращает как ограничения равенства, так и ограничения неравенства. Этот пример включает только ограничение неравенства, поэтому необходимо передать пустой массив [] в качестве функции ограничения равенства ceq.
С учетом этих соображений запишите файл функции для нелинейного ограничения.
Создание файла с именем unitdisk.m содержащий следующий код:
function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [ ];Сохранить файл unitdisk.m.
После определения функций цели и ограничения создайте другую fmincon входные данные.
Создать параметры для fmincon для использования 'optimplotfvalconstr' и для возврата итеративного отображения.
options = optimoptions('fmincon',... 'PlotFcn','optimplotfvalconstr',... 'Display','iter');
Создайте начальную точку.
x0 = [0 0];
Создайте пустые записи для ограничений, которые не используются в этом примере.
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
Сообщение о выходе сообщает, что поиск ограниченного оптимума завершен, так как производная целевой функции почти равна 0 в направлениях, разрешенных ограничением, и что ограничение удовлетворено до требуемой точности. Несколько фраз в сообщении содержат ссылки на дополнительную информацию о терминах, используемых в сообщении. Дополнительные сведения об этих ссылках см. в разделе Расширенные сообщения о выходе.
Таблица итераций в области вывода задачи Live Editor и в окне команд MATLAB показывает, как MATLAB искал минимальное значение функции Rosenbrock на диске устройства. Таблица может отличаться в зависимости от версии панели инструментов и вычислительной платформы. Следующее описание относится к таблице, показанной в этом примере.
Первый столбец с меткой Iter, - номер итерации от 0 до 24. fmincon для схождения потребовалось 24 итерации.
Второй столбец с меткой F-countсообщает, что совокупное количество раз функция Розенброка была оценена. В последней строке отображается F-count из 84, указывая, что fmincon оценивали функцию Розенброка 84 раза в процессе нахождения минимума.
Третий столбец с меткой f(x), отображает значение целевой функции. Конечное значение, 4.567482e-2, минимальное значение, указанное в прогоне Optimize и в конце сообщения exit в окне команд.
Четвертый столбец, Feasibility, равно 0 для всех итераций. В этом столбце отображается значение функции ограничения unitdisk в каждой итерации, где ограничение является положительным. Потому что значение unitdisk была отрицательной во всех итерациях, каждая итерация удовлетворяла ограничению.
Другие столбцы таблицы итераций описаны в разделе Итерационное отображение.