Иногда цель или ограничительные функции имеют параметры в дополнение к независимой переменной. Дополнительные параметры могут быть данными или могут представлять переменные, которые не изменяются во время оптимизации. Существует три метода передачи этих параметров:
Глобальные переменные неприятны, потому что они не позволяют именам быть снова использованными среди функций. Лучше использовать один из других двух методов.
Обычно для основанной на проблеме оптимизации, вы передаете дополнительные параметры естественным способом. См. Передачу дополнительных параметров в Основанном на проблеме Подходе.
Например, предположите, что вы хотите минимизировать функцию
(1) |
для различных значений a, b и c. Решатели принимают целевые функции, которые зависят только от одной переменной (x в этом случае). Следующие разделы показывают, как предоставить дополнительным параметрам a, b и c. Решениями является для значений параметров a = 4, b = 2.1, и c = 4 около x 0 = [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.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)
Глобальные переменные могут быть неприятными, таким образом, лучше избегать использования их. Кроме того, глобальные переменные перестали работать в параллельных вычислениях. Смотрите Факторы, Которые Влияют на Результаты.
Чтобы использовать глобальные переменные, объявите, что переменные глобальная переменная в рабочей области и в функциях, которые используют переменные.
Запишите файл функции:
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)
Вывод эквивалентен в Анонимных функциях.