fminsearch

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

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

minxf(x)

f (x) является функцией, которая возвращает скаляр, и x является вектором или матрицей.

Синтаксис

x = fminsearch(fun,x0)
x = fminsearch(fun,x0,options)
x = fminsearch(problem)
[x,fval] = fminsearch(___)
[x,fval,exitflag] = fminsearch(___)
[x,fval,exitflag,output] = fminsearch(___)

Описание

пример

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)

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, чтобы определить номер и размер переменных, которые принимает 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

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

PlotFcns

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

  • @optimplotx строит текущую точку.

  • @optimplotfunccount строит функциональное количество.

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

Для получения информации о записи пользовательской функции построения графика смотрите Функции построения графика.

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 использует симплексный метод поиска Lagarias и др. [1]. Это - прямой метод поиска, который не использует числовые или аналитические градиенты в качестве в fminunc. Алгоритм описан подробно в fminsearch Алгоритме. Алгоритм, как гарантируют, не будет сходиться к локальному минимуму.

Ссылки

[1] Lagarias, J. C. Дж. А. Ридс, М. Х. Райт и П. Э. Райт. “Свойства сходимости Симплекс-метода Nelder-меда в Низких Размерностях”. SIAM Journal Оптимизации. Издание 9, Номер 1, 1998, стр 112–147.

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

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