Info

This question is closed. Reopen it to edit or answer.

Variable cannot be overwritten in an if loop

1 view (last 30 days)
Chun Zhang
Chun Zhang on 19 Sep 2019
Closed: MATLAB Answer Bot on 20 Aug 2021
function [my1,my2,coeff1,coeff2]=tvcsysirf(theta,Q,R,H,x,p,n,c,T,indx,MaxRep); %MacRep = maximum repeat time
for dr=1:800
Sigma11 = Q(:,:,dr);
Sigma12 = Q(:,:,dr)*kron(H(:,1,dr)'*chol(R(:,:,dr))',eye(n*p+c))'; %n*p+c=19
Sigma22 = kron(H(:,1,dr)'*chol(R(:,:,dr))',eye(n*p+c))*Q(:,:,dr)...
*(kron(H(:,1,dr)'*chol(R(:,:,dr))',eye(n*p+c)))';
a=[0 sqrt(Sigma22(3,3)) 0 sqrt(Sigma22(6,6)) 0 sqrt(Sigma22(9,9)) 0 sqrt(Sigma22(12,12)) 0 sqrt(Sigma22(15,15)) 0 sqrt(Sigma22(18,18))]';%/2;
Mu = Sigma12(:,indx)*inv(Sigma22(indx,indx))*a;
Sigma = Sigma11-Sigma12(:,indx)*inv(Sigma22(indx,indx))*Sigma12(:,indx)';
[u d v] = svd(Sigma);
SS = u*sqrt(d)*v';
S = real(SS);
for rep=1:MaxRep
for t=1:T
roo1=1;
roo2=1;
if t==1;
c0=[theta(1:n*p+c:end,t,dr); theta(1:n*p+c:end,t,dr)];
y(:,t)=x(2:end);
while roo1==1
u1=Mu+S*randn(size(S,1),1);
u2=mvnrnd(zeros(size(Q,1),1),(Q(:,:,dr)+Q(:,:,dr).')/2,1)';
th1(:,t,rep)=theta(:,:,dr)+u1;
th2(:,t,rep)=theta(:,:,dr)+u2;
a1=companion(th1(:,t,rep),p,n,c);
a2=companion(th2(:,t,rep),p,n,c);
if (max(abs(eig(a1))))<1.0 & (max(abs(eig(a2))))<1.0
c1=[th1(1:n*p+c:end,t,rep); zeros(n*(p-1),1)];
c2=[th2(1:n*p+c:end,t,rep); zeros(n*(p-1),1)];
y1(:,t+1,rep)=c1+a1*y(:,t);
y2(:,t+1,rep)=c2+a2*y(:,t);
roo1=0; %%%%%%%%%%%%%%%%%%%%%%%%%
end
roo1=1;
end
else
while roo2==1
u2=0;
u1=u2;
th1(:,t,rep)=th1(:,t-1,rep)+u1;
th2(:,t,rep)=th2(:,t-1,rep)+u2;
a1=companion(th1(:,t,rep),p,n,c);
a2=companion(th2(:,t,rep),p,n,c);
if (max(abs(eig(a1))))<1.0& (max(abs(eig(a2))))<1.0
c1=[th1(1:n*p+c:end,t,rep); zeros(n*(p-1),1)];
c2=[th2(1:n*p+c:end,t,rep); zeros(n*(p-1),1)];
y1(:,t+1,rep)=c1+a1*y1(:,t,rep);
y2(:,t+1,rep)=c2+a2*y2(:,t,rep);
roo2=0;
else
roo2=1;
end
end
end
end
end
my1(:,:,dr)=squeeze(mean(y1(1:n,2:end,:),3));
my2(:,:,dr)=squeeze(mean(y2(1:n,2:end,:),3));
coeff1(:,dr)=squeeze(mean(th1(:,1,:),3));
coeff2(:,dr)=squeeze(mean(th2(:,1,:),3));
end
My problem here is that roo1 can never become 0 even if the two conditions in the if loop (a.k.a. (max(abs(eig(a1))))<1.0 and (max(abs(eig(a2))))<1.0) are fulfilled. Since the roo1 is always equal to 1, I ended up in an infinite loop. I am wondering how I can fix the problem. Heaps of thanks in advance!

Answers (2)

Harsha Priya Daggubati
Harsha Priya Daggubati on 23 Sep 2019
Edited: Harsha Priya Daggubati on 23 Sep 2019
Hi,
The code clearly shows roo1 gets updated only if max(abs(eig(a1)))<1.0 and max(abs(eig(a2))))<1.0. As per my understanding there is nothing wrong with the logic you have implemented. I doubt it might be due to the use of randomised values in your code. I suggest debugging your code using breakpoints and find the cause.
  1 Comment
Chun Zhang
Chun Zhang on 23 Sep 2019
Thankyou so much Harsha. I'll try out your advice.

darova
darova on 23 Sep 2019
Just remove
11Untitled.png

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!