LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
MRMFQSolver.m
1function [coefficients,boundaries,Lzeromulti,Lnegmulti,Lposmulti,Anegmulti,Aposmulti] = MRMFQSolver(Qregimes,Qboundaries,driftregimes,driftboundaries,B)
2
3 syms x
4 nonzeroboundaries=ones(size(driftboundaries));
5 zerolowerpdf=zeros(size(driftregimes));
6 zeroupperpdf=zeros(size(driftregimes));
7 for level=1:size(nonzeroboundaries,1)
8 for state=1:size(nonzeroboundaries,2)
9 if level==1
10 if driftregimes(level,state)>0
11 nonzeroboundaries(level,state)=0;
12 end
13 elseif level==size(nonzeroboundaries,1)
14 if driftregimes(level-1,state)<0
15 nonzeroboundaries(level,state)=0;
16 end
17 else
18 if (driftregimes(level,state)>0 && driftregimes(level-1,state)>0) || (driftregimes(level,state)<0 && driftregimes(level-1,state)<0)||(driftregimes(level,state)>0 && driftregimes(level-1,state)<0 && (driftboundaries(level,state)~=0))
19 nonzeroboundaries(level,state)=0;
20 end
21 if (driftregimes(level,state)>0 && (driftboundaries(level,state)<=0))
22 zerolowerpdf(level,state)=1;
23 end
24 if (driftregimes(level-1,state)<0 && (driftboundaries(level,state)>=0))
25 zeroupperpdf(level-1,state)=1;
26 end
27 end
28
29 end
30 end
31 Rregimes=Qregimes;
32 for k=1:size(driftregimes,1)
33 Rregimes(:,:,k)=diag(driftregimes(k,:));
34 end
35
36%obtainin L, A matrices and f(0),f(b) and F(B) when coefficients a=1
37 [lowerboundsolutions, upperboundsolutions, integralsolutions,Lzeromulti,Lnegmulti,Lposmulti,Anegmulti,Aposmulti]=AdditiveDecomposition(Qregimes,driftregimes,B);
38 rowindex=1;
39 columnindex=1;
40 for funcindex=1:size(driftboundaries,1)
41 zeroboundariesindexes=find(nonzeroboundaries(funcindex,:)==0);
42 Qeliminated=Qboundaries(:,:,funcindex);
43 Qeliminated(zeroboundariesindexes,:)=[];
44 if funcindex==1
45 H(1:size(Qeliminated,1),1:size(Rregimes(:,:,funcindex),2))=-Qeliminated;
46 rowindex=rowindex+size(Qeliminated,1);
47 H(rowindex:rowindex+size(lowerboundsolutions{funcindex},1)-1,1:size(Rregimes(:,:,funcindex),2))=lowerboundsolutions{funcindex}*Rregimes(:,:,funcindex);
48 columnindex=columnindex+size(Rregimes(:,:,funcindex),2);
49 elseif funcindex==size(driftboundaries,1)
50 H(rowindex:rowindex+size(upperboundsolutions{funcindex-1},1)-1,columnindex:columnindex+size(Rregimes(:,:,funcindex-1),2)-1)=upperboundsolutions{funcindex-1}*Rregimes(:,:,funcindex-1);
51 rowindex=rowindex+size(upperboundsolutions{funcindex-1},1);
52
53 H(rowindex:rowindex+size(Qeliminated,1)-1,columnindex:columnindex+size(Rregimes(:,:,funcindex-1),2)-1)=Qeliminated;
54 else
55 for state=1:size(driftboundaries,2)
56 if zeroupperpdf(funcindex-1,state)==1;
57 temp=upperboundsolutions{funcindex-1};
58 H(rowindex:rowindex+size(upperboundsolutions{funcindex-1},1)-1,columnindex:columnindex)=temp(:,state);
59 columnindex=columnindex+1;
60 end
61 end
62 H(rowindex:rowindex+size(upperboundsolutions{funcindex-1},1)-1,columnindex:columnindex+size(Rregimes(:,:,funcindex-1),2)-1)=upperboundsolutions{funcindex-1}*Rregimes(:,:,funcindex-1);
63 rowindex=rowindex+size(upperboundsolutions{funcindex-1},1);
64 H(rowindex:rowindex+size(Qeliminated,1)-1,columnindex:columnindex+size(Rregimes(:,:,funcindex),2)-1)=Qeliminated;
65 rowindex=rowindex+size(Qeliminated,1);
66 H(rowindex:rowindex+size(lowerboundsolutions{funcindex},1)-1,columnindex:columnindex+size(Rregimes(:,:,funcindex),2)-1)=-lowerboundsolutions{funcindex}*Rregimes(:,:,funcindex);
67 columnindex=columnindex+size(Rregimes(:,:,funcindex),2);
68 for state=1:size(driftboundaries,2)
69 if zerolowerpdf(funcindex,state)==1;
70 temp2=lowerboundsolutions{funcindex};
71 H(rowindex:rowindex+size(lowerboundsolutions{funcindex},1)-1,columnindex:columnindex)=temp2(:,state);
72 columnindex=columnindex+1;
73 end
74 end
75 end
76 end
77
78 Hbar=H;
79% Hbar(:,1)=0;
80% Hbar(1,1)=1;
81% b=Hbar(:,1);
82% ters=inv(Hbar);
83% % ters2=inv(ters);
84% z=Hbar(:,1)'/Hbar;
85% z=null(H');
86% z=z';
87Hbar(:,1) = ones(size(H,1),1);
88
89z = eye(1,size(H,2))/Hbar;
90
91 rowindex2=1;
92 columnindex2=1;
93% for i=1:size(driftboundaries,1)
94% if i<size(driftboundaries,1)
95% if i==1
96% ithblocksize=sum(nonzeroboundaries(i,:) == 1);
97% else
98% ithblocksize=nextblocksize;
99% end
100% nextblocksize=sum(nonzeroboundaries(i+1,:) == 1)+size(lowerboundsolutions{i},1);
101%
102% Hl{i}=Hbar(rowindex2+ithblocksize:rowindex2+ithblocksize+nextblocksize-1,columnindex2:columnindex2+ithblocksize-1);
103% Hu{i}=Hbar(rowindex2:rowindex2+ithblocksize-1,columnindex2+ithblocksize:columnindex2+ithblocksize+nextblocksize-1);
104% else
105% ithblocksize=nextblocksize;
106% end
107% Hm{i}=Hbar(rowindex2:rowindex2+ithblocksize-1,columnindex2:columnindex2+ithblocksize-1);
108% rowindex2=rowindex2+ithblocksize;
109% columnindex2=columnindex2+ithblocksize;
110% end
111
112 index=1;
113 normalizationcoefmasses=0;
114 normalizationcoefintegrals=0;
115 for level=1:size(driftboundaries,1)
116
117 countnonzeroboundaries=sum(nonzeroboundaries(level,:) == 1);
118 if countnonzeroboundaries>0
119 normalizationcoefmasses=normalizationcoefmasses+sum(z(index:index+countnonzeroboundaries-1));
120 %boundaries{level}=z(index:index+countnonzeroboundaries-1);
121 index=index+countnonzeroboundaries;
122 end
123
124 if level<size(driftboundaries,1)
125 normalizationcoefintegrals=normalizationcoefintegrals+ sum(z(index:index+size(integralsolutions{level},1)-1)*integralsolutions{level});
126 %coefficients{level}=z(index:index+size(integralsolutions(:,:,level),1)-1);
127 index=index+size(integralsolutions{level},1);
128
129 end
130 end
131 normalizationcoef=normalizationcoefintegrals+normalizationcoefmasses;
132 finalZ=z/normalizationcoef;
133 index2=1;
134 for level=1:size(driftboundaries,1)
135 countnonzeroboundaries=sum(nonzeroboundaries(level,:) == 1);
136 boundaries{level}=finalZ(index2:index2+countnonzeroboundaries-1);
137 index2=index2+countnonzeroboundaries;
138 if level<size(driftboundaries,1)
139
140 coefficients{level}=finalZ(index2:index2+size(integralsolutions{level},1)-1);
141 index2=index2+size(integralsolutions{level},1);
142
143 end
144 end
145 for level=1:size(driftboundaries,1)
146 l=1;
147 for k=1:size(nonzeroboundaries,2)
148 if nonzeroboundaries(level,k) == 1
149 bound=boundaries{level};
150 nonzeroboundaries(level,k) = bound(l);
151 l=l+1;
152 end
153 end
154 boundaries{level}=nonzeroboundaries(level,:);
155 end
156
157
158
159end