LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
AdditiveDecomposition.m
1function [ lowerboundsolutions, upperboundsolutions, integralsolutions,Lzeromulti,Lnegmulti,Lposmulti,Anegmulti,Aposmulti] = AdditiveDecomposition(Qmulti,driftregimesmulti,Bmulti)
2
3for multi=1:size(Qmulti,3)
4 %ORDERED SCHUR
5 zerodrift=find(driftregimesmulti(multi,:)==0);
6 drifts=driftregimesmulti(multi,:);
7 Q=Qmulti(:,:,multi);
8
9 if ~isempty(zerodrift)
10 for i=1:length(zerodrift)
11 last=length(Q)+1-i;
12 nextzero=zerodrift(i);
13 tempQrow=Q(last,:);
14 Q(last,:)=Q(nextzero,:);
15 Q(nextzero,:)=tempQrow;
16 tempQcolumn=Q(:,last);
17 Q(:,last)=Q(:,nextzero);
18 Q(:,nextzero)=tempQcolumn;
19 tempdriftsrow=drifts(last);
20 drifts(last)=drifts(nextzero);
21 drifts(nextzero)=tempdriftsrow;
22 end
23
24 R=diag(drifts);
25 nindex=length(drifts)-length(zerodrift);
26 driftsn=drifts(1:nindex);
27 driftsz=drifts(nindex+1:length(drifts));
28 Qnn=Q(1:nindex,1:nindex);
29 Qzz=Q(nindex+1:length(drifts),nindex+1:length(drifts));
30 Qnz=Q(1:nindex,nindex+1:length(drifts));
31 Qzn=Q(nindex+1:length(drifts),1:nindex);
32
33 Qin=Qnn-(Qnz/Qzz)*Qzn;
34 Rn=diag(driftsn);
35 zeroconverter=-Qnz/Qzz;
36 else
37 Qin=Q;
38 Rn=diag(drifts);
39 R=diag(drifts);
40 end
41
42 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%55
43 %%Q=Qmulti(:,:,multi);
44 %%R=diag(driftregimesmulti(multi,:));
45
46 upperB=Bmulti(multi);
47 if multi==1
48 lowerB=0;
49 else
50 lowerB=Bmulti(multi-1);
51 end
52 A=Qin/Rn;
53% right=Rn*ones(size(Rn,1),1);
54% e1=[1;zeros(size(Rn,1)-1,1)];
55% u=right-norm(right,2)*e1;
56% Q1=eye(size(Rn))-2*(u*u')/(u'*u);
57% temp=Q1*A*Q1;
58% Qbar=temp(2:size(Rn,1),2:size(Rn,1));
59% [Z,M]=schur(Qbar);
60% [Z,M]=ordschur(Z,M,'lhp');
61% Z1=Q1*blkdiag(eye(1),Z);
62% D1=Z1'*A*Z1;
63 [Z,D1]=schur(A);
64
65 lengthD=length(D1);
66
67 c=zeros(1, lengthD);
68 positivecount=0;
69 negativecount=0;
70 zerocount=0;
71 for i=1: lengthD
72 if D1(i,i)>0.0000001
73 positivecount=positivecount+1;
74 c(i)=1;
75 elseif D1(i,i)<-0.0000001
76 negativecount=negativecount+1;
77 c(i)=2;
78 else
79 zerocount=zerocount+1;
80 c(i)=3;
81 end
82 end
83 [Z1,D1]=ordschur(Z,D1,c);
84 negindex=zerocount+1;
85 posindex=negindex+negativecount;
86
87 %compute X1
88 A0=D1(1:zerocount,1:zerocount);
89 k1=D1(1:zerocount,negindex : lengthD);
90 k2=D1(negindex: lengthD,negindex : lengthD);
91 X1=sylvester(A0,-k2,-k1);
92
93 %compute X2
94 lengthk2=length(k2);
95 posk2index=1+negativecount;
96 Aneg= k2(1:negativecount,1:negativecount);
97 Apos= k2(posk2index:lengthk2,posk2index:lengthk2);
98 Aposneg= k2(1:negativecount,posk2index:lengthk2);
99 X2=sylvester(Aneg,-Apos,-Aposneg);
100
101 %Compute Y and Corresponding A(T)
102 e1=eye(lengthD);
103 e1(1:size(X1,1),(size(e1)-size(X1,2)+1):lengthD)=X1;
104
105 e2=eye(size(X2,1)+size(X2,2));
106 e2(1:size(X2,1),(size(e2)-size(X2,2)+1):size(e2))=X2;
107
108 e3=eye(lengthD);
109 e3((lengthD-size(e2)+1):lengthD,(lengthD-size(e2)+1):lengthD)=e2;
110
111 Y=Z1*e1*e3;
112 Yinv=inv(Y);
113
114 T=Y\A*Y;
115
116% if zerocount ~= 0
117% X1_temp = sylvester(-D1(1:zerocount,1:zerocount),D1((zerocount+1):length(D1),(zerocount+1):length(D1)),-D1(1:zerocount,(zerocount+1):length(D1)));
118%
119% % X1_temp = -D1(1:zerocount,(zerocount+1):length(D1))/D1((zerocount+1):length(D1),(zerocount+1):length(D1));
120% X2_temp = sylvester(-D1((zerocount+1):(zerocount+negativecount),(zerocount+1):(zerocount+negativecount)),D1((zerocount+negativecount+1):length(D1),(zerocount+negativecount+1):length(D1)),-D1((zerocount+1):(zerocount+negativecount),(zerocount+negativecount+1):length(D1)));
121% Y_temp = Z1*[eye(size(X1_temp,1)) -X1_temp;zeros(size(X1_temp,2),length(D1)-size(X1_temp,2)) eye(size(X1_temp,2))]*[eye(zerocount) zeros(zerocount,negativecount) zeros(zerocount,positivecount);zeros(negativecount,zerocount) eye(negativecount) -X2_temp;zeros(positivecount,zerocount) zeros(positivecount,negativecount) eye(positivecount)];
122% else
123% X2_temp = sylvester(-D1(1:negativecount,1:negativecount),D1((negativecount+1):length(D1),(negativecount+1):length(D1)),-D1(1:negativecount,(negativecount+1):length(D1)));
124% Y_temp = Z1*[eye(negativecount) -X2_temp;zeros(positivecount,negativecount) eye(positivecount)];
125% end
126%
127%
128% % diagonal_mat=(inv(Y_temp))*A*Y_temp;
129% diagonalized_A=double((Y_temp\A)*Y_temp);
130% diagonalized_A_num(1:length(Qin),length(Qin)*(i-1)+1:length(Qin)*(i-1)+length(Qin)) = diagonalized_A;
131%
132% diag_A_zero = diagonalized_A(1:zerocount,1:zerocount);
133% diag_A_negative = diagonalized_A(zerocount+1:zerocount+negativecount,zerocount+1:zerocount+negativecount);
134% diag_A_positive = diagonalized_A(zerocount+negativecount+1:length(diagonalized_A),zerocount+negativecount+1:length(diagonalized_A));
135%
136% Y_temp_inv_trans = (Y_temp\eye(length(Y_temp)))';
137
138 %RETURN Lneg Lpos Lzero
139 Lzero=Yinv(1:zerocount,:);
140 Lneg=Yinv(negindex:zerocount+negativecount,:);
141 Lpos=Yinv(posindex:lengthD,:);
142
143 if ~isempty(zerodrift)
144 Lzero=[Lzero,Lzero*zeroconverter];
145 Lpos=[Lpos,Lpos*zeroconverter];
146 Lneg=[Lneg,Lneg*zeroconverter];
147 for i=1:length(zerodrift)
148 last=length(Q)+1-i;
149 nextzero=zerodrift(i);
150 templzerorow=Lzero(:,last);
151 templposrow=Lpos(:,last);
152 templnegrow=Lneg(:,last);
153 Lzero(:,last)=Lzero(:,nextzero);
154 Lneg(:,last)=Lneg(:,nextzero);
155 Lpos(:,last)=Lpos(:,nextzero);
156 Lpos(:,nextzero)=templposrow;
157 Lneg(:,nextzero)=templnegrow;
158 Lzero(:,nextzero)=templzerorow;
159
160 end
161 end
162
163 %Return values f(0),f(b) and F(B) when coefficients a=1
164 syms x
165 integralsolution=[Lzero*(upperB-lowerB); (Aneg\‍(expm(Aneg*(upperB-lowerB))-eye(size(Aneg,1))))*Lneg;((-Apos)\(expm(-Apos*(upperB-lowerB))-eye(size(Apos,1))))*Lpos];
166 lowsolution=[Lzero; expm(Aneg*0)*Lneg;expm((-Apos)*(upperB-lowerB))*Lpos];
167 upsolution=[Lzero; expm(Aneg*(upperB-lowerB))*Lneg;expm((-Apos)*(0))*Lpos];
168 % f_bar_result = [Lzero; expm(Aneg*x)*Lneg;expm(-Apos*(B-x))*Lpos]
169
170 lowerboundsolutions{multi}=lowsolution;
171 upperboundsolutions{multi}=upsolution;
172 integralsolutions{multi}=integralsolution;
173 Lzeromulti{multi}=Lzero;
174 Lposmulti{multi}=Lpos;
175 Lnegmulti{multi}=Lneg;
176 Anegmulti{multi}=Aneg;
177 Aposmulti{multi}=Apos;
178end
179end