function [] = interval_over_iterations(method)
% Plot the [a,b] interval over the iterations for different lambda
% values (min, mid, max))
%
% method: the minimum calculation method
%       * bisections
%       * golden_section
%       * fibonacci
%       * bisection_der


% Load the functions and interval
GivenEnv;

fig_dir = 'figures';
if ~exist(fig_dir, 'dir')
    mkdir(fig_dir);
end

% Setup
% ========================
%
% We need to test against the same lambda values for all the methods in
% order to compare them. And since epsilon (which is related to lambda)
% was given for bisection method, we base our calculations to that.
%
%
% epsilon: e = 0.001
% lambda:  l > 2e =>
% lambda_min: 0.0021
% lambda_max: 0.1
% N: 3 points (3 lambda values min-mid-max)

N = 3;
epsilon = 0.001;
lambda_min = 0.0021;
lambda_max = 0.1;
lambda = linspace(lambda_min, lambda_max, N);
k = zeros(1, N); % preallocate k


%
% Call the minimum calculation method for each lambda value for each
% function and keep the number of iterations needed.
% Then Plot the [a,b] interval over iterations for each lambda for each
% function.
%
% note: In order to use the same method call for all methods, we force a 
%       common interface for minimum method functions. Thus some arguments
%       will not be needed for some methods (epsilon is not needed for
%       bisection _der for example).
%

disp(" ");
for i = 1:length(funs)
    figure('Name', "interval_over_iterations_" + char(method) + "_fun" + i, 'NumberTitle', 'off');
    set(gcf, 'Position', [100, 100, 1280, 720]); % Set the figure size to HD
    for j = 1:N
        [a, b, k(j)] = method(funs(i), a_0, b_0, epsilon, lambda(j));
        
        fprintf('%20s(%34s ):  [a, b]= [%f, %f], @lambda=%f, iterations= %d\n', ...
            char(method), char(funs(i)), a(end), b(end), lambda(j), k(j) );
        
        subplot(length(funs), 1, j)
        plot(1:length(a), a, 'ob')
        hold on
        plot(1:length(b), b, '*r')
        if j == 1
            title(titles(i), 'Interpreter', 'latex')
        end
        xlabel("Iterations @lambda=" + lambda(j))
        ylabel('[a_k, b_k]')
    end
    
    % Print and save the figure
    %fig_epsc = fullfile(fig_dir, "interval_over_iterations_" + char(method) + "_fun" + i + ".epsc");
    fig_png  = fullfile(fig_dir, "interval_over_iterations_" + char(method) + "_fun" + i + ".png");

    %print(gcf, fig_epsc, '-depsc', '-r300');
    print(gcf, fig_png, '-dpng', '-r300');
end

