Иногда функции объектива или ограничения имеют параметры в дополнение к независимой переменной. Дополнительными параметрами могут быть данные или переменные, которые не изменяются во время оптимизации. Существует три способа передачи этих параметров:
Глобальные переменные вызывают проблемы, поскольку они не позволяют повторно использовать имена между функциями. Лучше использовать один из двух других методов.
Как правило, для оптимизации на основе проблем дополнительные параметры передаются естественным образом. См. раздел Дополнительные параметры передачи в подходе, основанном на проблемах.
Например, предположим, что необходимо свернуть функцию
| (− c + cx22) x22 | (1) |
для различных значений a, b и c. Решатели принимают целевые функции, зависящие только от одной переменной (в данном случае - x). В следующих разделах показано, как обеспечить дополнительные параметры a, b и C. Решения для значений параметров a = 4, b = 2,1 и c = 4 вблизи x0 = [0,5 0,5] с использованием fminunc.
Для передачи параметров с помощью анонимных функций:
Напишите файл, содержащий следующий код:
function y = parameterfun(x,a,b,c)
y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + ...
(-c + c*x(2)^2)*x(2)^2;Назначение значений параметрам и определение дескриптора функции f к анонимной функции путем ввода следующих команд в подсказке MATLAB ®:
a = 4; b = 2.1; c = 4; % Assign parameter values x0 = [0.5,0.5]; f = @(x)parameterfun(x,a,b,c);
Вызов решателя fminunc с помощью анонимной функции:
[x,fval] = fminunc(f,x0)
Local minimum found. Optimization completed because the size of the gradient is less than the default value of the function tolerance. x = -0.0898 0.7127 fval = -1.0316
Примечание
В анонимной функции передаются параметры, существующие на момент создания анонимной функции. Рассмотрим пример
a = 4; b = 2.1; c = 4; f = @(x)parameterfun(x,a,b,c)
Предположим, что вы впоследствии измените, a до 3 и выполнить
[x,fval] = fminunc(f,x0)
Вы получаете тот же ответ, что и раньше, так как parameterfun использование a = 4, значение, когда f был создан.
Чтобы изменить параметры, передаваемые функции, обновите анонимную функцию, повторно введя ее:
a = 3; f = @(x)parameterfun(x,a,b,c)
Можно создать анонимные функции с несколькими аргументами. Например, для использования lsqcurvefit, сначала создайте функцию, которая принимает два входных аргумента, x и xdata:
fh = @(x,xdata)(sin(x).*xdata +(x.^2).*cos(xdata));
x = pi; xdata = pi*[4;2;3];
fh(x, xdata)
ans =
9.8696
9.8696
-9.8696lsqcurvefit:% Assume ydata exists x = lsqcurvefit(fh,x,xdata,ydata)
Чтобы передать параметры для уравнения 1 через вложенную функцию, запишите один файл, который
Принимает a, b, c, и x0 в качестве входных данных
Содержит целевую функцию как вложенную
Требования fminunc
Вот код файла функции для этого примера:
function [x,fval] = runnested(a,b,c,x0)
[x,fval] = fminunc(@nestedfun,x0);
% Nested function that computes the objective function
function y = nestedfun(x)
y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) +...
(-c + c*x(2)^2)*x(2)^2;
end
endnestedfun, который имеет доступ к переменным a, b, и c.Для выполнения оптимизации введите:
a = 4; b = 2.1; c = 4;% Assign parameter values x0 = [0.5,0.5]; [x,fval] = runnested(a,b,c,x0)
Глобальные переменные могут быть неприятными, поэтому их лучше избегать использования. Кроме того, глобальные переменные терпят неудачу при параллельных вычислениях. См. раздел Факторы, влияющие на результаты.
Для использования глобальных переменных объявите переменные глобальными в рабочей области и в функциях, использующих переменные.
Запишите файл функции:
function y = globalfun(x)
global a b c
y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + ...
(-c + c*x(2)^2)*x(2)^2;В рабочей области MATLAB определите переменные и выполните команду fminunc:
global a b c; a = 4; b = 2.1; c = 4; % Assign parameter values x0 = [0.5,0.5]; [x,fval] = fminunc(@globalfun,x0)
Выходные данные такие же, как в анонимных функциях.