TMtxOptimization::GradProcedure Property

__declspec(property(get = GetGradProcedure, put = SetGradProcedure)) TGrad GradProcedure;

Defines the gradient vector calculation routine.

Read: TGrad GetGradProcedure();
Write: void SetGradProcedure(const TGrad Value);
Remarks:

Defines the gradient vector calculation routine. Set TMtxOptimization::GradProcedure to nil if you want to use internal numeric gradient vector 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 GradBanana(TRealFunction Fun, TVec* pars, TVec* consts, const DewArray<tObject*>& obj, TVec* grad)
{
    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));
}

void Example()
{
    TMtxOptimization* opt = new TMtxOptimization(nullptr);
    opt->VariableParameters->SetIt(DewArray<double>{2, -1});
    opt->RealFunction = Banana;
    opt->OptimizationMethod = TOptMethod::optBFGS;
    // use exact gradient vector calculation
    // NOTE : set opt.GradProcedure to null if you
    //        want to use internal numeric gradient calculation
    opt->GradProcedure = GradBanana;
    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 GradBanana(TRealFunction Fun, TVec* pars, TVec* consts, const DewArray<tObject*>& obj, TVec* grad)
{
    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));
}

void Example()
{
    TMtxOptimization* opt = new TMtxOptimization(nullptr);
    opt->VariableParameters->SetIt(DewArray<double>{2, -1});
    opt->RealFunction = Banana;
    opt->OptimizationMethod = TOptMethod::optBFGS;
    // use exact gradient vector calculation
    // NOTE : set opt.GradProcedure to null if you
    //        want to use internal numeric gradient calculation
    opt->GradProcedure = GradBanana;
    opt->Recalculate();
    delete opt;
}
See Also: TMtxOptimization::GradHessProcedure, TMtxOptimization::GradTolerance
Declared in Dew::Math::TMtxOptimization · Dew.Math/MtxVecTools.h · Cross-compiler