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

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

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

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

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

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

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 через вложенную функцию, запишите один файл это

  • Принимает aBC, и 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, который имеет доступ к переменным aB, и 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)

Выход эквивалентен в Анонимных функциях.

Похожие темы