__declspec(property(get = GetGradHessProcedure, put = SetGradHessProcedure)) TGradHess GradHessProcedure;
Defines the gradient vector and Hessian matrix calculation routine.
Remarks:
Defines the gradient vector and Hessian matrix calculation routine. Set TMtxOptimization::GradHessProcedure to nil if you want to use internal numeric gradient and Hessian matrix calculation.
Examples
#include "MtxVec.h"
#include "MtxVecTools.h"
#include "Optimization.h"
#include "Units.Math387.h"
using namespace Dew;
using namespace Dew::Math;
using namespace Dew::Math::Units;
// Objective function
static double Banana(TVec* pars, TVec* consts, const DewArray<tObject*>& obj)
{
return 100.0*Math387::IntPower((*pars)[1] - Math387::IntPower((*pars)[0], 2), 2)
+ Math387::IntPower(1.0 - (*pars)[0], 2);
}
// Analytical gradient of the objective function
static void GradHessBanana(TRealFunction Fun, TVec* pars, TVec* consts, const DewArray<tObject*>& obj, TVec* grad, TMtx* Hess)
{
grad->Values(0) = -400*((*pars)[1] - Math387::IntPower((*pars)[0], 2))*(*pars)[0] - 2*(1 - (*pars)[0]);
grad->Values(1) = 200*((*pars)[1] - Math387::IntPower((*pars)[0], 2));
Hess->Values1D(0) = -400*(*pars)[1] + 1200*Math387::IntPower((*pars)[0], 2) + 2;
Hess->Values1D(1) = -400*(*pars)[0];
Hess->Values1D(2) = -400*(*pars)[0];
Hess->Values1D(3) = 200;
}
void Example()
{
TMtxOptimization* opt = new TMtxOptimization(nullptr);
opt->VariableParameters->SetIt(DewArray<double>{2, -1});
opt->RealFunction = Banana;
opt->OptimizationMethod = TOptMethod::optMarquardt;
// use exact gradient and Hessian calculation
// NOTE : set opt.GradHessProcedure to null if you
// want to use internal numeric gradient calculation
opt->GradHessProcedure = GradHessBanana;
opt->Recalculate();
delete opt;
}
#include "MtxVec.h"
#include "MtxVecTools.h"
#include "Optimization.h"
#include "Units.Math387.h"
using namespace Dew;
using namespace Dew::Math;
using namespace Dew::Math::Units;
// Objective function
static double Banana(TVec* pars, TVec* consts, const DewArray<tObject*>& obj)
{
return 100.0*Math387::IntPower((*pars)[1] - Math387::IntPower((*pars)[0], 2), 2)
+ Math387::IntPower(1.0 - (*pars)[0], 2);
}
// Analytical gradient of the objective function
static void GradHessBanana(TRealFunction Fun, TVec* pars, TVec* consts, const DewArray<tObject*>& obj, TVec* grad, TMtx* Hess)
{
grad->Values(0) = -400*((*pars)[1] - Math387::IntPower((*pars)[0], 2))*(*pars)[0] - 2*(1 - (*pars)[0]);
grad->Values(1) = 200*((*pars)[1] - Math387::IntPower((*pars)[0], 2));
Hess->Values1D(0) = -400*(*pars)[1] + 1200*Math387::IntPower((*pars)[0], 2) + 2;
Hess->Values1D(1) = -400*(*pars)[0];
Hess->Values1D(2) = -400*(*pars)[0];
Hess->Values1D(3) = 200;
}
void Example()
{
TMtxOptimization* opt = new TMtxOptimization(nullptr);
opt->VariableParameters->SetIt(DewArray<double>{2, -1});
opt->RealFunction = Banana;
opt->OptimizationMethod = TOptMethod::optMarquardt;
// use exact gradient and Hessian calculation
// NOTE : set opt.GradHessProcedure to null if you
// want to use internal numeric gradient calculation
opt->GradHessProcedure = GradHessBanana;
opt->Recalculate();
delete opt;
}
Declared in Dew::Math::TMtxOptimization · Dew.Math/MtxVecTools.h · Cross-compiler