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)

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

Level of 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