Defines the gradient vector and Hessian matrix calculation routine.
Defines the gradient vector and Hessian matrix calculation routine. Set GradHessProcedure to nil if you want to use internal numeric gradient and Hessian matrix calculation.
Example 1
function Banana(Pars: TVec; const Consts: Array of TSample;const PConsts: Array of Pointer): TSample;
begin
Result := 100*Sqr(Pars[1]-Sqr(Pars[0]))+Sqr(1-Pars[0]);
end;
procedure GradHessBanana(Fun: TRealFunction; Pars: TVec; const Consts: Array of TSample;const ObjConsts: Array of TObject; Grad: TVec; Hess: TMtx);
begin
Grad.Values[0] := -400*(Pars[1]-Sqr(Pars[0]))*Pars[0]-2*(1-Pars[0]);
Grad.Values[1] := 200*(Pars[1]-Sqr(Pars[0]));
Hess.Values[0,0] := -400*Pars[1]+1200*Sqr(Pars[0])+2;
Hess.Values[0,1] := -400*Pars[0];
Hess.Values[1,0] := -400*Pars[0];
Hess.Values[1,1] := 200;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MtxOptim.VariableParameters.SetIt(false,[2,-1]);
MtxOptim.RealFunction := Banana;
MtxOptim.OptimizationMethod := optMarquardt;
// use exact gradient and Hessian matrix calculation
// NOTE : set MtxOptim.GradHessProcedure to nil if you want to use numeric gradient and Hessian matrix approximation
MtxOptim.GradHessProcedure := GradHessBanana;
MtxOptim.Recalculate;
end;
#include "MtxVecCpp.h" //MtxVecCPP.cpp must be included in the project
#include "Math387.hpp"
#include "Optimization.hpp"
#include "MtxIntDiff.hpp"
#include "MtxVecTools.hpp"
// Objective function
double __fastcall Banana(TVec * Parameters, const double * Constants, const int Constants_Size,
System::TObject* const * ObjConst, const int ObjConst_Size)
{
return 100.0*IntPower(Parameters[1]-IntPower(Parameters[0],2),2)+IntPower(1.0-Parameters[0],2);
}
// Analytical gradient and Hessian matrix of the objective function
void __fastcall BananaGradHess(TRealFunction Fun, TVec * Parameters, const double * Consts, const int Consts_Size,
System::TObject* const * ObjConst, const int ObjConst_Size, TVec* Grad, TMtx* Hess)
{
double* Pars = Parameters->PValues(0); //get pointer to the first element
Grad->Values[0] = -400*(Pars[1]-IntPower(Pars[0],2))*Pars[0] - 2*(1-Pars[0]);
Grad->Values[1] = 200*(Pars[1]-IntPower(Pars[0],2));
Hess->Values1D[0] = -400*Pars[1]+1200*IntPower(Pars[0],2)+2;
Hess->Values1D[1] = -400*Pars[0];
Hess->Values1D[2] = -400*Pars[0];
Hess->Values1D[3] = 200;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
MtxOptim->VariableParameters->SetIt(false,OPENARRAY(TSample,(2,-1)));
MtxOptim->RealFunction = Banana;
MtxOptim.OptimizationMethod = optBFGS;
// use exact gradient vector calculation
// NOTE : set MtxOptim.GradProcedure to NULL if you
// want to use internal numeric gradient calculation
MtxOptim->GradHessProcedure = GradHessBanana;
MtxOptim->Recalculate();
}