Вам придется совершить большой скачок, чтобы достичь того, чего вы хотите - могу ли я предложить сначала пройти какое-то базовое руководство , чтобы переварить базовый синтаксис и понятия 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
Обратите внимание, что
мы выбираем отдельные компоненты вектора x
с помощью индексации матрицы , и это
обозначение .^
влияет на то, что операнд должен быть в квадрате поэлементно .
Для простоты сохраните эту функцию в файле 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