Чтобы использовать функции 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
. Для patternsearch
или paretosearch
, также установите UseCompletePoll
на true
. Обязательно передайте опции решателю.
Для примера, чтобы написать целевую функцию Write a Файла функции векторизованным способом,
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
, ваша целевая функция может вернуть производные (градиент, якобиан или гессиан). Для получения дополнительной информации о том, как включить этот синтаксис в вашу целевую функцию, смотрите Включение Градиентов и Гессианов. Использовать optimoptions
чтобы задать опции так, чтобы ваш решатель использовал производную информацию:
Локальный решатель = fmincon, fminunc
Состояние | Настройка опций |
---|---|
Целевая функция содержит градиент | 'SpecifyObjectiveGradient' = true ; Посмотреть, как включить градиенты |
Целевая функция содержит Гессиана | 'HessianFcn' = 'objective' или указатель на функцию; Увидеть в том числе Гессиан |
Функция ограничения содержит градиент | 'SpecifyConstraintGradient' = true ; см. Включение градиентов в функции ограничений |
Локальный решатель = lsqcurvefit, lsqnonlin
Состояние | Настройка опций |
---|---|
Целевая функция содержит якобиан | 'SpecifyObjectiveGradient' = true |