You are here: Symbol Reference > MtxVecTools Namespace > Classes > TMtxOptimization Class > public > TMtxOptimization.GradProcedure 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 GradBanana(Fun: TRealFunction; const Pars: TVec; const Consts: TVec; const ObjConsts: Array of TObject; const Grad: TVec); begin Grad[0] := -400*(Pars[1] - Sqr(Pars[0]))*Pars[0] - 2*(1 - Pars[0]); Grad[1] := 200*(Pars[1] - Sqr(Pars[0])); end; procedure TForm1.FormCreate(Sender: TObject); begin MtxOptim.VariableParameters.SetIt(false,[2,-1]); MtxOptim.RealFunction := Banana; MtxOptim.OptimizationMethod := optBFGS; // use exact gradient vector calculation // NOTE : set MtxOptim.GradProcedure to nil if yo // want to use internal numeric gradient calculation MtxOptim.GradProcedure := GradBanana; 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) { double* Pars = Parameters->PValues1D(0); return 100.0*IntPower(Pars[1]-IntPower(Pars[0],2),2)+IntPower(1.0-Pars[0],2); } // Analytical gradient of the objective function void __fastcall GradBanana(TRealFunction Fun, TVec* const Parameters, TVec* const Consts, System::TObject* const * ObjConst, const int PConsts_Size, Mtxvec::TVec* const Grad) { double* Pars = Parameters->PValues1D(0); 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)); } void __fastcall TForm1::FormCreate(TObject *Sender) { MtxOptim->VariableParameters->SetIt(false,OPENARRAY(double,(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->GradProcedure = GradBanana; MtxOptim->Recalculate(); }
Copyright (c) 1999-2025 by Dew Research. All rights reserved.