LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
matlab_ilt.m
1function ilt = matlab_ilt(fun, T, maxFnEvals, method)
2
3global cmeParams;
4if isempty(cmeParams)
5 cmeParams = jsondecode(fileread('iltcme.json'));
6end
7if ~exist('method','var')
8 method = 'cme';
9end
10
11if strcmp(method, 'cme')
12
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);
18 end
19 end
20
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;
24
25elseif strcmp(method,'euler')
26
27 n_euler = floor((maxFnEvals-1)/2);
28 eta = [0.5, ones(1, n_euler), zeros(1, n_euler-1), 2^-n_euler];
29 for k = 1:n_euler-1
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))));
32 end
33 k = 0:2*n_euler;
34 beta = n_euler*log(10)/3 + 1i*pi*k;
35 eta = (10^((n_euler)/3))*(1-mod(k, 2)*2) .* eta;
36
37elseif strcmp(method,'gaver')
38
39 if mod(maxFnEvals,2)==1
40 maxFnEvals = maxFnEvals - 1;
41 end
42 ndiv2 = maxFnEvals/2;
43 eta = zeros(1,maxFnEvals);
44 beta = zeros(1,maxFnEvals);
45 for k = 1:maxFnEvals % itration index
46 inside_sum = 0.0;
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))));
50 end
51 eta(k)=log(2.0)*(-1)^(k+ndiv2)*inside_sum;
52 beta(k) = k * log(2.0);
53 end
54
55else
56 error('This inverse laplace transform method is unknown. Supported ones: cme, euler, gaver');
57end
58
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);
63
64end