Найдите минимум без ограничений многомерной функции
Нелинейный программный решатель.
Находит минимум задачи, заданной в
где 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
может быть быстрее и надежнее, когда вы обеспечиваете производные.
Напишите целевую функцию, которая возвращает градиент, а также значение функции. Используйте обусловленную форму, описанную в Including Gradients и Hessians. Целевой функцией является функция Розенбрка,
который имеет градиент
.
Код целевой функции с градиентом появляется в конце этого примера.
Создайте опции, чтобы использовать градиент целевой функции. Кроме того, установите алгоритм равным '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, используя структуру задачи вместо отдельных аргументов.
Напишите целевую функцию, которая возвращает градиент, а также значение функции. Используйте обусловленную форму, описанную в Including Gradients и Hessians. Целевой функцией является функция Розенбрка,
,
который имеет градиент
.
Код целевой функции с градиентом появляется в конце этого примера.
Создайте опции, чтобы использовать градиент целевой функции. Кроме того, установите алгоритм равным '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
показывает, что решение является локальным оптимумом.
The 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- области reflective алгоритмов для получения дополнительной информации.
The 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
отображение. Эти опции выделены курсивом в следующей таблице. Для получения дополнительной информации см. раздел «Опции представления».
Все алгоритмы | |
| Выберите The |
CheckGradients | Сравните предоставленные пользователем производные (градиент цели) с конечноразличимыми производными. Варианты Для |
Диагностика | Отобразите диагностическую информацию о функции, которая будет минимизирована или решена. Варианты |
DiffMaxChange | Максимальное изменение переменных для градиентов конечных различий (a положительной скалярной величины). Значение по умолчанию является |
DiffMinChange | Минимальное изменение переменных для градиентов с конечной разностью (a положительной скалярной величины). Значение по умолчанию является |
Display | Level of display (см. Итеративное отображение):
|
FiniteDifferenceStepSize | Скаляр или векторный коэффициент размера для конечных различий. Когда вы задаете
sign′(x) = sign(x) кроме sign′(0) = 1 . Центральные конечные различия
FiniteDifferenceStepSize расширяется до вектора. Значение по умолчанию является sqrt(eps) для прямых конечных различий и eps^(1/3) для центральных конечных различий.Алгоритм доверительной области использует Для |
FiniteDifferenceType | Конечные различия, используемые для оценки градиентов, либо Для |
FunValCheck | Проверьте, действительны ли значения целевой функции. Настройка по умолчанию, |
MaxFunctionEvaluations | Максимально допустимое количество вычислений функции, положительное целое число. Значение по умолчанию Для |
MaxIterations | Максимально допустимое количество итераций, положительное целое число. Значение по умолчанию Для |
OptimalityTolerance | Допуск завершения по оптимальности первого порядка (a положительной скалярной величины). Значение по умолчанию является Для |
OutputFcn | Задайте одну или несколько пользовательских функций, которые вызываются функциями оптимизации при каждой итерации. Передайте указатель на функцию или cell-массив указателей на функцию. Значением по умолчанию является none ( |
PlotFcn | Строит графики различных показателей прогресса во время выполнения алгоритма; выберите из предопределенных графиков или напишите свои собственные. Передайте встроенное имя функции построения графика, указатель на функцию или массив ячеек со встроенными именами функций построения графика или указателями на функцию. Для пользовательских функций построения графика передайте указатели на функцию. Значением по умолчанию является none (
Пользовательские функции построения графика используют тот же синтаксис, что и выходные функции. Смотрите Выходные функции для Optimization Toolbox™ и синтаксиса выходной функции и функции построения графика. Для |
SpecifyObjectiveGradient | Градиент для целевой функции, заданный пользователем. См. описание Для |
StepTolerance | Допуск завершения на Для |
TypicalX | Типичные The |
trust-region Алгоритм | |
FunctionTolerance | Отклонение завершения функции от значения, a положительной скалярной величины. Значение по умолчанию является Для |
HessianFcn | Если установлено значение Если установлено значение Для |
HessianMultiplyFcn | Функция умножения Гессиана, заданная как указатель на функцию. Для крупномасштабных структурированных задач эта функция вычисляет матрицу Гессиана продукта W = hmfun(Hinfo,Y) где Первый аргумент аналогичен третьему аргументу, возвращенному целевой функцией [f,g,Hinfo] = fun(x)
Примечание Как использовать Для получения примера смотрите Минимизацию с плотной структурированной Гессианской, Линейных Равенств. Для |
HessPattern | Шаблон разреженности Гессиана для конечного дифференцирования. Задайте Использование Когда структура неизвестна, не устанавливайте |
MaxPCGIter | Максимальное количество предварительно обусловленных итераций сопряженного градиента (PCG), a положительной скалярной величины. Значение по умолчанию является |
PrecondBandWidth | Верхняя шумовая полоса предкондиционера для PCG, неотрицательного целого числа. По умолчанию, |
SubproblemAlgorithm | Определяет, как вычисляется шаг итерации. Значение по умолчанию, |
TolPCG | Допуск завершения на итерации PCG, a положительной скалярной величины. Значение по умолчанию является |
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
stop, возвращается как целое число.
| Величина градиента меньше, чем |
| Изменение в |
| Изменение значения целевой функции было меньше, чем |
| Предсказанное уменьшение целевой функции было меньше |
| Превышено количество итераций |
| Алгоритм был остановлен выходной функцией. |
| Целевая функция при текущей итерации пошла ниже |
output
- Информация о процессе оптимизацииИнформация о процессе оптимизации, возвращенная как структура с полями:
iterations | Количество проделанных итераций |
funcCount | Количество вычислений функции |
firstorderopt | Мера оптимальности первого порядка |
algorithm | Используемый алгоритм оптимизации |
cgiterations | Общее количество итераций PCG ( |
lssteplength | Размер линии шага поиска относительно направления поиска ( |
stepsize | Окончательное перемещение в |
message | Выходное сообщение |
grad
- Градиент в решенииГрадиент в решении, возвращенный как вектор действительных чисел. grad
задает градиент fun
в точке x(:)
.
hessian
- Приблизительный ГессианАппроксимируйте Гессиана, возвращённом как действительная матрица. Для смысла hessian
, см. Гессиан Выхода.
The 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.
The trust-region
алгоритм требует, чтобы вы подали градиент в fun
и установите SpecifyObjectiveGradient
на true
использование optimoptions
. Этот алгоритм является подпространственным методом доверительной области и основан на интерьерно-отражающем методе Ньютона, описанном в [2] и [3]. Каждая итерация включает приблизительное решение большой линейной системы с использованием метода предварительно обусловленных сопряженных градиентов (PCG). См. Алгоритм доверительной области Fminunc, Методы доверительной области для нелинейной минимизации и Предварительно обусловленный сопряженный градиентный метод.
Задача Optimize Live Editor обеспечивает визуальный интерфейс для fminunc
.
[1] Broyden, C. G. «Сходимость класса алгоритмов минимизации двойного ранга». Journal Inst. Math. Applic., Vol. 6, 1970, pp. 76-90.
[2] Коулман, Т. Ф. и Я. Ли. Подход внутренней доверительной области для нелинейной минимизации с учетом границ. SIAM Journal on Optimization, Vol. 6, 1996, pp. 418-445.
[3] Коулман, Т. Ф. и Я. Ли. «О сходимости отражающих методов Ньютона для крупномасштабной нелинейной минимизации, подверженной границам». Математическое программирование, том 67, номер 2, 1994, стр. 189-224.
[4] Davidon, W. C. «Переменный метрический метод минимизации». A.E.C. Доклад о научных исследованиях и разработках, ANL-5990, 1959 год.
[5] Fletcher, R. «Новый подход к переменным метрическим алгоритмам». Computer Journal, Vol. 13, 1970, pp. 317-322.
[6] Fletcher, R. «Практические методы оптимизации». Том 1, Оптимизация без ограничений, Джон Уайли и сыновья, 1980.
[7] Флетчер, Р. и М. Дж. Д. Пауэлл. «Быстро сходящийся метод спуска для минимизации». Computer Journal, Vol. 6, 1963, pp. 163-168.
[8] Goldfarb, D. «A Family of Variable Metric Updates Derived by Variational Means». Математика вычислений, том 24, 1970, стр. 23-26.
[9] Shanno, D. F. «Conditioning of Quasi-Newton Methods for Function Minimization». Математика вычислений, том 24, 1970, стр. 647-656.
Чтобы запустить параллельно, установите 'UseParallel'
опция для true
.
опции = optimoptions (
'solvername
',' UseParallel ', true)
Для получения дополнительной информации смотрите Использование параллельных вычислений в Optimization Toolbox.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.