Многие решатели позволяют предоставить функцию, которая вычисляет первые производные (градиенты или якобианы) целевых функций или функций ограничения. Можно проверить, соответствуют ли производные, рассчитанные функцией, аппроксимациям конечных разностей. Эта проверка поможет вам диагностировать правильность производной функции.
Если компонент функции градиента меньше 1, «совпадение» означает абсолютную разность градиентной функции и конечноразностное приближение этой составляющей меньше, чем 1e-6.
В противном случае, «match» означает, что относительная разница меньше, чем 1e-6.
CheckGradients опция вызывает проверку решателем поставляемой производной по аппроксимации конечных разностей только в одной точке. Если конечное различие и поставляемые производные не совпадают, решатель ошибается. Если производные соответствуют в пределах 1e-6решатель сообщает о вычисленных различиях и продолжает итерацию без дальнейших проверок производных. Решатели проверяют совпадение в точке, которая является небольшим случайным возмущением начальной точки x0, изменен, чтобы быть в пределах любых границ. Решатели не включают вычисления для CheckGradients в подсчете функций; см. Итерации и подсчеты функций.
В командной строке MATLAB ®:
Установите SpecifyObjectiveGradient или SpecifyConstraintGradient опции для true использование optimoptions. Убедитесь, что целевые функции или функции ограничения предоставляют соответствующие производные.
Установите CheckGradients опция для true.
Центральные конечные разности более точны, чем прямые конечные разности по умолчанию. Для использования центральных конечных различий в командной строке MATLAB установите FiniteDifferenceType опция для 'central' использование optimoptions.
Рассмотрим проблему минимизации функции Розенброка в диске блока, как описано в разделе Решение ограниченной нелинейной проблемы на основе решателя. rosenboth функция вычисляет целевую функцию и ее градиент:
function [f g H] = rosenboth(x)
f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2;
if nargout > 1
g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));
200*(x(2)-x(1)^2)];
if nargout > 2
H = [1200*x(1)^2-400*x(2)+2, -400*x(1);
-400*x(1), 200];
end
endrosenboth вычисляет и гессен, но в этом примере гессен не используется.
unitdisk2 функция правильно вычисляет функцию ограничения и ее градиент:
function [c,ceq,gc,gceq] = unitdisk2(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [ ];
if nargout > 2
gc = [2*x(1);2*x(2)];
gceq = [];
end unitdiskb функция неправильно вычисляет градиент функции ограничения:
function [c ceq gc gceq] = unitdiskb(x)
c = x(1)^2 + x(2)^2 - 1;
ceq = [ ];
if nargout > 2
gc = [x(1);x(2)]; % Gradient incorrect: off by a factor of 2
gceq = [];
endЗадайте опции для использования алгоритма внутренней точки, градиента функций цели и ограничения и CheckGradients вариант:
% For reproducibility--CheckGradients randomly perturbs the initial point
rng(0,'twister');
options = optimoptions(@fmincon,'Algorithm','interior-point',...
'CheckGradients',true,'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true);Решение проблемы минимизации с помощью fmincon с использованием ошибочного unitdiskb функция ограничения:
[x fval exitflag output] = fmincon(@rosenboth,...
[-1;2],[],[],[],[],[],[],@unitdiskb,options);
____________________________________________________________
Derivative Check Information
Objective function derivatives:
Maximum relative difference between user-supplied
and finite-difference derivatives = 1.84768e-008.
Nonlinear inequality constraint derivatives:
Maximum relative difference between user-supplied
and finite-difference derivatives = 1.
User-supplied constraint derivative element (2,1): 1.99838
Finite-difference constraint derivative element (2,1): 3.99675
____________________________________________________________
Error using validateFirstDerivatives
Derivative Check failed:
User-supplied and forward finite-difference derivatives
do not match within 1e-006 relative tolerance.
Error in fmincon at 805
validateFirstDerivatives(funfcn,confcn,X, ...Функция ограничения не соответствует вычисленному градиенту, что позволяет проверить функцию на наличие ошибки.
Замените unitdiskb функция ограничения с unitdisk2 и запустите минимизацию еще раз:
[x fval exitflag output] = fmincon(@rosenboth,... [-1;2],[],[],[],[],[],[],@unitdisk2,options); ____________________________________________________________ Derivative Check Information Objective function derivatives: Maximum relative difference between user-supplied and finite-difference derivatives = 1.28553e-008. Nonlinear inequality constraint derivatives: Maximum relative difference between user-supplied and finite-difference derivatives = 1.46443e-008. Derivative Check successfully passed. ____________________________________________________________ Local minimum found that satisfies the constraints...