Этот пример показывает, как решить нелинейную задачу с ограничениями с помощью решателя Optimization Toolbox™. Пример демонстрирует типовой рабочий процесс: создайте целевую функцию, создайте ограничения, решите задачу и исследуйте результаты.
Этот пример предоставляет два подхода к решению задачи. Используется задача Optimize Live Editor, визуальный подход. Другой использует MATLAB® командная строка, текстовый подход. Можно также решить этот тип задачи с помощью основанного на проблеме подхода; см. «Решение ограниченной нелинейной задачи, основанной на проблеме».
Задача состоит в том, чтобы минимизировать функцию Розенбрка
над unit disk, то есть диском радиуса 1 с центром в начале координат. Другими словами, найдите x, который минимизирует f функции (x) над множеством. Эта задача является минимизацией нелинейной функции с нелинейным ограничением.
Примечание
Функция Розенбрка является стандартной тестовой функцией в оптимизации. Это имеет уникальное минимальное значение 0, достигнутое в точке [1,1]
. Нахождение минимума является проблемой для некоторых алгоритмов, потому что функция имеет неглубокий минимум в глубоко изогнутом овраге. Решение этой задачи не на точке [1,1]
поскольку эта точка не удовлетворяет ограничению.
Этот рисунок показывает два представления функции Розенбрка в единичном диске. Вертикальная ось логарифмизирована; другими словами, график показов логарифмическим (1 + f (x)). Контурные линии находятся под объемной поверхностной диаграммой.
Функция Розенбрка, логарифмическая: два представления
Функция f (x) называется целевой функцией. Целевой функцией является функция, которую вы хотите минимизировать. Неравенство называется ограничением. Ограничения ограничивают набор x, над которыми решатель ищет минимум. Вы можете иметь любое количество ограничений, которые являются неравенствами или равенствами.
Все оптимизационные функции Optimization Toolbox минимизируют целевую функцию. Чтобы максимизировать f функции, примените стандартную программу оптимизации, чтобы минимизировать - f. Для получения дополнительной информации о максимизации см. Раздел «Максимизация цели».
Задача Optimize Live Editor позволяет вам настроить и решить проблему с помощью визуального подхода.
Создайте новый live скрипт, нажав кнопку New Live Script в File разделе вкладки Home.
Вставьте задачу Optimize Live Editor. Щелкните вкладку Insert, а затем в разделе Code выберите Task > Optimize.
В Specify problem type разделе задачи выберите Objective > Nonlinear и Constraints > Nonlinear. Задача выбирает решатель 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
Эта функция реализует функцию Розенбрка.
В Select problem data разделе задачи выберите Objective function > objectiveFcn.
Поместите начальную точку x0 = [0;0]
в рабочее пространство MATLAB. Вставьте новый раздел над задачей Оптимизировать, нажав на задачу, а затем нажмите кнопку Section Break на вкладке Insert. В новом разделе над задачей введите следующий код для начальной точки.
x0 = [0;0];
Запустите раздел нажатием Ctrl+Enter. Это действие помещает x0
в рабочую область.
В Select problem data разделе задачи выберите Initial point (x0) > x0.
В разделе Select problem data выберите Constraints > Nonlinear > Local function и нажмите кнопку New.... Новая локальная функция появится ниже предыдущей локальной функции.
Отредактируйте новую локальную функцию следующим образом.
function [c,ceq] = unitdisk(x) c = x(1)^2 + x(2)^2 - 1; ceq = [ ]; end
В Select problem data разделе выберите unitdisk
как функция ограничения.
Чтобы контролировать прогресс решателя, в Display progress разделе задачи выберите Text display > Each iteration. Кроме того, выберите Objective value and feasibility для графика.
Чтобы запустить решатель, нажмите кнопку options ⁝ в верхней части окна задачи и выберите Run Section. График появляется в отдельном окне рисунка и в области выхода.
Выходная область показывает таблицу итераций, обсуждаемую в Interpret Result.
Чтобы найти решение, смотрите в верхней части задачи.
Решатель помещает переменные solution
и objectiveValue
в рабочей области. Просмотрите их значения путем вставки нового пропуска раздела под задачей и ввода этих линий.
Запустите раздел нажатием Ctrl+Enter.
Чтобы понять fmincon
процесс получения результата см. в Интерпретируйте Результат.
Чтобы отобразить код, который Optimize генерирует, чтобы решить проблему, нажмите кнопку options ⁝ в верхней части окна задачи и выберите 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
входы представляют целевую функцию и нелинейные функции ограничений, соответственно.
Выразите свою проблему следующим образом:
Определите целевую функцию на языке 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. Ограничение не в той форме, которую обрабатывает решатель. Чтобы иметь правильный синтаксис, переформулируйте ограничение как .
Синтаксис для нелинейных ограничений возвращает ограничения как равенство, так и неравенство. Этот пример включает только ограничение неравенства, поэтому вы должны передать пустой массив []
как ceq функция ограничения равенства.
Учитывая эти факторы, запишите файл функции для нелинейного ограничения.
Создайте файл с именем unitdisk.m
содержащий следующий код:
function [c,ceq] = unitdisk(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [ ];
Сохраните файл unitdisk.m
.
Теперь, когда вы определили цель и ограничительные функции, создайте другое fmincon
входы.
Создайте опции для fmincon
использовать 'optimplotfvalconstr'
plot и для возврата итеративного отображения.
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 искал минимальное значение функции Розенбрка в единичном диске. Ваша таблица может отличаться, в зависимости от версии тулбокса и вычислительной платформы. Следующее описание относится к таблице, показанной в этом примере.
Первый столбец с меткой Iter
, - число итерации от 0 до 24. fmincon
потребовалось 24 итерации, чтобы сойтись.
Второй столбец, обозначенный F-count
, сообщает, что накопительное число раз вычислений функции Розенброка была оцениваемо. В последней строке показан F-count
из 84, что указывает на то, что fmincon
оценивал функцию Розенбрка 84 раза в процессе нахождения минимума.
Третий столбец, обозначенный f(x)
, отображает значение целевой функции. Окончательное значение, 4.567482e-2
, - это минимум, сообщенный в запуске Оптимизации и в конце выходного сообщения в Командном окне.
Четвертый столбец, Feasibility
, 0 для всех итераций. В этом столбце показано значение функции ограничения unitdisk
при каждой итерации, где ограничение положительно. Потому что значение unitdisk
был отрицательным во всех итерациях, каждая итерация удовлетворяла ограничению.
Другие столбцы таблицы итерации описаны в итерационном отображении.