1function [coefficients,boundaries,Lzeromulti,Lnegmulti,Lposmulti,Anegmulti,Aposmulti] = MRMFQSolver(Qregimes,Qboundaries,driftregimes,driftboundaries,B)
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)
10 if driftregimes(level,state)>0
11 nonzeroboundaries(level,state)=0;
13 elseif level==size(nonzeroboundaries,1)
14 if driftregimes(level-1,state)<0
15 nonzeroboundaries(level,state)=0;
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;
21 if (driftregimes(level,state)>0 && (driftboundaries(level,state)<=0))
22 zerolowerpdf(level,state)=1;
24 if (driftregimes(level-1,state)<0 && (driftboundaries(level,state)>=0))
25 zeroupperpdf(level-1,state)=1;
32 for k=1:size(driftregimes,1)
33 Rregimes(:,:,k)=diag(driftregimes(k,:));
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);
40 for funcindex=1:size(driftboundaries,1)
41 zeroboundariesindexes=find(nonzeroboundaries(funcindex,:)==0);
42 Qeliminated=Qboundaries(:,:,funcindex);
43 Qeliminated(zeroboundariesindexes,:)=[];
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);
53 H(rowindex:rowindex+size(Qeliminated,1)-1,columnindex:columnindex+size(Rregimes(:,:,funcindex-1),2)-1)=Qeliminated;
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;
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;
87Hbar(:,1) = ones(size(H,1),1);
89z = eye(1,size(H,2))/Hbar;
93% for i=1:size(driftboundaries,1)
94% if i<size(driftboundaries,1)
96% ithblocksize=sum(nonzeroboundaries(i,:) == 1);
98% ithblocksize=nextblocksize;
100% nextblocksize=sum(nonzeroboundaries(i+1,:) == 1)+size(lowerboundsolutions{i},1);
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);
105% ithblocksize=nextblocksize;
107% Hm{i}=Hbar(rowindex2:rowindex2+ithblocksize-1,columnindex2:columnindex2+ithblocksize-1);
108% rowindex2=rowindex2+ithblocksize;
109% columnindex2=columnindex2+ithblocksize;
113 normalizationcoefmasses=0;
114 normalizationcoefintegrals=0;
115 for level=1:size(driftboundaries,1)
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;
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);
131 normalizationcoef=normalizationcoefintegrals+normalizationcoefmasses;
132 finalZ=z/normalizationcoef;
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)
140 coefficients{level}=finalZ(index2:index2+size(integralsolutions{level},1)-1);
141 index2=index2+size(integralsolutions{level},1);
145 for level=1:size(driftboundaries,1)
147 for k=1:size(nonzeroboundaries,2)
148 if nonzeroboundaries(level,k) == 1
149 bound=boundaries{level};
150 nonzeroboundaries(level,k) = bound(l);
154 boundaries{level}=nonzeroboundaries(level,:);