Чтобы использовать функции Global Optimization Toolbox, сначала запишите файл (или анонимная функция), который вычисляет функцию, которую вы хотите оптимизировать. Это вызвано целевая функция для большинства решателей или функция фитнеса для ga
. Функция должна принять вектор, длина которого является количеством независимых переменных, и возвратите скаляр. Для gamultiobj
функция должна возвратить вектор - строку из значений целевой функции. Для векторизованных решателей функция должна принять матрицу, где каждая строка представляет один входной вектор, и возвратите вектор значений целевой функции. Этот раздел показывает, как записать файл.
Этот пример показывает, как записать файл для функции, которую вы хотите оптимизировать. Предположим, что вы хотите минимизировать функцию
Файл, который вычисляет эту функцию, должен принять векторный x
длины 2, соответствуя переменным x 1 и x 2, и возвратить скаляр, равный значению функции в x
.
Выберите New > Script (Ctrl+N) из меню MATLAB® File. Новый файл открывается в редакторе.
Введите следующие две строки кода:
function z = my_fun(x) z = x(1)^2 - 2*x(1)*x(2) + 6*x(1) + 4*x(2)^2 - 3*x(2);
Сохраните файл в папке на пути MATLAB.
Проверяйте, что файл возвращает правильное значение.
my_fun([2 3]) ans = 31
Для gamultiobj
предположите, что у вас есть три цели. Ваша целевая функция возвращает трехэлементный вектор, состоящий из трех значений целевой функции:
function z = my_fun(x) z = zeros(1,3); % allocate output z(1) = x(1)^2 - 2*x(1)*x(2) + 6*x(1) + 4*x(2)^2 - 3*x(2); z(2) = x(1)*x(2) + cos(3*x(2)/(2+x(1))); z(3) = tanh(x(1) + x(2));
ga
, gamultiobj
, paretosearch
, particleswarm
и решатели patternsearch
опционально вычисляют целевые функции набора векторов в одном вызове функции. Этот метод может занять меньше времени, чем вычисление целевых функций векторов последовательно. Этот метод называется векторизованным вызовом функции.
Вычислить векторизованным способом:
Запишите свою целевую функцию в:
Примите матрицу с произвольным числом строк.
Возвратите вектор значений функции каждой строки.
Для gamultiobj
или paretosearch
, возвратите матрицу, где каждая строка содержит значения целевой функции соответствующей входной строки матрицы.
Если у вас есть нелинейное ограничение, несомненно, напишут ограничение в векторизованном виде. Для получения дополнительной информации смотрите Векторизованные Ограничения.
Установите опцию UseVectorized
на true
с помощью optimoptions
или установите User function evaluation > Evaluate objective/fitness and constraint functions на vectorized
в приложении Оптимизации. Для patternsearch
или paretosearch
, также устанавливает UseCompletePoll
на true
. Обязательно передайте опции решателю.
Например, чтобы записать целевую функцию Записи Файл функции векторизованным способом,
function z = my_fun(x) z = x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + ... 4*x(:,2).^2 - 3*x(:,2);
Использовать my_fun
в качестве векторизованной целевой функции для patternsearch
:
options = optimoptions('patternsearch','UseCompletePoll',true,'UseVectorized',true); [x fval] = patternsearch(@my_fun,[1 1],[],[],[],[],[],[],... [],options);
Использовать my_fun
в качестве векторизованной целевой функции для ga
:
options = optimoptions('ga','UseVectorized',true); [x fval] = ga(@my_fun,2,[],[],[],[],[],[],[],options);
Для gamultiobj
или paretosearch
,
function z = my_fun(x) z = zeros(size(x,1),3); % allocate output z(:,1) = x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + ... 4*x(:,2).^2 - 3*x(:,2); z(:,2) = x(:,1).*x(:,2) + cos(3*x(:,2)./(2+x(:,1))); z(:,3) = tanh(x(:,1) + x(:,2));
Использовать my_fun
в качестве векторизованной целевой функции для gamultiobj
:
options = optimoptions('ga','UseVectorized',true); [x fval] = gamultiobj(@my_fun,2,[],[],[],[],[],[],options);
Для получения дополнительной информации о записи векторизованных функций для patternsearch
смотрите, Векторизуют Функции Цели и Ограничения. Для получения дополнительной информации о записи векторизованных функций для ga
смотрите, Векторизуют Функцию Фитнеса.
Если вы используете GlobalSearch
или MultiStart
, ваша целевая функция может возвратить производные (градиент, якобиан или Гессиан). Для получения дополнительной информации о том, как включать этот синтаксис в вашу целевую функцию, смотрите Включая Градиенты и Гессианы (Optimization Toolbox). Используйте optimoptions
, чтобы установить опции так, чтобы ваш решатель использовал производную информацию:
Локальный Решатель = fmincon, fminunc
Условие | Установка опции |
---|---|
Целевая функция содержит градиент | 'SpecifyObjectiveGradient' = true ; смотрите, Как Включать Градиенты (Optimization Toolbox) |
Целевая функция содержит Гессиан | 'HessianFcn' = 'objective' или указатель на функцию; смотрите Включая Гессианы (Optimization Toolbox) |
Ограничительная функция содержит градиент | 'SpecifyConstraintGradient' = true ; смотрите Включая Градиенты в Ограничительных Функциях (Optimization Toolbox) |
Локальный Решатель = lsqcurvefit, lsqnonlin
Условие | Установка опции |
---|---|
Целевая функция содержит якобиан | 'SpecifyObjectiveGradient' = true |