Vector quasi_newton(Vector& x, F f, Grad grad_f, Step step, Update update, Iter& iter) { typedef typename mtl::Collection<Vector>::value_type value_type; Vector d, y, x_k, s; Matrix H(size(x), size(x)); H= 1; for (; !iter.finished(two_norm(grad_f(x))); ++iter) { d= H * -grad_f(x); // std::cout << "d is " << d << '\n'; value_type alpha= step(x, d, f, grad_f); assert(alpha == alpha); x_k= x + alpha * d; // std::cout << "x_k is " << x_k << '\n'; s= alpha * d; // std::cout << "alpha is " << alpha << '\n'; y= grad_f(x_k) - grad_f(x); update(H, y, s); x= x_k; } return x; }