LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
MAPFromFewMomentsAndCorrelations.m
1% [D0, D1] = MAPFromFewMomentsAndCorrelations(moms, corr1, r)
2%
3% Creates a Markovian arrival process that has the given
4% 2 or 3 marginal moments and lag-1 autocorrelation.
5% The decay of the autocorrelation function can be optionally
6% adjusted as well.
7% The lag-k autocorrelation function `\rho_k` of the
8% resulting MAP is `\rho_k=r(corr_1/r)^k`.
9%
10% Parameters
11% ----------
12% moms : vector of doubles, length 2 or 3
13% The list of marginal moments to match.
14% corr1 : double
15% The lag-1 autocorrelation coefficient to match.
16% r : double, optional
17% The decay of the autocorrelation function.
18%
19% Returns
20% -------
21% D0 : matrix, shape (M,M)
22% The D0 matrix of the Markovian arrival process
23% D1 : matrix, shape (M,M)
24% The D1 matrix of the Markovian arrival process
25%
26% Notes
27% -----
28% With 2 marginal moments, or with 3 marginal moments and
29% positive autocorrelation the procedure always returns a
30% valid Markovian representation.
31%
32% References
33% ----------
34% .. [1] G Horvath, "Matching marginal moments and lag
35% autocorrelations with MAPs," ValueTools 2013,
36% Torino, Italy (2013).
37
38function [D0, D1] = MAPFromFewMomentsAndCorrelations (moms, corr1, r)
39
40 m1 = moms(1);
41 c2 = moms(2)/moms(1)^2 - 1;
42 if length(moms)>2
43 l3 = moms(3)*moms(1)/moms(2)^2 - 1;
44 else
45 l3 = [];
46 end
47
48 if ~exist('r','var')
49 r = [];
50 end
51
52 if corr1>=0
53 if nargin==5 && ~isempty(r) && r<=0 && r>=1
54 error "Parameter r is out of range!";
55 end
56 if nargin<5 || isempty(r)
57 r = 2.0*corr1 / (1.0+corr1);
58 p1 = (1.0-(1.0+corr1)/2.0) / (1.0+c2);
59 p2 = c2 * p1;
60 else
61 p1 = (1.0-corr1/r) / (1.0+c2);
62 p2 = c2 * p1;
63 end
64 m11 = m1 * (1.0 - sqrt(r));
65 m12 = m1 * (1.0 + c2*sqrt(r));
66 if isempty(l3)
67 cv21 = (sqrt(c2)*(1.0+c2)*(1.0+sqrt(r))) / (1.0+sqrt(c2)*(1-sqrt(r))+c2*sqrt(r));
68 cv22 = (c2*(1.0+c2)*(1-r)) / ((1+c2*sqrt(r)) * (1.0+sqrt(c2)*(1-sqrt(r))+c2*sqrt(r)));
69 m21 = (cv21+1.0) * m11^2;
70 m22 = (cv22+1.0) * m12^2;
71 [alpha1, A1] = APHFrom2Moments ([m11, m21]);
72 [alpha2, A2] = APHFrom2Moments ([m12, m22]);
73 else
74 cv21 = (c2 + sqrt(r)) / (1.0 - sqrt(r));
75 cv22 = c2 * (1.0 - sqrt(r)) / (1.0 + c2*sqrt(r));
76 l31 = l3 * (c2+1.0) / (c2*(1.0-sqrt(r))+sqrt(c2*(1.0+c2*sqrt(r))*(1.0-sqrt(r))));
77 l32 = l3 * (c2+1.0) / ((1.0+c2*sqrt(r))+sqrt(c2*(1.0+c2*sqrt(r))*(1.0-sqrt(r))));
78 m21 = (cv21+1.0) * m11^2;
79 m22 = (cv22+1.0) * m12^2;
80 m31 = (l31+1.0) * m21^2 / m11;
81 m32 = (l32+1.0) * m22^2 / m12;
82 [alpha1, A1] = APHFrom3Moments ([m11, m21, m31]);
83 [alpha2, A2] = APHFrom3Moments ([m12, m22, m32]);
84 end
85 else
86 if c2>=1
87 if nargin==5 && ~isempty(r) && r<=0 && r>=1/c2
88 error "Parameter r is out of range!";
89 end
90 if nargin<5 || isempty(r)
91 r = -2.0*corr1 / (1.0-c2*corr1);
92 p1 = (1.0+(1.0-c2*corr1)/2.0) / 2.0;
93 p2 = p1;
94 else
95 p1 = (1.0-corr1/r) / 2.0;
96 p2 = p1;
97 end
98 else
99 if nargin==5 && ~isempty(r) && r<=0 && r>=1
100 error "Parameter r is out of range!";
101 end
102 if nargin<5 || isempty(r)
103 r = -2.0*corr1 / (1.0-corr1);
104 p1 = (1.0+(1.0-corr1)/2.0) / 2.0;
105 p2 = p1;
106 else
107 p1 = (1.0-corr1/r) / 2.0;
108 p2 = p1;
109 end
110 end
111 m11 = m1 * (1.0 - sqrt(c2*r));
112 m12 = m1 * (1.0 + sqrt(c2*r));
113 if isempty(l3)
114 cv21 = c2 * (1.0-r) / (1.0-sqrt(c2*r));
115 cv22 = c2 * (1.0-r) / (1.0+sqrt(c2*r));
116 m21 = (cv21+1.0) * m11^2;
117 m22 = (cv22+1.0) * m12^2;
118 [alpha1, A1] = APHFrom2Moments ([m11, m21]);
119 [alpha2, A2] = APHFrom2Moments ([m12, m22]);
120 else
121 cv21 = (c2+sqrt(c2*r)) / (1.0-sqrt(r*c2));
122 cv22 = (c2-sqrt(c2*r)) / (1.0+sqrt(r*c2));
123 l31 = 2.0*l3 / (1-sqrt(c2*r)+sqrt(1.0-c2*r));
124 l32 = 2.0*l3 / (1+sqrt(c2*r)+sqrt(1.0-c2*r));
125 m21 = (cv21+1.0) * m11^2;
126 m22 = (cv22+1.0) * m12^2;
127 m31 = (l31+1.0) * m21^2 / m11;
128 m32 = (l32+1.0) * m22^2 / m12;
129 [alpha1, A1] = APHFrom3Moments ([m11, m21, m31]);
130 [alpha2, A2] = APHFrom3Moments ([m12, m22, m32]);
131 end
132 end
133
134 N1 = length(alpha1);
135 N2 = length(alpha2);
136 D0 = zeros(N1+N2);
137 D0(1:N1,1:N1) = A1;
138 D0(N1+1:end,N1+1:end) = A2;
139 D1 = zeros(N1+N2);
140 D1(1:N1,1:N1) = sum(-A1,2)*alpha1*(1.0-p1);
141 D1(1:N1,N1+1:end) = sum(-A1,2)*alpha2*p1;
142 D1(N1+1:end,1:N1) = sum(-A2,2)*alpha1*p2;
143 D1(N1+1:end,N1+1:end) = sum(-A2,2)*alpha2*(1.0-p2);
144end