Point MainWindow::simplex_min(Simplex &smplx, double eps) { //number of simplex vertexes: N_DIM + 1 const double alpha = 1.0; const double beta = 0.5; const double gamma = 2.0; double theta; double f_l, f_g, f_h, f_c, f_reflected; Point::n = N_DIM; unsigned iter=0; while(!smplx.QuitCase(smplx, eps)) { sort_simplex(smplx); f_l = func(smplx.get_l()); f_g = func(smplx.get_g()); f_h = func(smplx.get_h()); // Point a = (smplx.get_c()*(1 + alpha)); Point b = (smplx.get_h() * alpha); // smplx.set_reflected(a - b); Point a = (smplx.get_c()*(1 + alpha)) - (smplx.get_h() * alpha); smplx.set_reflected(a); //test reflection f_reflected = func(smplx.get_reflected()); if (f_l < f_reflected && f_reflected < f_g) theta = alpha; if (f_reflected <= f_l) theta = gamma; if (f_g <= f_reflected && f_reflected < f_h) theta = beta; else if(f_reflected >= f_h) theta = -beta; Point temp = smplx.get_h() + (smplx.get_c() - smplx.get_h())*(1 + theta); smplx.set_vertex_h(temp); ++iter; if (iter > 1000) { qDebug()<<"x="<<smplx.get_h().coord[0]; qDebug()<<"y="<<smplx.get_h().coord[1]; break; } // smplx.set_vertex_h(smplx.get_h() + (smplx.get_c() - smplx.get_h())*(1 + theta)); } return smplx.get_l(); }