Найдите минимум неограниченной многомерной функции
Решатель нелинейного программирования.
Находит минимум проблемы заданным
где f (x) является функцией, которая возвращает скаляр.
x является вектором или матрицей; смотрите Матричные аргументы.
x = fminunc(fun,x0)
x = fminunc(fun,x0,options)
x = fminunc(problem)
[x,fval]
= fminunc(___)
[x,fval,exitflag,output]
= fminunc(___)
[x,fval,exitflag,output,grad,hessian]
= fminunc(___)
запускает в точке x
= fminunc(fun
,x0
)x0
и пытается найти локальный минимальный x
функции описанным в fun
. Точка x0
может быть скаляром, вектором или матрицей.
Передача Дополнительных Параметров объясняет, как передать дополнительные параметры целевой функции и нелинейным ограничительным функциям при необходимости.
fminunc
для нелинейных проблем без ограничений. Если ваша проблема имеет ограничения, обычно используйте fmincon
. См. Таблицу решений Оптимизации.
минимизирует x
= fminunc(fun
,x0
,options
)fun
с опциями оптимизации, заданными в options
. Используйте optimoptions
, чтобы установить эти опции.
находит минимум для x
= fminunc(problem
)problem
, где problem
является структурой, описанной во Входных параметрах. Создайте структуру problem
путем экспорта проблемы из приложения Оптимизации, как описано в Экспорте работы.
Минимизируйте функцию .
Запишите анонимную функцию, которая вычисляет цель.
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);
После нескольких итераций fminunc
возвращает решение, x
и значение функции в x
, fval
.
x,fval
x = 2.2500 -4.7500 fval = -16.3750
fminunc
может быть быстрее и более надежным, когда вы обеспечиваете производные.
Запишите целевую функцию, которая возвращает градиент, а также значение функции. Используйте форму conditionalized, описанную во Включении Градиентов и Гессианов. Целевая функция является функцией Розенброка,
который имеет градиент
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
Сохраните этот код как файл на вашем пути MATLAB®, названном rosenbrockwithgrad.m
.
Создайте опции, чтобы использовать градиент целевой функции. Кроме того, установите алгоритм на '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 default value of the function tolerance. <stopping criteria details> x = 1.0000 1.0000
Решите ту же проблему как в Предоставлении Градиент с помощью структуры задачи вместо отдельных аргументов.
Запишите целевую функцию, которая возвращает градиент, а также значение функции. Используйте форму conditionalized, описанную во Включении Градиентов и Гессианов. Целевая функция является функцией Розенброка,
который имеет градиент
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
Сохраните этот код как файл на вашем пути MATLAB, названном rosenbrockwithgrad.m
.
Создайте опции, чтобы использовать градиент целевой функции. Кроме того, установите алгоритм на '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 default value of the function tolerance. <stopping criteria details> x = 1.0000 1.0000
Найдите и местоположение минимума нелинейной функции и значение функции в том минимуме.
Целевая функция
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 default value of the function tolerance. <stopping criteria details> x = -0.6691 0.0000 fval = -0.4052
Выберите опции fminunc
и выходные параметры, чтобы исследовать процесс решения.
Установите опции получать итеративное отображение и использовать алгоритм 'quasi-newton'
.
options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton');
Целевая функция
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 доверительной области или области доверия fmincon отражающие алгоритмы для деталей.
Алгоритм trust-region
позволяет, вы, чтобы предоставить Гессиан умножаете функцию. Эта функция дает результат Векторного произведения времен гессиана, не вычисляя Гессиан непосредственно. Это может сохранить память. Смотрите, что Гессиан Умножает Функцию.
Пример: fun = @(x)sin(x(1))*cos(x(2))
Типы данных: char
| function_handle
| string
x0
Начальная точкаНачальная точка, заданная как вектор действительных чисел или действительный массив. Решатели используют число элементов в x0
и размере x0
, чтобы определить номер и размер переменных, которые принимает fun
.
Пример: x0 = [1,2,3,4]
Типы данных: double
опции
Опции оптимизации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 | Задайте одну или несколько пользовательских функций что оптимизация вызовы функции в каждой итерации. Передайте указатель на функцию или cell-массив указателей на функцию. Значение по умолчанию не ни один ( |
PlotFcn | Строит различные меры прогресса, в то время как алгоритм выполняется; выберите из предопределенных графиков или запишите свое собственное. Передайте встроенное имя функции построения графика, указатель на функцию или массив ячеек встроенных имен функции построения графика или указателей на функцию. Для пользовательских функций построения графика передайте указатели на функцию. Значение по умолчанию не ни один (
Для получения информации о записи пользовательской функции построения графика смотрите Синтаксис Функции построения графика. Для |
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 |
Самым простым способом получить структуру problem является экспорт задачи из Optimization app.
Типы данных: struct
x
РешениеРешение, возвращенное как вектор действительных чисел или действительный массив. Размер x
совпадает с размером x0
. Как правило, x
является локальным решением проблемы, когда exitflag
положителен. Для получения информации о качестве решения смотрите, Когда Решатель Успешно выполнится.
fval
Значение целевой функции в решенииЗначение целевой функции в решении, возвращенном как вещественное число. Обычно fval
= fun(x)
.
exitflag
Обоснуйте остановленный fminunc
Обоснуйте, что остановленный fminunc
, возвратился как целое число.
1 | Значение градиента меньше, чем допуск |
2 | Изменение в |
3 | Изменение в значении целевой функции было меньше, чем допуск |
5 | Предсказанное уменьшение в целевой функции было меньше, чем допуск |
0 | Количество итераций превысило |
-1 | Алгоритм был отключен выходной функцией. |
-3 | Целевая функция при текущей итерации понизилась |
вывод
Информация о процессе оптимизацииИнформация о процессе оптимизации, возвращенном как структура с полями:
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 Алгоритм квазиньютона.
Алгоритм trust-region
требует, чтобы вы предоставили градиент в fun
и установили SpecifyObjectiveGradient
на true
с помощью optimoptions
. Этот алгоритм является методом доверительной области подпространства и основан на внутреннем отражающем методе Ньютона, описанном в [2] и [3]. Каждая итерация включает приближенное решение большой линейной системы с помощью метода предобусловленных методов сопряженных градиентов (PCG). См. fminunc Алгоритм доверительной области, Методы Доверительной области для Нелинейной Минимизации и Предобусловленного Метода сопряженных градиентов.
[1] Broyden, C. G. “Сходимость Класса Алгоритмов Минимизации Двойного Ранга”. Журналируйте Inst. Математика. Приложение., Издание 6, 1970, стр 76–90.
[2] Коулман, T. F. и И. Ли. “Внутренний, Доверительный Подход области для Нелинейной Минимизации Согласно Границам”. SIAM Journal на Оптимизации, Издании 6, 1996, стр 418–445.
[3] Коулман, T. F. и И. Ли. “На Сходимости Отражающих Методов Ньютона для Крупномасштабной Нелинейной Минимизации Согласно Границам”. Математическое программирование, Издание 67, Номер 2, 1994, стр 189–224.
[4] Davidon, W. C. “Переменный метрический метод для минимизации”. A.E.C. Научно-исследовательский отчет, ANL-5990, 1959.
[5] Флетчер, R. “Новый Подход к Переменным Метрическим Алгоритмам”. Компьютерный Журнал, Издание 13, 1970, стр 317–322.
[6] Флетчер, R. “Практические методы оптимизации”. Издание 1, неограниченная оптимизация, Джон Вайли и сыновья, 1980.
[7] Флетчер, R. и М. Дж. Д. Пауэлл. “Быстро Конвергентный Метод Спуска для Минимизации”. Компьютерный Журнал, Издание 6, 1963, стр 163–168.
[8] Goldfarb, D. “Семейство Переменных Метрических Обновлений, Выведенных Вариационными Средствами”. Математика Вычисления, Издания 24, 1970, стр 23–26.
[9] Shanno, D. F. “Создание условий Приближенных методов ньютона для Функциональной Минимизации”. Математика Вычисления, Издания 24, 1970, стр 647–656.
Чтобы запуститься параллельно, установите опцию 'UseParallel'
на true
.
options = optimoptions('solvername','UseParallel',true)
Для получения дополнительной информации смотрите Используя Параллельные вычисления в Optimization Toolbox.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.