Поле Outputfcn
options
задает одну или несколько функций что оптимизация вызовы функции в каждой итерации. Как правило, вы можете использовать выходную функцию, чтобы построить точки в каждой итерации или отобразить количества оптимизации из алгоритма. Используя выходную функцию можно просмотреть, но не установить, количества оптимизации.
Выходные функции intlinprog
и функции построения графика отличаются от тех по другим решателям. См. intlinprog Синтаксис Выходной функции и Функции построения графика.
Чтобы настроить выходную функцию, сделайте следующее:
Запишите выходную функцию как файл функции или локальную функцию.
Используйте optimoptions
, чтобы установить значение Outputfcn
, чтобы быть указателем на функцию, то есть, имя функции, которому предшествуют знак. Например, если выходной функцией является outfun.m
, команда
options = optimoptions(@solvername,'OutputFcn', @outfun);
задает OutputFcn
, чтобы быть указателем на outfun
. Чтобы задать больше чем одну выходную функцию, используйте синтаксис
options = optimoptions(@solvername,'OutputFcn',{@outfun, @outfun2});
Вызовите функцию оптимизации с options
как входной параметр.
Смотрите Выходные функции для примера выходной функции.
Передача Дополнительных Параметров объясняет, как параметризовать выходную функцию OutputFcn
при необходимости.
Функциональная строка определения выходной функции имеет следующую форму:
stop = outfun(x,optimValues,state)
где
x
является точкой, вычисленной алгоритмом в текущей итерации.
optimValues
является структурой, содержащей данные из текущей итерации. Поля в optimValues описывают структуру подробно.
state
является текущим состоянием алгоритма. Состояния Алгоритма перечисляют возможные значения.
stop
является флагом, который является true
или false
в зависимости от того, должна ли стандартная программа оптимизации выйти или продолжиться. Смотрите Флаг Остановки для получения дополнительной информации.
Функция оптимизации передает значения входных параметров к outfun
в каждой итерации.
В следующей таблице перечислены поля структуры optimValues
. Конкретная функция оптимизации возвращает значения только для некоторых из этих полей. Для каждого поля Возвращенный столбцом Функций таблицы перечисляет функции, которые возвращают поле.
Некоторые поля optimValues
соответствуют выходным аргументам функции оптимизации. После итоговой итерации алгоритма оптимизации значение такого поля равняется соответствующему выходному аргументу. Например, optimValues.fval
соответствует выходному аргументу fval
. Так, если вы вызываете fmincon
с выходной функцией и возвращаете fval
, окончательное значение optimValues.fval
равняется fval
. Столбец описания следующей таблицы указывает на поля, которые имеют соответствующий выходной аргумент.
Значения некоторых полей optimValues
отображены в командной строке, когда вы вызываете функцию оптимизации с полем Display
набора options
к 'iter'
, как описано в Итеративном Отображении. Например, optimValues.fval
отображен в столбце f(x)
. Отображаемый столбец Командной строки следующей таблицы указывает на поля, которые можно отобразить в командной строке.
Некоторые поля optimValues
применяются только к определенным алгоритмам:
КАК — active-set
D trust-region-dogleg
IP — interior-point
LM — levenberg-marquardt
Q quasi-newton
SQP — sqp
TR — trust-region
TRR — trust-region-reflective
Некоторые поля optimValues
существуют в определенных решателях или алгоритмах, но всегда заполнены пустыми или нулевыми значениями, бессмысленны - также. Эти поля включают:
constrviolation
для fminunc
TR
и fsolve
TRR
.
procedure
для fmincon
TRR
и SQP
, и для fminunc
.
Поля optimValues
Поле OptimValues (optimValues.field) | Описание | Возвращенный функциями | Отображение командной строки |
---|---|---|---|
| Фактор достижения для многоцелевой проблемы. Для получения дополнительной информации см. Целевой Метод Достижения. | 'none' | |
| Количество итераций метода сопряженных градиентов в текущей итерации оптимизации. |
|
Смотрите итеративное отображение. |
| Максимальное ограничительное нарушение. |
|
Смотрите итеративное отображение. |
| Мера степени вырождения. Точка является вырожденной если Частная производная относительно одной из переменных 0 в точке. Связанное ограничение активно для той переменной в точке. Смотрите степень вырождения. |
| 'none' |
| Косая производная в поисковом направлении. |
|
Смотрите итеративное отображение. |
| Оптимальность первого порядка (зависит от алгоритма). Окончательное значение равняется функции оптимизации вывод |
|
Смотрите итеративное отображение. |
| Совокупное число функциональных оценок. Окончательное значение равняется функции оптимизации вывод |
|
Смотрите итеративное отображение. |
| Значение функции в текущей точке. Окончательное значение равняется функции оптимизации вывод Для |
|
Смотрите итеративное отображение. |
| Текущий градиент целевой функции — или аналитический градиент, если вы обеспечиваете его или приближение конечного дифференцирования. Окончательное значение равняется функции оптимизации вывод |
| 'none' |
| Номер итерации — запускается в |
|
Смотрите итеративное отображение. |
| Параметр Levenberg-Marquardt, | |
|
| Фактическая длина шага разделена на первоначально предсказанную длину шага |
Смотрите итеративное отображение. | |
| Максимальное значение функции | fminimax | 'none' |
|
|
| 'none' |
| Сообщения процедуры. |
|
Смотрите итеративное отображение. |
| Отношение изменения в целевой функции, чтобы измениться в квадратичном приближении. |
| 'none' |
| Вектор невязок. |
Смотрите итеративное отображение. | |
| 2-норма невязки, в квадрате. |
Смотрите итеративное отображение. | |
| Поисковое направление. |
| 'none' |
| Состояние текущего шага доверительной области. Возвращает true, если текущий шаг доверительной области был успешным, и ложным, если шаг доверительной области был неудачен. | | 'none' |
| Текущий размер шага (смещение в |
|
Смотрите итеративное отображение. |
| Радиус доверительной области. |
|
Смотрите итеративное отображение. |
Значение поля degenerate
, которое измеряет степень вырождения текущего x
точки оптимизации, задано можно следующим образом. Во-первых, задайте векторный r
, одного размера как x
, для которого r(i)
является минимальным расстоянием от x(i)
до i th записи нижних и верхних границ, lb
и ub
. Таким образом,
r = min(abs(ub-x, x-lb))
Затем значение degenerate
является минимальной записью векторного r + abs(grad)
, где grad
является градиентом целевой функции. Значение degenerate
0, если существует индекс i
, для которого оба из следующего верны:
grad(i) = 0
x(i)
равняется i th запись или нижней или верхней границы.
В следующей таблице перечислены возможные значения для state
:
Состояние | Описание |
---|---|
| Алгоритм находится в начальном состоянии перед первой итерацией. |
| Алгоритм находится в некоторой в вычислительном отношении дорогой части итерации. В этом состоянии выходная функция может прервать текущую итерацию оптимизации. В это время значения |
| Алгоритм в конце итерации. |
| Алгоритм находится в конечном состоянии после последней итерации. |
Состояние 'interrupt'
происходит только в
алгоритме 'active-set'
fmincon
и fgoalattain
, fminimax
и решателях fseminf
. Там, состояние может произойти перед подпроблемным решением для квадратичного программирования или поиском строки.
Следующий код иллюстрирует, как выходная функция может использовать значение state
, чтобы решить который задачи выполнить в текущей итерации:
switch state case 'iter' % Make updates to plot or guis as needed case 'interrupt' % Probably no action here. Check conditions to see % whether optimization should quit. case 'init' % Setup for plots or guis case 'done' % Cleanup of plots, guis, or final plot otherwise end
stop
выходного аргумента является флагом, который является true
или false
. Флаг говорит функцию оптимизации, должна ли оптимизация выйти или продолжиться. Следующие примеры показывают типичные способы использовать флаг stop
.
Выходная функция может остановить оптимизацию в любой итерации на основе текущих данных в optimValues
. Например, следующие кодовые наборы stop
к true
, если косая производная является меньше, чем .01
:
function stop = outfun(x,optimValues,state) stop = false; % Check if directional derivative is less than .01. if optimValues.directionalderivative < .01 stop = true; end
Если вы разрабатываете графический интерфейс пользователя, чтобы выполнить оптимизацию, можно заставить выходную функцию остановить оптимизацию, когда пользователь нажимает кнопку Stop на графический интерфейсе пользователя. Следующий код показывает, как сделать это, приняв, что коллбэк кнопки Stop хранит значение true
в поле optimstop
структуры handles
под названием hObject
:
function stop = outfun(x,optimValues,state) stop = false; % Check if user has requested to stop the optimization. stop = getappdata(hObject,'optimstop');