Много решателей позволяют вам предоставлять функцию, которая вычисляет первые производные (градиенты или Якобианы) ограничительных функций или цели. Можно проверять ли производные, вычисленные функциональными приближениями конечной разности соответствия. Эта проверка может помочь вам диагностировать, правильна ли ваша производная функция.
Если компонент функции градиента меньше 1
, “соответствие” означает абсолютную разность функции градиента, и приближение конечной разности того компонента меньше 1e-6
.
В противном случае “соответствие” означает, что относительная разница меньше 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 end
rosenboth
вычисляет Гессиан также, но этот пример не использует Гессиан.
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...