Найти минимум неограниченной многовариантной функции
Решатель нелинейного программирования.
Находит минимум проблемы, указанный в
)
где f (x) - функция, возвращающая скаляр.
x - вектор или матрица; см. Аргументы матрицы.
начинается в точке x = fminunc(fun,x0)x0 и пытается найти локальный минимум x функции, описанной в fun. Пункт x0 может быть скаляром, вектором или матрицей.
Примечание
В разделе Передача дополнительных параметров (Passing Extra Parameters) объясняется, как передать дополнительные параметры целевой функции и, при необходимости, нелинейным функциям ограничения.
fminunc для нелинейных задач без ограничений. Если проблема имеет ограничения, обычно используйте fmincon. См. таблицу решений по оптимизации.
минимизирует x = fminunc(fun,x0,options)fun с опциями оптимизации, указанными в options. Использовать optimoptions для установки этих параметров.
Минимизируйте функцию x22-4x1 + 5x2.
Для этого необходимо написать анонимную функцию fun вычисляет цель.
fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);
Звонить fminunc чтобы найти минимум fun рядом [1,1].
x0 = [1,1]; [x,fval] = fminunc(fun,x0)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
2.2500 -4.7500
fval = -16.3750
fminunc может быть быстрее и надежнее, когда вы предоставляете производные.
Запишите целевую функцию, которая возвращает градиент, а также значение функции. Используйте условную форму, описанную в разделе Включение градиентов и гессенов. Целевой функцией является функция Розенброка,
1-x1) 2,
который имеет градиент
x2-x12)].
Код целевой функции с градиентом появляется в конце этого примера.
Создайте параметры для использования градиента целевой функции. Также установите алгоритм в значение 'trust-region'.
options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
Установите начальную точку на [-1,2]. Затем позвоните fminunc.
x0 = [-1,2]; fun = @rosenbrockwithgrad; x = fminunc(fun,x0,options)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
1.0000 1.0000
Следующий код создает rosenbrockwithgrad функция, которая включает градиент в качестве второго выходного сигнала.
function [f,g] = rosenbrockwithgrad(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1)); 200*(x(2)-x(1)^2)]; end end
Решите ту же задачу, что и в Supply Gradient, используя структуру задачи вместо отдельных аргументов.
Запишите целевую функцию, которая возвращает градиент, а также значение функции. Используйте условную форму, описанную в разделе Включение градиентов и гессенов. Целевой функцией является функция Розенброка,
(1-x1) 2,
который имеет градиент
x2-x12)].
Код целевой функции с градиентом появляется в конце этого примера.
Создайте параметры для использования градиента целевой функции. Также установите алгоритм в значение 'trust-region'.
options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
Создание структуры проблемы, включающей начальную точку x0 = [-1,2]. Необходимые поля в этой структуре см. в разделе Проблема.
problem.options = options;
problem.x0 = [-1,2];
problem.objective = @rosenbrockwithgrad;
problem.solver = 'fminunc';Решите проблему.
x = fminunc(problem)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
1.0000 1.0000
Следующий код создает rosenbrockwithgrad функция, которая включает градиент в качестве второго выходного сигнала.
function [f,g] = rosenbrockwithgrad(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)]; end end
Найдите как расположение минимума нелинейной функции, так и значение функции на этом минимуме. Целевая функция:
x‖22+‖x‖22/20.
fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;
Найдите местоположение и значение целевой функции минимизатора, начиная с x0 = [1,2].
x0 = [1,2]; [x,fval] = fminunc(fun,x0)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
-0.6691 0.0000
fval = -0.4052
Выбирать fminunc варианты и результаты для изучения процесса решения.
Задайте опции для получения итеративного отображения и используйте 'quasi-newton' алгоритм.
options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton');
Целевая функция:
x‖22+‖x‖22/20.
fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;
Начать минимизацию в x0 = [1,2]и получать выходные данные, которые позволяют проверить качество решения и процесс.
x0 = [1,2]; [x,fval,exitflag,output] = fminunc(fun,x0,options)
First-order
Iteration Func-count f(x) Step-size optimality
0 3 0.256738 0.173
1 6 0.222149 1 0.131
2 9 0.15717 1 0.158
3 18 -0.227902 0.438133 0.386
4 21 -0.299271 1 0.46
5 30 -0.404028 0.102071 0.0458
6 33 -0.404868 1 0.0296
7 36 -0.405236 1 0.00119
8 39 -0.405237 1 0.000252
9 42 -0.405237 1 7.97e-07
Local minimum found.
Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
x = 1×2
-0.6691 0.0000
fval = -0.4052
exitflag = 1
output = struct with fields:
iterations: 9
funcCount: 42
stepsize: 2.9343e-04
lssteplength: 1
firstorderopt: 7.9721e-07
algorithm: 'quasi-newton'
message: '...'
Флаг выхода 1 показывает, что решение является локальным оптимумом.
output структура показывает количество итераций, число оценок функций и другую информацию.
Итеративный экран также показывает количество итераций и оценок функций.
fun - Функция минимизацииФункция для минимизации, заданная как дескриптор функции или имя функции. fun - функция, принимающая вектор или массив; x и возвращает действительный скаляр f, целевая функция, оцененная на x.
Определить fun как дескриптор функции для файла:
x = fminunc(@myfun,x0)
где myfun является функцией MATLAB ®, такой как
function f = myfun(x) f = ... % Compute function value at x
Можно также указать fun как дескриптор функции для анонимной функции:
x = fminunc(@(x)norm(x)^2,x0);
Если можно вычислить градиент fun и SpecifyObjectiveGradient параметр имеет значение true, как установлено
options = optimoptions('fminunc','SpecifyObjectiveGradient',true)fun должен возвращать вектор градиента g(x) во втором выходном аргументе.
Если вы также можете вычислить матрицу Гессена и HessianFcn параметр имеет значение 'objective' через options = optimoptions('fminunc','HessianFcn','objective') и Algorithm параметр имеет значение 'trust-region', fun должен возвращать гессенское значение H(x)симметричная матрица в третьем выходном аргументе. fun может дать разреженный гессен. Дополнительные сведения см. в описании алгоритмов fminunc trust-region или fmincon trust-region-reflective.
trust-region алгоритм позволяет предоставить гессеновскую функцию умножения. Эта функция даёт результат гессеновского векторного произведения без непосредственного вычисления гессенского. Это может сэкономить память. См. раздел Функция умножения Гессена.
Пример: fun = @(x)sin(x(1))*cos(x(2))
Типы данных: char | function_handle | string
x0 - Начальная точкаНачальная точка, заданная как вещественный вектор или вещественный массив. Решатели используют количество элементов в x0 и размер x0 для определения количества и размера переменных, которые fun принимает.
Пример: x0 = [1,2,3,4]
Типы данных: double
options - Варианты оптимизацииoptimoptions | структура, такая как optimset прибыльОпции оптимизации, указанные как выходные данные optimoptions или структура, такая как optimset возвращает.
Некоторые опции применимы ко всем алгоритмам, а другие актуальны для конкретных алгоритмов. Дополнительные сведения см. в разделе Справочник по опциям оптимизации.
Некоторые опции отсутствуют в optimoptions дисплей. Эти параметры выделены курсивом в следующей таблице. Дополнительные сведения см. в разделе Параметры просмотра.
| Все алгоритмы | |
| Выберите |
CheckGradients | Сравните поставляемые пользователем производные (градиент цели) с конечноразностными производными. Варианты: Для |
| Диагностика | Отображение диагностической информации о функции, которая должна быть свернута или решена. Варианты: |
| DiffMaxChange | Максимальное изменение переменных для градиентов конечных разностей (положительный скаляр). Значение по умолчанию: |
| DiffMinChange | Минимальное изменение переменных для градиентов конечных разностей (положительный скаляр). Значение по умолчанию: |
Display | Уровень отображения (см. Итерационный просмотр):
|
FiniteDifferenceStepSize | Коэффициент размера шага скаляра или вектора для конечных разностей. При установке
sign′(x) = sign(x) кроме sign′(0) = 1. Центральными конечными различиями являются
FiniteDifferenceStepSize расширяется до вектора. Значение по умолчанию: sqrt(eps) для прямых конечных разностей, и eps^(1/3) для центральных конечных разностей.Алгоритм доверительной области использует Для |
FiniteDifferenceType | Конечные различия, используемые для оценки градиентов: Для |
| FunValCheck | Проверьте допустимость значений целевой функции. Настройка по умолчанию, |
MaxFunctionEvaluations | Максимально допустимое число оценок функций, положительное целое число. Значение по умолчанию: Для |
MaxIterations | Максимальное допустимое число итераций, положительное целое число. Значение по умолчанию: Для |
OptimalityTolerance | Допуск окончания для оптимальности первого порядка (положительный скаляр). Значение по умолчанию: Для |
OutputFcn | Укажите одну или несколько пользовательских функций, вызываемых функцией оптимизации в каждой итерации. Передача дескриптора функции или массива ячеек дескрипторов функции. Значение по умолчанию - нет ( |
PlotFcn | Отображает различные показатели прогресса во время выполнения алгоритма; выбрать из предопределенных графиков или написать свой собственный. Передача имени встроенной функции графика, дескриптора функции или массива ячеек имен встроенных функций графика или дескрипторов функций. Для пользовательских функций печати передайте дескрипторы функций. Значение по умолчанию - нет (
Пользовательские функции печати используют тот же синтаксис, что и функции вывода. См. раздел Функции вывода для оптимизации Toolbox™ и Функция вывода и синтаксис функции печати. Для |
SpecifyObjectiveGradient | Градиент для целевой функции, определенной пользователем. См. описание Для |
StepTolerance | Допуск окончания на Для |
TypicalX | Типичный |
trust-region Алгоритм | |
FunctionTolerance | Допуск окончания для значения функции, положительный скаляр. Значение по умолчанию: Для |
HessianFcn | Если установлено значение Если установлено значение Для |
HessianMultiplyFcn | Функция умножения Гессена, заданная как дескриптор функции. Для крупномасштабных структурированных задач эта функция вычисляет матричное изделие Гессена W = hmfun(Hinfo,Y) где Первый аргумент совпадает с третьим аргументом, возвращаемым целевой функцией [f,g,Hinfo] = fun(x)
Примечание Для использования Пример см. в разделе Минимизация с помощью плотных структурированных гессенских линейных уравнений. Для |
| HessPattern | Узор разреженности гессена для конечных разностей. Набор Использовать Если структура неизвестна, не устанавливайте |
| MaxPCGIter | Максимальное количество предварительно обработанных итераций сопряженного градиента (PCG), положительный скаляр. Значение по умолчанию: |
| PrecondBandWidth | Верхняя полоса пропускания устройства предварительного кондиционирования для PCG, неотрицательное целое число. По умолчанию |
SubproblemAlgorithm | Определяет способ вычисления шага итерации. Значение по умолчанию, |
| TolPCG | Допуск окончания для итерации PCG, положительный скаляр. Значение по умолчанию: |
quasi-newton Алгоритм | |
| HessUpdate | Метод выбора направления поиска в алгоритме Квази-Ньютона. Возможны следующие варианты:
|
ObjectiveLimit | Допуск (критерий остановки), являющийся скаляром. Если значение целевой функции в итерации меньше или равно |
UseParallel | Когда |
Пример: options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
problem - Структура проблемыСтруктура проблемы, заданная как структура со следующими полями:
| Имя поля | Вход |
|---|---|
| Целевая функция |
| Начальная точка для x |
| 'fminunc' |
| Параметры, созданные с помощью optimoptions |
Типы данных: struct
x - РешениеРешение, возвращаемое в виде вещественного вектора или вещественного массива. Размер x совпадает с размером x0. Как правило, x является локальным решением проблемы, когда exitflag является положительным. Сведения о качестве решения см. в разделе Когда решатель добьется успеха.
fval - Значение целевой функции при решенииЗначение целевой функции в решении, возвращаемое как вещественное число. Как правило, fval = fun(x).
exitflag - Причина fminunc остановленныйПричина fminunc остановлено, возвращено как целое число.
| Величина градиента меньше |
| Изменение в |
| Изменение значения целевой функции было меньше значения |
| Прогнозируемое снижение целевой функции было меньше, чем |
| Превышено число итераций |
| Алгоритм был завершен функцией вывода. |
| Целевая функция при текущей итерации была ниже |
output - Информация о процессе оптимизацииИнформация о процессе оптимизации, возвращенная в виде структуры с полями:
iterations | Количество выполненных итераций |
funcCount | Количество оценок функций |
firstorderopt | Мера оптимальности первого порядка |
algorithm | Используемый алгоритм оптимизации |
cgiterations | Общее количество итераций PCG ( |
lssteplength | Размер шага поиска строки относительно направления поиска ( |
stepsize | Окончательное смещение в |
message | Выйти из сообщения |
grad - Градиент в раствореГрадиент в решении, возвращенный как действительный вектор. grad дает градиент fun в точке x(:).
hessian - Приблизительный гессенскийПриблизительный Гессен, возвращенный в виде вещественной матрицы. Для значения hessian, см. Гессенский вывод.
quasi-newton алгоритм использует метод Квази-Ньютона BFGS с процедурой поиска кубических строк. Этот квазиньютоновский метод использует формулу BFGS ([1], [5], [8] и [9]) для обновления аппроксимации гессенской матрицы. Можно выбрать формулу DFP ([4], [6] и [7]), которая аппроксимирует обратную матрицу Гессена, установив HessUpdate опция для 'dfp' (и Algorithm опция для 'quasi-newton'). Можно выбрать самый крутой метод спуска, задав HessUpdate кому 'steepdesc' (и Algorithm кому 'quasi-newton'), хотя эта настройка обычно неэффективна. См. fminunc quasi-newton Алгоритм.
trust-region алгоритм требует ввода градиента в fun и набор SpecifyObjectiveGradient кому true использование optimoptions. Этот алгоритм является методом области доверия подпространства и основан на способе Ньютона с внутренним отражением, описанном в [2] и [3]. Каждая итерация включает в себя приблизительное решение большой линейной системы методом предварительно кондиционированных сопряженных градиентов (PCG). См. разделы Алгоритм fminunc trust-region, Методы Trust-region для нелинейной минимизации и Метод предварительно кондиционированного сопряженного градиента.
Задача «Оптимизировать интерактивный редактор» обеспечивает визуальный интерфейс для fminunc.
[1] Бройден, С. Г. «Сходимость класса алгоритмов минимизации двойного ранга». Журнал Inst. Math. Applic., том 6, 1970, стр. 76-90.
[2] Коулман, Т. Ф. и Я. Ли. «Подход» Внутренняя область, область доверия «для нелинейной минимизации с учетом ограничений». Журнал СИАМ по оптимизации, том 6, 1996, стр. 418-445.
[3] Коулман, Т. Ф. и Я. Ли. «О сходимости отражающих методов Ньютона для масштабной нелинейной минимизации, зависящей от границ». Математическое программирование, том 67, номер 2, 1994, стр. 189-224.
[4] Давидон, W.C. «Метод переменной метрики для минимизации». A.E.C. Доклад об исследованиях и разработках, ANL-5990, 1959 год.
[5] Флетчер, Р. «Новый подход к алгоритмам переменной метрики». Компьютерный журнал, том 13, 1970, стр. 317-322.
[6] Флетчер, Р. «Практические методы оптимизации». Том 1, Неограниченная оптимизация, Джон Уайли и сыновья, 1980.
[7] Флетчер, R. и М. Дж. Д. Пауэлл. «Метод быстро сходящегося спуска для минимизации». Компьютерный журнал, т. 6, 1963, стр. 163-168.
[8] Гольдфарб, Д. «Семейство переменных метрических обновлений, полученных вариационными средствами». Математика вычислительной техники, том 24, 1970, стр. 23-26.
[9] Шанно, Д. Ф. «Кондиционирование квази-ньютоновских методов минимизации функций». Математика вычислительной техники, т. 24, 1970, с. 647-656.
Для параллельного выполнения установите 'UseParallel' опция для true.
options = optimoptions('solvername','UseParallel',true)
Дополнительные сведения см. в разделе Использование параллельных вычислений на панели инструментов оптимизации.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.