exponenta event banner

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

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

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

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

Как правило, для оптимизации на основе проблем дополнительные параметры передаются естественным образом. См. раздел Дополнительные параметры передачи в подходе, основанном на проблемах.

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

f (x) = (a bx12 + x14/3) x12 + x1x2 + (− c + cx22) x22(1)

для различных значений a, b и c. Решатели принимают целевые функции, зависящие только от одной переменной (в данном случае - x). В следующих разделах показано, как обеспечить дополнительные параметры a, b и C. Решения для значений параметров a = 4, b = 2,1 и c = 4 вблизи x0  = [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)

Выходные данные такие же, как в анонимных функциях.

Связанные темы