function [xk, xs, gs] = GD(f, x0, max_itr, tol, bt)
    syms x y;
    xk = x0;
    gf = gradient(f);
    
    fl = matlabFunction(f);
    gfl = matlabFunction(gf);
    
    tnorm = norm(at(gf, xk), 2);
    xs = zeros(size(x0, 1), max_itr + 1);
    xs(:, 1) = x0;
    gs = zeros(1, max_itr + 1);
    gs(1) = tnorm;
    k = 1;
    
    while tnorm > tol && k <= max_itr 
        p = -gfl(xk(1), xk(2));

        if bt
            alpha = backtracking(fl, gfl, p, xk, 1, 0.9, 1e-4);
        else
            alpha = 1;
        end
        
        xk = xk + alpha * p;
        k = k + 1;
        xs(:, k) = xk;
        tnorm = norm(gfl(xk(1), xk(2)), 2);
        gs(k) = tnorm;
    end
    xs = xs(:, 1:k);
    gs = gs(:, 1:k);
end
