1function ilt = matlab_ilt(fun, T, maxFnEvals, method)
5 cmeParams = jsondecode(fileread(
'iltcme.json'));
7if ~exist(
'method',
'var')
11if strcmp(method, 'cme')
13 % find the most steep CME satisfying maxFnEvals
14 params = cmeParams(1);
15 for i=2:length(cmeParams)
16 if cmeParams(i).cv2<params.cv2 && cmeParams(i).n+1<=maxFnEvals
17 params = cmeParams(i);
21 % compute eta and beta parameters
22 eta = [params.c*params.mu1, params.a'*params.mu1 + 1i*params.b'*params.mu1];
23 beta = [1, 1 + 1i*(1:params.n)*params.omega] * params.mu1;
25elseif strcmp(method,'euler')
27 n_euler = floor((maxFnEvals-1)/2);
28 eta = [0.5, ones(1, n_euler), zeros(1, n_euler-1), 2^-n_euler];
30% eta(2*n_euler-k + 1) = eta(2*n_euler-k + 2) + 2^-n_euler * nchoosek(n_euler, k);
31 eta(2*n_euler-k + 1) = eta(2*n_euler-k + 2) + exp(sum(log(1:n_euler)) - n_euler*log(2) - sum(log(1:k)) - sum(log(1:(n_euler-k))));
34 beta = n_euler*log(10)/3 + 1i*pi*k;
35 eta = (10^((n_euler)/3))*(1-mod(k, 2)*2) .* eta;
37elseif strcmp(method,'gaver')
39 if mod(maxFnEvals,2)==1
40 maxFnEvals = maxFnEvals - 1;
43 eta = zeros(1,maxFnEvals);
44 beta = zeros(1,maxFnEvals);
45 for k = 1:maxFnEvals % itration index
47 for j = floor((k+1)/2):min(k,ndiv2) % eta summation index
48% inside_sum=inside_sum+((j^((ndiv2+1))/factorial(ndiv2))*(nchoosek(ndiv2, j)*nchoosek(2*j, j)*nchoosek(j, k-j)));
49 inside_sum=inside_sum+exp((ndiv2+1)*log(j) - sum(log(1:(ndiv2-j))) + sum(log(1:2*j)) - 2*sum(log(1:j)) - sum(log(1:(k-j))) - sum(log(1:(2*j-k))));
51 eta(k)=log(2.0)*(-1)^(k+ndiv2)*inside_sum;
52 beta(k) = k * log(2.0);
56 error('This inverse laplace transform method
is unknown. Supported ones: cme, euler, gaver');
59% common part for all abate-whitt variants
60[eta_mesh,T_mesh]= meshgrid(eta, T);
61beta_mesh = meshgrid(beta, T);
62ilt = 1./reshape(T,[],1) .* sum(real(eta_mesh .* arrayfun(fun, beta_mesh./T_mesh)), 2);