Update sample3.cpp

This commit is contained in:
张壹 2019-10-22 10:52:04 +08:00
parent cb3d271071
commit 38c0f38d72

View File

@ -39,7 +39,7 @@ TEST_FUNC::TEST_FUNC()
{
m_x = NULL;
m_x = lbfgs_malloc(3);
m_x[0] = m_x[1] = m_x[2] = 1.0;
m_x[0] = m_x[1] = m_x[2] = 0.0;
}
TEST_FUNC::~TEST_FUNC()
@ -55,9 +55,9 @@ lbfgsfloatval_t TEST_FUNC::Func(const lbfgsfloatval_t *x, lbfgsfloatval_t *g,
const int n, const lbfgsfloatval_t step)
{
double f0,f1,f2,temp;
f0 = 3*x[0] + x[1] + 2*x[2]*x[2] - 3;
f1 = -3*x[0] + 5*x[1]*x[1] + 2*x[0]*x[2] - 1;
f2 = 25*x[0]*x[1] + 20*x[2] + 12;
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.0521;
f2 = 25*x[0]*x[1] + 20*x[2] + 12.10231;
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;
@ -70,19 +70,28 @@ int TEST_FUNC::Progress(const lbfgsfloatval_t *x, const lbfgsfloatval_t *g, cons
const lbfgsfloatval_t xnorm, const lbfgsfloatval_t gnorm, const lbfgsfloatval_t step,
int n, int k, int ls)
{
clog << "iteration times: " << k << endl;
clog << "iteration times: " << k << " fx = " << fx << " gnorm/xnorm = " << gnorm/xnorm << endl;
clog << x[0] << " " << x[1] << " " << x[2] << endl;
if (fx < 1e-10) return 1; //这里我们设置一个方程组的整体目标函数值作为终止条件 因为此方程组在0值处梯度不为0 无法使用梯度条件
return 0;
}
int TEST_FUNC::Routine()
{
lbfgsfloatval_t fx;
int ret = lbfgs(3, m_x, &fx, _Func, _Progress, this, NULL);
lbfgs_parameter_t self_para;
lbfgs_parameter_init(&self_para);
//self_para.min_step = 1e-30;
//self_para.max_linesearch = 40;
//self_para.linesearch = LBFGS_LINESEARCH_BACKTRACKING_WOLFE;
int ret = lbfgs(3, m_x, &fx, _Func, _Progress, this, &self_para);
clog << "L-BFGS optimization terminated with status: " << endl << lbfgs_strerror(ret) << endl;
clog << m_x[0] << " " << m_x[1] << " " << m_x[2] << endl;
return 0;
return ret;
}
int main(int argc, char const *argv[])