Чтобы использовать функции Global Optimization Toolbox, сначала напишите файл (или анонимную функцию), который вычисляет функцию, которую требуется оптимизировать. Это называется объективной функцией для большинства решателей, или функцией пригодности для ga. Функция должна принимать вектор, длина которого является числом независимых переменных, и возвращать скаляр. Для gamultiobjфункция должна возвращать вектор строки значений целевой функции. Для векторизированных решателей функция должна принимать матрицу, где каждая строка представляет один входной вектор, и возвращать вектор значений целевой функции. В этом разделе показано, как записать файл.
В этом примере показано, как записать файл для функции, которую требуется оптимизировать. Предположим, что необходимо свернуть функцию
6x1 + 4x22 − 3x2).
Файл, вычисляющий эту функцию, должен принимать вектор x длины 2, соответствующей переменным x1 и x2, и возвращающей скаляр, равный значению функции при x.
Выберите Создать > Сценарий (Ctrl + N) в меню Файл MATLAB ®. В редакторе откроется новый файл.
Введите следующие две строки кода:
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. Обязательно передайте опции решателю.
Например, чтобы записать целевую функцию записи файла функции векторизированным образом,
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 |