Функция минимизации с векторным вводом в MATLAB - PullRequest
1 голос
/ 15 апреля 2019

Я хочу свернуть функцию, как показано ниже:

enter image description here

Здесь n может быть 5,10,50 и т. Д. Я хочу использовать Matlab и хочу использовать метод градиентного спуска и квазиньютоновский метод с обновлением BFGS, чтобы решить эту проблему вместе с поиском обратной линии. Я новичок в Matlab. Может кто-нибудь помочь, пожалуйста? Я могу найти решение для подобной проблемы по этой ссылке: https://www.mathworks.com/help/optim/ug/unconstrained-nonlinear-optimization-algorithms.html.

Но я действительно не знаю, как создать векторную функцию в Matlab (в моем случае input x может быть n-мерным вектором).

1 Ответ

4 голосов
/ 15 апреля 2019

Вам придется совершить большой скачок, чтобы достичь того, чего вы хотите - могу ли я предложить сначала пройти какое-то базовое руководство , чтобы переварить базовый синтаксис и понятия MATLAB? Еще одно полезное прочтение - самый простой пример оптимизации без ограничений в документации . Тем не менее, ответ на ваш вопрос касается только базового синтаксиса, поэтому мы, тем не менее, можем его быстро пройти.

Абсолютным минимумом для вызова неограниченных алгоритмов нелинейной оптимизации на панели инструментов оптимизации является формулировка целевой функции . Предполагается, что эта функция возвращает значение функции f вашей функции в любой заданной точке x, и в вашем случае она читает

function f = objfun(x)
    f = sum(100 * (x(2:end) - x(1:end-1).^2).^2 + (1 - x(1:end-1)).^2);
end

Обратите внимание, что

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

Теперь все, что вам нужно сделать, - это вызвать соответствующий алгоритм оптимизации, скажем, квазиньютоновский метод, из командного окна:

n = 10; % Use n variables
options = optimoptions(@fminunc,'Algorithm','quasi-newton'); % Use QM method
x0 = rand(n,1); % Random starting guess
[x,fval,exitflag] = fminunc(@objfun, x0, options); % Solve!
fprintf('Final objval=%.2e, exitflag=%d\n', fval, exitflag);

На моей машине я вижу, что алгоритм сходится:

Найден локальный минимум.

Оптимизация завершена, поскольку размер градиента меньше значение по умолчанию для допуска оптимальности.

Конечный объект = 5.57e-11, флаг выхода = 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...