using Dew.Math;
using Dew.Math.Units;
namespace Dew.Examples
{
// Objective function
double Banana(
TVec pars,
TVec consts,
params object[] obj)
{
return 100.0*Math387.IntPower(pars[1]- Math387.IntPower(pars[0],2),2)
+ Math387.IntPower(1.0-pars[0],2);
}
// Analytical gradient of the objective function
void GradHessBanana(
TRealFunction Fun,
TVec pars,
TVec consts,
object[] obj,
TVec grad,
TMtx Hess)
{
grad.Values[0] = -400*(pars[1]-Math387.IntPower(pars[0],2))*pars[0] - 2*(1-pars[0]);
grad.Values[1] = 200*(pars[1]-Math387.IntPower(pars[0],2));
Hess.Values1D[0] = -400*Pars[1]+1200*Math387.IntPower(Pars[0],2)+2;
Hess.Values1D[1] = -400*Pars[0];
Hess.Values1D[2] = -400*Pars[0];
Hess.Values1D[3] = 200;
}
private void Example(
TMtxOptimization opt)
{
opt.VariableParameters.SetIt(
new double[] {2,-1});
opt.RealFunction = Banana;
opt.OptimizationMethod = TOptimizationMethod.optBFGS;
// use exact gradient and Hessian calculation
// NOTE : set opt.GradHessProcedure to null if you
// want to use internal numeric gradient calculation
opt.GradHessProcedure = GradHessBanana;
opt.Recalculate();
}
}