function [x_opt] = Numerical_opt(lambda,B,c_f,c_delta)
% Numerical optimization
% x_opt are the optimal hit probabilities
 
N = length(lambda);  % Number of variables
h_init = ones(N, 1) * B / N;  % Initial guess for h_i, evenly distributed
x_init=h_init;
objective1 = @(x) sum(lambda .*( (1-x)*c_f+x.^2*c_delta/2));  % Objective function
constraint1 = @(x) sum(x) - B; % cache size constraint
% constraint on hit prob. 0<=h_i<=1
nonlcon1 = @(x) deal(constraint1(x), []);  % 
lb = zeros(N, 1);  % Lower bounds
ub = ones(N, 1);     % Upper bounds
options = optimoptions('fmincon', 'Display', 'iter', 'Algorithm', 'sqp');
[x_opt, fval_h] = fmincon(objective1, x_init, [], [], [], [], lb, ub, nonlcon1, options);
end

