Многие решатели позволяют вам задать функцию, которая вычисляет первые производные (градиенты или якобианы) целевых или ограничительных функций. Можно проверить, соответствуют ли производные, вычисленные вашей функцией, конечноразностным приближениям. Эта проверка может помочь вам диагностировать, верна ли ваша производная функция.
Если компонент градиентной функции меньше 1
«match» означает абсолютное различие градиентной функции и конечноразностное приближение этого компонента меньше 1e-6
.
В противном случае «соответствовать» означает, что относительное различие меньше 1e-6
.
The CheckGradients
опция заставляет решатель проверить заданную производную на конечноразностное приближение всего в одной точке. Если конечная разница и заданные производные не совпадают, ошибки решателя. Если производные совпадают с внутренними 1e-6
решатель сообщает вычисленные различия и продолжает итерацию без дальнейших проверок производной. Решатели проверяют соответствие в точке, которая является небольшим случайным возмущением начальной точки x0
, измененный так, чтобы находиться в пределах любых границ. Решатели не включают расчетов для CheckGradients
в счетчике функций; см. Итерации и счетчики функций.
В MATLAB® командная строка:
Установите SpecifyObjectiveGradient
или SpecifyConstraintGradient
опции для true
использование optimoptions
. Убедитесь, что ваша цель или ограничительные функции обеспечивают соответствующие производные.
Установите CheckGradients
опция для true
.
Центральные конечные различия более точны, чем заданные по умолчанию передние конечные различия. Чтобы использовать центральные конечные различия в командной строке MATLAB, установите FiniteDifferenceType
опция для 'central'
использование optimoptions
.
Рассмотрим задачу минимизации функции Розенброка в единичном диске, как описано в Решении Ограниченной Нелинейной Задачи, Основанной на Решателе. The 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
вычисляет и Гессиан, но этот пример не использует Гессиан.
The 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
The 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...