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 и размер 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 строит значение функции.

Пользовательские функции построения графика используют тот же синтаксис в качестве выходных функций. Смотрите Выходные функции для Optimization 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 не предпочтительный решатель для проблем, которые являются суммами квадратов, то есть, формы

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

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

Алгоритмы

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

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

Приложение

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

Ссылки

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

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

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