Передача дополнительных параметров

Дополнительные параметры, фиксированные переменные или данные

Иногда функции объектива или ограничения имеют параметры в дополнение к независимой переменной. Дополнительные параметры могут быть данными или могут представлять переменные, которые не изменяются во время оптимизации. Существует три метода передачи этих параметров:

Глобальные переменные вызывают проблемы, поскольку они не позволяют повторно использовать имена среди функций. Лучше использовать один из двух других методов.

Обычно для основанной на проблеме оптимизации вы передаете дополнительные параметры естественным способом. Смотрите Передайте Дополнительные Параметры в Основанном на Проблеме Подходе.

Например, предположим, что вы хотите минимизировать функцию

f(x)=(abx12+x14/3)x12+x1x2+(c+cx22)x22(1)

для различных значений a, b и c. Решатели принимают целевые функции, которые зависят только от одной переменной (x в данном случае). В следующих разделах показано, как обеспечить дополнительные параметры a, b и c. Решения для значений параметров a = 4, b = 2,1 и c = 4 около x  0 = [ 0,5 0,5] использованиеfminunc.

Анонимные функции

Для передачи параметров с помощью анонимных функций:

  1. Запишите файл, содержащий следующий код:

    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;

  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);

  3. Вызовите решатель 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.8696
Теперь звоните lsqcurvefit:
% 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
end
Целевой функцией является вложенная функция nestedfun, который имеет доступ к переменным 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)
Выходы те же, что и в Анонимные Функции.

Глобальные переменные

Глобальные переменные могут быть неприятными, поэтому лучше избегать их использования. Кроме того, глобальные переменные отказывают в параллельных расчетах. Смотрите факторы, которые влияют на результаты.

Чтобы использовать глобальные переменные, объявите переменные глобальными в рабочей области и в функциях, которые используют переменные.

  1. Запись файла функции:

    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;

  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)

Выходы те же, что и в Анонимные Функции.

Похожие темы