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