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