Этот пример показывает, как решить нелинейную задачу минимизации с тридиагональной матрицей Гессия, аппроксимированной разреженными конечными различиями вместо явных расчетов.
Проблема в том, чтобы найти минимизировать
где = 1000.
n = 1000;
Как использовать trust-region
метод в fminunc
, необходимо вычислить градиент в целевой функции; это не необязательно, как в quasi-newton
способ.
Функция помощника brownfg
в конце этого примера вычисляет целевую функцию и градиент.
Чтобы позволить эффективный расчет разреженного конечноразностного приближения матрицы Гессия , структуру разреженности должен быть предопределен. В этом случае структура Hstr
разреженная матрица доступна в файле brownhstr.mat
. Использование spy
команда, вы можете увидеть это Hstr
действительно, разреженный (только 2998 ненулевых).
load brownhstr
spy(Hstr)
Установите HessPattern
опция для Hstr
использование optimoptions
. Когда такая большая задача имеет очевидную структуру разреженности, не устанавливая HessPattern
опция без необходимости использует большой объем памяти и расчетов, потому что fminunc
пытается использовать конечное дифференцирование в полной гессианской матрице из одного миллиона ненулевых записей.
Чтобы использовать гессианский шаблон разреженности, необходимо использовать trust-region
алгоритм fminunc
. Этот алгоритм также требует, чтобы вы установили SpecifyObjectiveGradient
опция для true
использование optimoptions
.
options = optimoptions(@fminunc,'Algorithm','trust-region',... 'SpecifyObjectiveGradient',true,'HessPattern',Hstr);
Установите целевую функцию на @brownfg
. Установите начальную точку -1 для нечетной компоненты и + 1 для четных компоненты.
xstart = -ones(n,1); xstart(2:2:n,1) = 1; fun = @brownfg;
Решите проблему, позвонив fminunc
использование начальной точки xstart
и опции options
.
[x,fval,exitflag,output] = fminunc(fun,xstart,options);
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
Исследуйте процесс решения и решения.
disp(fval)
7.4739e-17
disp(exitflag)
1
disp(output)
iterations: 7 funcCount: 8 stepsize: 0.0046 cgiterations: 7 firstorderopt: 7.9822e-10 algorithm: 'trust-region' message: '...' constrviolation: []
Функция является суммой степеней квадратов и, следовательно, неотрицательна. Решение fval
почти нуль, поэтому это явно минимум. Выходной флаг 1
также указывает, что fminunc
находит решение. The output
структура показывает, что fminunc
Для достижения решения требуется только семь итераций.
Отобразите самые большие и маленькие элементы решения.
disp(max(x))
1.9955e-10
disp(min(x))
-1.9955e-10
Решение близко к точке, где все элементы x = 0
.
Этот код создает brownfg
вспомогательная функция.
function [f,g] = brownfg(x) % BROWNFG Nonlinear minimization test problem % % Evaluate the function n=length(x); y=zeros(n,1); i=1:(n-1); y(i)=(x(i).^2).^(x(i+1).^2+1) + ... (x(i+1).^2).^(x(i).^2+1); f=sum(y); % Evaluate the gradient if nargout > 1 if nargout > 1 i=1:(n-1); g = zeros(n,1); g(i) = 2*(x(i+1).^2+1).*x(i).* ... ((x(i).^2).^(x(i+1).^2))+ ... 2*x(i).*((x(i+1).^2).^(x(i).^2+1)).* ... log(x(i+1).^2); g(i+1) = g(i+1) + ... 2*x(i+1).*((x(i).^2).^(x(i+1).^2+1)).* ... log(x(i).^2) + ... 2*(x(i).^2+1).*x(i+1).* ... ((x(i+1).^2).^(x(i).^2)); end end