17 #if defined(DEBUG) || defined(WARNINGMSG)
28 double inner_product(
const LAVector&,
const LAVector&);
29 double similarity(
const LAVector&,
const LASymMatrix&);
30 double sum_of_elements(
const LASymMatrix&);
32 MinimumError DavidonErrorUpdator::Update(
const MinimumState& s0,
33 const MinimumParameters& p1,
34 const FunctionGradient& g1)
const {
40 const MnAlgebraicSymMatrix& v0 = s0.Error().InvHessian();
41 MnAlgebraicVector dx = p1.Vec() - s0.Vec();
42 MnAlgebraicVector dg = g1.Vec() - s0.Gradient().Vec();
44 double delgam = inner_product(dx, dg);
45 double gvg = similarity(dg, v0);
49 std::cout <<
"dx = " << dx << std::endl;
50 std::cout <<
"dg = " << dg << std::endl;
51 std::cout<<
"delgam= "<<delgam<<
" gvg= "<<gvg<<std::endl;
56 MN_INFO_MSG(
"DavidonErrorUpdator: delgam = 0 : cannot update - return same matrix ");
61 if (delgam < 0) MN_INFO_MSG(
"DavidonErrorUpdator: delgam < 0 : first derivatives increasing along search line");
67 MN_INFO_MSG(
"DavidonErrorUpdator: gvg <= 0 : cannot update - return same matrix ");
73 MnAlgebraicVector vg = v0*dg;
75 MnAlgebraicSymMatrix vUpd = Outer_product(dx)/delgam - Outer_product(vg)/gvg;
79 vUpd += gvg*Outer_product(MnAlgebraicVector(dx/delgam - vg/gvg));
82 double sum_upd = sum_of_elements(vUpd);
85 double dcov = 0.5*(s0.Error().Dcovar() + sum_upd/sum_of_elements(vUpd));
87 return MinimumError(vUpd, dcov);