Найдите минимум неограниченной многомерной функции
Решатель нелинейного программирования.
Находит минимум целевой функции
где f (x) является функцией, которая возвращает скаляр.
x является вектором или матрицей; смотрите Матричные аргументы.
запускает в точке x
= fminunc(fun
,x0
)x0
и попытки найти локальный минимальный x
из функции, описанной в fun
. Точка x0
может быть скаляр, вектор или матрица.
Примечание
Передача Дополнительных Параметров объясняет, как передать дополнительные параметры целевой функции и нелинейным ограничительным функциям при необходимости.
fminunc
для нелинейных проблем без ограничений. Если ваша проблема имеет ограничения, обычно используйте fmincon
. См. таблицу решений оптимизации.
минимизирует x
= fminunc(fun
,x0
,options
)fun
с опциями оптимизации, заданными в options
Использование optimoptions
установить эти опции.
Минимизируйте функцию .
Для этого запишите анонимной функции 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
может быть быстрее и более надежным, когда вы обеспечиваете производные.
Запишите целевую функцию, которая возвращает градиент, а также значение функции. Используйте форму conditionalized, описанную во Включении Градиентов и Гессианов. Целевая функция является функцией Розенброка,
который имеет градиент
.
Код для целевой функции с градиентом появляется в конце этого примера.
Создайте опции, чтобы использовать градиент целевой функции. Кроме того, установите алгоритм на '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
Решите ту же задачу как в Градиенте Предоставления с помощью структуры задачи вместо отдельных аргументов.
Запишите целевую функцию, которая возвращает градиент, а также значение функции. Используйте форму conditionalized, описанную во Включении Градиентов и Гессианов. Целевая функция является функцией Розенброка,
,
который имеет градиент
.
Код для целевой функции с градиентом появляется в конце этого примера.
Создайте опции, чтобы использовать градиент целевой функции. Кроме того, установите алгоритм на '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
Найдите и местоположение минимума нелинейной функции и значение функции в том минимуме. Целевая функция
.
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');
Целевая функция
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
.
fminunc
передачи x
к вашей целевой функции в форме x0
аргумент. Например, если x0
5 3 массив, затем fminunc
передачи x
к fun
как 5 3 массив.
Задайте 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
options
— Опции оптимизацииoptimoptions
| структура, такая как optimset
возвращаетсяОпции оптимизации в виде выхода optimoptions
или структура такой как optimset
возвращается.
Некоторые опции применяются ко всем алгоритмам, и другие важны для конкретных алгоритмов. Дополнительную информацию см. в Ссылке Опций Оптимизации.
Некоторые опции отсутствуют в optimoptions
отображение. Эти опции появляются курсивом в следующей таблице. Для получения дополнительной информации, Опции вида на море.
Все алгоритмы | |
| Выберите
|
CheckGradients | Сравните предоставленные пользователями производные (градиент цели) к производным конечного дифференцирования. Выбором является Для |
Диагностика | Отобразите диагностическую информацию о функции, которая будет минимизирована или решена. Выбором является |
DiffMaxChange | Максимальное изменение в переменных для градиентов конечной разности (положительная скалярная величина). Значением по умолчанию является |
DiffMinChange | Минимальное изменение в переменных для градиентов конечной разности (положительная скалярная величина). |
Display | Level of display (см. Итеративное Отображение):
|
FiniteDifferenceStepSize | Скалярный или векторный фактор размера шага для конечных разностей. Когда вы устанавливаете
sign′(x) = sign(x) кроме sign′(0) = 1 . Центральные конечные разности
FiniteDifferenceStepSize расширяется до вектора. Значением по умолчанию является sqrt(eps) для прямых конечных разностей и eps^(1/3) для центральных конечных разностей.Алгоритм доверительной области использует Для |
FiniteDifferenceType | Конечными разностями, используемыми, чтобы оценить градиенты, является любой Для |
FunValCheck | Проверяйте, допустимы ли значения целевой функции. Настройка по умолчанию, |
MaxFunctionEvaluations | Максимальное количество позволенных вычислений функции, положительное целое число. Значением по умолчанию является Для |
MaxIterations | Максимальное количество позволенных итераций, положительное целое число. Значением по умолчанию является Для |
OptimalityTolerance | Допуск завершения на оптимальности первого порядка (положительная скалярная величина). Значением по умолчанию является Для |
OutputFcn | Задайте одну или несколько пользовательских функций, которые вызывает на каждой итерации оптимизационная функция. Передайте указатель на функцию или cell-массив указателей на функцию. Значение по умолчанию не ни один ( |
PlotFcn | Строит различные показатели прогресса, в то время как алгоритм выполняется; выберите из предопределенных графиков или запишите свое собственное. Передайте встроенное имя функции построения графика, указатель на функцию или массив ячеек встроенных имен функции построения графика или указателей на функцию. Для пользовательских функций построения графика передайте указатели на функцию. Значение по умолчанию не ни один (
Пользовательские функции построения графика используют тот же синтаксис в качестве выходных функций. Смотрите Выходные функции для Optimization 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
остановленный, возвращенный как целое число.
1 | Величина градиента меньше, чем |
2 | Изменитесь в |
3 | Изменение в значении целевой функции было меньше |
5 | Предсказанное уменьшение в целевой функции было меньше |
0 | Количество итераций превысило |
-1 | Алгоритм был отключен выходной функцией. |
-3 | Целевая функция при текущей итерации понизилась |
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 Алгоритм квазиньютона.
trust-region
алгоритм требует, чтобы вы предоставили градиент в fun
и набор SpecifyObjectiveGradient
к true
использование optimoptions
. Этот алгоритм является методом доверительной области подпространства и основан на внутреннем отражающем методе Ньютона, описанном в [2] и [3]. Каждая итерация включает приближенное решение большой линейной системы с помощью метода предобусловленных методов сопряженных градиентов (PCG). См. fminunc Алгоритм доверительной области, Методы Доверительной области для Нелинейной Минимизации и Предобусловленного Метода сопряженных градиентов.
Оптимизировать задача Live Editor обеспечивает визуальный интерфейс для 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
.
опции = optimoptions ('
solvername
', 'UseParallel', верный)
Для получения дополнительной информации смотрите Используя Параллельные вычисления в Optimization Toolbox.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.