exponenta event banner

fminsearch

Найти минимум неограниченной многовариантной функции методом без производных

Описание

Решатель нелинейного программирования. Поиск минимума проблемы, указанного в

minxf (x)

f (x) - функция, возвращающая скаляр, а x - вектор или матрица; см. Аргументы матрицы.

пример

x = fminsearch(fun,x0) начинается в точке x0 и пытается найти локальный минимум x функции, описанной в fun.

пример

x = fminsearch(fun,x0,options) минимизирует с помощью опций оптимизации, указанных в структуре options. Использовать optimset для установки этих параметров.

x = fminsearch(problem) находит минимальное значение для problem, структура, описанная в problem.

пример

[x,fval] = fminsearch(___), для любого предыдущего входного синтаксиса, возвращает в fval значение целевой функции fun на решении x.

[x,fval,exitflag] = fminsearch(___) дополнительно возвращает значение exitflag описывает условие выхода.

пример

[x,fval,exitflag,output] = fminsearch(___) дополнительно возвращает структуру output с информацией о процессе оптимизации.

Примеры

свернуть все

Минимизировать функцию Розенброка, заведомо трудную задачу оптимизации для многих алгоритмов:

f (x) = 100 (x2-x12) 2 + (1-x1) 2.

Функция свернута в точке x = [1,1] с минимальным значением 0.

Установите начальную точку на x0 = [-1.2,1] и минимизировать функцию Розенброка с помощью fminsearch.

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0)
x = 1×2

    1.0000    1.0000

Настройка параметров для мониторинга процесса как fminsearch пытается найти минимум.

Задайте опции для построения графика целевой функции на каждой итерации.

options = optimset('PlotFcns',@optimplotfval);

Установите целевую функцию в функцию Розенброка,

f (x) = 100 (x2-x12) 2 + (1-x1) 2.

Функция свернута в точке x = [1,1] с минимальным значением 0.

Установите начальную точку на x0 = [-1.2,1] и минимизировать функцию Розенброка с помощью fminsearch.

fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
x0 = [-1.2,1];
x = fminsearch(fun,x0,options)

Figure Optimization Plot Function contains an axes. The axes with title Current Function Value: 8.17766e-10 contains an object of type line.

x = 1×2

    1.0000    1.0000

Минимизируйте целевую функцию, значения которой задаются при выполнении файла. Файл функции должен принимать действительный вектор x и вернуть вещественный скаляр, который является значением целевой функции.

Скопируйте следующий код и включите его в качестве файла с именем objectivefcn1.m на пути MATLAB ®.

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

Начать с x0 = [0.25,-0.25] и поиск минимум objectivefcn.

x0 = [0.25,-0.25];
x = fminsearch(@objectivefcn1,x0)
x =

   -0.1696   -0.5086

Иногда целевая функция имеет дополнительные параметры. Эти параметры не являются переменными для оптимизации, они являются фиксированными значениями во время оптимизации. Например, предположим, что у вас есть параметр a в функции типа Розенброка

f (x, a) = 100 (x2-x12) 2 + (a-x1) 2.

Эта функция имеет минимальное значение 0 при x1 = a, x2 = a2. Если, например, a = 3, можно включить параметр в целевую функцию, создав анонимную функцию.

Создайте целевую функцию с ее дополнительными параметрами в качестве дополнительных аргументов.

f = @(x,a)100*(x(2) - x(1)^2)^2 + (a-x(1))^2;

Поместите параметр в рабочую область MATLAB ®.

a = 3;

Создание анонимной функции x один, который включает значение параметра в рабочей области.

fun = @(x)f(x,a);

Решить проблему, начиная с x0 = [-1,1.9].

x0 = [-1,1.9];
x = fminsearch(fun,x0)
x = 1×2

    3.0000    9.0000

Дополнительные сведения об использовании дополнительных параметров в целевой функции см. в разделе Параметризация функций.

Найдите расположение и значение минимума целевой функции с помощью fminsearch.

Запись анонимной целевой функции для задачи с тремя переменными.

x0 = [1,2,3];
fun = @(x)-norm(x+x0)^2*exp(-norm(x-x0)^2 + sum(x));

Найти минимум fun начиная с x0. Найдите также значение минимума.

[x,fval] = fminsearch(fun,x0)
x = 1×3

    1.5359    2.5645    3.5932

fval = -5.9565e+04

Проверьте результаты оптимизации как во время ее выполнения, так и после ее завершения.

Задайте опции для обеспечения итеративного отображения, которое дает информацию об оптимизации при запуске решателя. Также задайте функцию графика, чтобы показать значение целевой функции при запуске решателя.

options = optimset('Display','iter','PlotFcns',@optimplotfval);

Задайте целевую функцию и начальную точку.

function f = objectivefcn1(x)
f = 0;
for k = -10:10
    f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2));
end

Включить код для objectivefcn1 в виде файла по пути MATLAB ®.

x0 = [0.25,-0.25];
fun = @objectivefcn1;

Получите все выходные данные решателя. Эти выходные данные используются для проверки результатов после завершения работы решателя.

[x,fval,exitflag,output] = fminsearch(fun,x0,options)
 
 Iteration   Func-count     min f(x)         Procedure
     0            1         -6.70447         
     1            3         -6.89837         initial simplex
     2            5         -7.34101         expand
     3            7         -7.91894         expand
     4            9         -9.07939         expand
     5           11         -10.5047         expand
     6           13         -12.4957         expand
     7           15         -12.6957         reflect
     8           17         -12.8052         contract outside
     9           19         -12.8052         contract inside
    10           21         -13.0189         expand
    11           23         -13.0189         contract inside
    12           25         -13.0374         reflect
    13           27          -13.122         reflect
    14           28          -13.122         reflect
    15           29          -13.122         reflect
    16           31          -13.122         contract outside
    17           33         -13.1279         contract inside
    18           35         -13.1279         contract inside
    19           37         -13.1296         contract inside
    20           39         -13.1301         contract inside
    21           41         -13.1305         reflect
    22           43         -13.1306         contract inside
    23           45         -13.1309         contract inside
    24           47         -13.1309         contract inside
    25           49          -13.131         reflect
    26           51          -13.131         contract inside
    27           53          -13.131         contract inside
    28           55          -13.131         contract inside
    29           57          -13.131         contract outside
    30           59          -13.131         contract inside
    31           61          -13.131         contract inside
    32           63          -13.131         contract inside
    33           65          -13.131         contract outside
    34           67          -13.131         contract inside
    35           69          -13.131         contract inside
 
Optimization terminated:
 the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 
 and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-04 


x =

   -0.1696   -0.5086


fval =

  -13.1310


exitflag =

     1


output = 

  struct with fields:

    iterations: 35
     funcCount: 69
     algorithm: 'Nelder-Mead simplex direct search'
       message: 'Optimization terminated:...'

Значение exitflag является 1, значение fminsearch вероятно, сходились к локальному минимуму.

output структура показывает количество итераций. Итеративный экран и график также показывают эту информацию. output структура также показывает количество оценок функций, которые отображаются на итеративном экране, но выбранная функция графика не отображается.

Входные аргументы

свернуть все

Функция для минимизации, заданная как дескриптор функции или имя функции. fun - функция, принимающая вектор или массив; x и возвращает действительный скаляр f (целевая функция, оцененная в x).

Определить fun как дескриптор функции для файла:

x = fminsearch(@myfun,x0)

где myfun является функцией MATLAB ®, такой как

function f = myfun(x)
f = ...            % Compute function value at x

Можно также указать fun как дескриптор функции для анонимной функции:

x = fminsearch(@(x)norm(x)^2,x0);

Пример: fun = @(x)-x*exp(-3*x)

Типы данных: char | function_handle | string

Начальная точка, заданная как вещественный вектор или вещественный массив. Решатели используют количество элементов в x0 и размер x0 для определения количества и размера переменных, которые fun принимает.

Пример: x0 = [1,2,3,4]

Типы данных: double

Опции оптимизации, указанные как структура, например optimset возвращает. Вы можете использовать optimset для установки или изменения значений этих полей в структуре опций. Дополнительные сведения см. в разделе Справочник по опциям оптимизации.

Display

Уровень отображения (см. Итерационный просмотр):

  • 'notify' (по умолчанию) вывод отображается только в том случае, если функция не сходится.

  • 'final' отображает только окончательный результат.

  • 'off' или 'none' не отображает выходные данные.

  • 'iter' отображает выходные данные в каждой итерации.

FunValCheck

Проверьте допустимость значений целевой функции. 'on' отображает ошибку, когда целевая функция возвращает значение, complex или NaN. Дефолт 'off' не отображает ошибки.

MaxFunEvals

Максимально допустимое число оценок функций, положительное целое число. Значение по умолчанию: 200*numberOfVariables. См. раздел Допуски и критерии остановки, итерации и подсчеты функций.

MaxIter

Максимальное допустимое число итераций, положительное целое число. Значение по умолчанию: 200*numberOfVariables. См. раздел Допуски и критерии остановки, итерации и подсчеты функций.

OutputFcn

Укажите одну или несколько пользовательских функций, которые функция оптимизации вызывает в каждой итерации, либо как дескриптор функции, либо как массив ячеек дескрипторов функции. Значение по умолчанию - нет ([]). См. раздел Функция вывода и синтаксис функции печати.

PlotFcns

Отображает различные показатели прогресса во время выполнения алгоритма. Выберите из предопределенных графиков или напишите собственные. Передача дескриптора функции или массива ячеек дескрипторов функции. Значение по умолчанию - нет ([]):

  • @optimplotx строит график текущей точки.

  • @optimplotfunccount строит график подсчета функций.

  • @optimplotfval строит график значения функции.

Пользовательские функции печати используют тот же синтаксис, что и функции вывода. См. раздел Функции вывода для оптимизации Toolbox™ и Функция вывода и синтаксис функции печати.

TolFun

Допуск окончания для значения функции, положительный скаляр. Значение по умолчанию: 1e-4. См. раздел Допуски и критерии остановки. В отличие от других решателей, fminsearch останавливается, когда удовлетворяет обоим TolFun и TolX.

TolX

Допуск окончания на x, положительный скаляр. Значение по умолчанию: 1e-4. См. раздел Допуски и критерии остановки. В отличие от других решателей, fminsearch останавливается, когда удовлетворяет обоим TolFun и TolX.

Пример: options = optimset('Display','iter')

Типы данных: struct

Структура проблемы, заданная как структура со следующими полями.

Имя поляВход

objective

Целевая функция

x0

Начальная точка для x

solver

'fminsearch'

options

Структура опций, например, возвращенная optimset

Типы данных: struct

Выходные аргументы

свернуть все

Решение, возвращаемое в виде вещественного вектора или вещественного массива. Размер x совпадает с размером x0. Как правило, x является локальным решением проблемы, когда exitflag является положительным. Сведения о качестве решения см. в разделе Когда решатель добьется успеха.

Значение целевой функции в решении, возвращаемое как вещественное число. Как правило, fval = fun(x).

Причина fminsearch остановлено, возвращено как целое число.

1

Функция сходилась к решению x.

0

Превышено число итераций options.MaxIter или количество превышенных оценок функций options.MaxFunEvals.

-1

Алгоритм был завершен функцией вывода.

Информация о процессе оптимизации, возвращенная в виде структуры с полями:

iterations

Количество итераций

funcCount

Количество оценок функций

algorithm

'Nelder-Mead simplex direct search'

message

Выйти из сообщения

Совет

  • fminsearch минимизирует только вещественные числа, то есть x должен состоять только из вещественных чисел и f (x) должен возвращать только вещественные числа. Если x имеет комплексные значения, разбейте x на действительную и мнимую части.

  • Использовать fminsearch для решения недифференцированных проблем или проблем с неоднородностями, в частности, если нет неоднородности вблизи решения.

  • fminsearch обычно менее эффективен, чем fminunc, особенно для задач размерности больше двух. Однако, когда проблема прерывистая, fminsearch может быть более надежным, чем fminunc.

  • fminsearch не является предпочтительным решателем для задач, которые являются суммами квадратов, то есть вида

    minx‖f (x) 22 = minx (f1 (x) 2 + f2 (x) 2 +... + fn (x) 2)

    Вместо этого используйте lsqnonlin функция, оптимизированная для задач данной формы.

Алгоритмы

fminsearch использует метод симплексного поиска Lagarias et al. [1]. Это метод прямого поиска, который не использует числовые или аналитические градиенты, как в fminunc. Алгоритм подробно описан в fminsearch Algorithm. Алгоритм не гарантированно сходится к локальному минимуму.

Альтернативная функциональность

Приложение

Задача «Оптимизировать интерактивный редактор» обеспечивает визуальный интерфейс для fminsearch.

Ссылки

[1] Лагариас, Дж. С., Дж. А. Ридс, М. Х. Райт и П. Э. Райт. «Свойства сходимости метода Nelder-Mead Simplex в малых размерах». Журнал оптимизации SIAM. Том 9, номер 1, 1998, стр. 112-147.

Расширенные возможности

.
Представлен до R2006a