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