LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
qsys_phm1.m
1function result = qsys_phm1(alpha, T, mu)
2% QSYS_PHM1 Exact PH/M/1 (GI/M/1 with phase-type inter-arrivals).
3%
4% RESULT = QSYS_PHM1(ALPHA, T, MU) solves the GI/M/1 sigma-root
5% sigma = psi_A(mu*(1 - sigma)), psi_A(s) = ALPHA*(s*I - T)\(-T*1)
6% and returns time-average performance metrics.
7%
8% Inputs:
9% ALPHA - PH entry probability row vector (1 x k)
10% T - PH sub-generator (k x k)
11% MU - Exponential service rate (positive scalar)
12%
13% RESULT struct fields:
14% meanQueueLength - L = rho/(1 - sigma)
15% meanWaitingQueue - Lq = rho*sigma/(1 - sigma)
16% meanWaitingTime - Wq = Lq/lambda
17% meanSojournTime - W = Wq + 1/MU
18% utilization - rho = lambda/MU
19% sigma - GI/M/1 root in (0, 1)
20% analyzer - identifier string
21%
22% See also qsys_gm1, qsys_dmc
23
24if mu <= 0
25 line_error(mfilename, 'Service rate MU must be positive');
26end
27alpha = alpha(:)'; % row vector
28k = size(T, 1);
29if size(T, 2) ~= k
30 line_error(mfilename, 'T must be square');
31end
32if numel(alpha) ~= k
33 line_error(mfilename, 'ALPHA length must match T dimension');
34end
35
36ones_k = ones(k, 1);
37t_vec = -T * ones_k; % column
38
39% Mean inter-arrival = alpha * (-T)\1
40mean_ia = alpha * ((-T) \ ones_k);
41if mean_ia <= 0
42 line_error(mfilename, sprintf('Non-positive mean inter-arrival: %g', mean_ia));
43end
44lambda = 1.0 / mean_ia;
45rho = lambda / mu;
46if rho >= 1 - 1e-12
47 line_error(mfilename, sprintf('Load rho=%g must be strictly less than 1', rho));
48end
49
50I = eye(k);
51lst = @(s) alpha * ((s*I - T) \ t_vec);
52f = @(sigma) sigma - lst(mu*(1 - sigma));
53
54try
55 sigma = fzero(f, [1e-12, 1 - 1e-12]);
56catch
57 % Fall back to fixed-point iteration if bracket fails
58 sigma = 0.5;
59 for it = 1:2000
60 sNew = lst(mu*(1 - sigma));
61 if abs(sNew - sigma) < 1e-13
62 sigma = sNew;
63 break;
64 end
65 sigma = sNew;
66 end
67end
68
69L = rho / (1 - sigma);
70Lq = rho * sigma / (1 - sigma);
71Wq = Lq / lambda;
72W = Wq + 1.0 / mu;
73
74result = struct();
75result.meanQueueLength = L;
76result.meanWaitingQueue = Lq;
77result.meanWaitingTime = Wq;
78result.meanSojournTime = W;
79result.utilization = rho;
80result.sigma = sigma;
81result.analyzer = 'PHM1:fzero';
82
83end