Info

Cette question est clôturée. Rouvrir pour modifier ou répondre.

Variable cannot be overwritten in an if loop

1 vue (au cours des 30 derniers jours)
Chun Zhang
Chun Zhang le 19 Sep 2019
Clôturé : MATLAB Answer Bot le 20 Août 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!

Réponses (2)

Harsha Priya Daggubati
Harsha Priya Daggubati le 23 Sep 2019
Modifié(e) : Harsha Priya Daggubati le 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 commentaire
Chun Zhang
Chun Zhang le 23 Sep 2019
Thankyou so much Harsha. I'll try out your advice.

darova
darova le 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!

Translated by