#include "../lib/optimization.h" class TEST_FUNC : public gctl::lbfgs_solver { public: TEST_FUNC(); ~TEST_FUNC(); virtual double LBFGS_Evaluate(const gctl::array &x, gctl::array &g); void Routine(); private: gctl::array m_x; }; TEST_FUNC::TEST_FUNC() { m_x.resize(3, 0.0); } TEST_FUNC::~TEST_FUNC(){} // test functions // 3 = 3*x1 + x2 + 2*x3*x3 // 1 = -3*x1 + 5*x2*x2 + 2*x1*x3 // -12 = 25*x1*x2 + 20*x3 double TEST_FUNC::LBFGS_Evaluate(const gctl::array &x, gctl::array &g) { double f0,f1,f2,temp; f0 = 3*x[0] + x[1] + 2*x[2]*x[2] - 3.012; //这里添加一点噪声 f1 = -3*x[0] + 5*x[1]*x[1] + 2*x[0]*x[2] - 1.04252; f2 = 25*x[0]*x[1] + 20*x[2] + 12.12479; temp = sqrt(f0*f0+f1*f1+f2*f2); g[0] = 0.5*(6*f0+2*f1*(2*x[2]-3)+50*f2*x[1])/temp; g[1] = 0.5*(2*f0+20*f1*x[1]+50*f2*x[0])/temp; g[2] = 0.5*(8*f0*x[2]+4*f1*x[0]+40*f2)/temp; return temp; } void TEST_FUNC::Routine() { gctl::lbfgs_para self_para = default_lbfgs_para(); self_para.m = 10; self_para.past = 5; self_para.residual = 1e-10; //self_para.min_step = 1e-30; //self_para.max_linesearch = 40; //self_para.linesearch = gctl::LBFGS_LINESEARCH_BACKTRACKING_WOLFE; set_lbfgs_para(self_para); std::ofstream ofile("log.txt"); show_lbfgs_para(ofile); double fx = LBFGS_Minimize(m_x, ofile); ofile.close(); m_x.show(); return; } int main(int argc, char const *argv[]) { TEST_FUNC test; test.Routine(); return 0; }