Dew MtxVec NET
TMtxOptimization.GradHessProcedure Property
Summary
Defines the gradient vector and Hessian matrix calculation routine.

Class
TMtxOptimization

Declaration
Property GradHessProcedure: TGradHess read FGradHessProcedure write SetGradHessProcedure;
Description
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.
 See Also 
GradProcedure 
GradTolerance 

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(); }

Copyright 2008 Dew Research
http://www.dewresearch.com