You are here: Symbol Reference > MtxVecTools Namespace > Classes > TMtxOptimization Class > public > TMtxOptimization.GradHessProcedure Property
MtxVec VCL
ContentsIndex
Example
function Banana(const Pars: TVec; const Consts: TVec; const PConsts: Array of TObject): double; begin Banana := 100*Sqr(Pars[1]-Sqr(Pars[0]))+Sqr(1-Pars[0]); end; procedure GradHessBanana(Fun: TRealFunction; const Pars: TVec; const Consts: TVec; const ObjConsts: Array of TObject; const Grad: TVec; const 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 "MtxExpr.hpp" #include "Math387.hpp" #include "Optimization.hpp" #include "MtxIntDiff.hpp" #include "MtxVecTools.hpp" // Objective function double __fastcall Banana(TVec* const Parameters, TVec* const Constants, 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* const Parameters, TVec* const Consts, System::TObject* const * ObjConst, const int ObjConst_Size, TVec* const Grad, TMtx* const 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(double,(2,-1))); MtxOptim->RealFunction = Banana; MtxOptim.OptimizationMethod = optBFGS; // use exact gradient and Hessian calculation // NOTE : set MtxOptim.GradProcedure to NULL if you // want to use internal numeric gradient calculation MtxOptim->GradHessProcedure = GradHessBanana; MtxOptim->Recalculate(); }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.