Want to use nested For loop

6 vues (au cours des 30 derniers jours)
Ashi Khajotia
Ashi Khajotia le 20 Avr 2023
Commenté : Ashi Khajotia le 20 Avr 2023
Hello,
I wish to change value of k in my code after running the code for all j values and then, I wish to plot for the curves for different k values in a single window. But I am confused in putting the index values.
n0 = 1;
n1 = 2;
n2 = 1;
n3 = 2;
d1 = 0.1;
d2 = 0.2;
lam = 3:0.01:7;
th = 0;
phi1 =(d1./lam).*sqrt((n1));
phi2 = (d2./lam).*sqrt((n2));
z = zeros(size(lam));
for k = 1:1:6
for j = 1:numel(lam)
D0 = [2 2; n0 -n0];
D1 = [2 2;n1 -n1];
D2 = [2 2; n2 -n2];
D3 = [2 2;n3 -n3];
P1 = [exp(-1i.*phi1(j)) 1; 1 exp(1i.*phi1(j))];
P2 = [exp(-1i*phi2(j)) 1; 1 exp(1i*phi2(j))];
M = D0*([D1*P1*D2*P2]^(k))*D3;
z(j) = M(2,1)./M(1,1);
end
end
plot(lam,z);

Réponse acceptée

chicken vector
chicken vector le 20 Avr 2023
You need to add a second dimension to your z array:
n0 = 1;
n1 = 2;
n2 = 1;
n3 = 2;
d1 = 0.1;
d2 = 0.2;
lam = 3:0.01:7;
th = 0;
phi1 =(d1./lam).*sqrt((n1));
phi2 = (d2./lam).*sqrt((n2));
z = zeros(length(lam),6); % each column corresponds to a different value of k
for k = 1:1:6
for j = 1:numel(lam)
D0 = [2 2; n0 -n0];
D1 = [2 2;n1 -n1];
D2 = [2 2; n2 -n2];
D3 = [2 2;n3 -n3];
P1 = [exp(-1i.*phi1(j)) 1; 1 exp(1i.*phi1(j))];
P2 = [exp(-1i*phi2(j)) 1; 1 exp(1i*phi2(j))];
M = D0*([D1*P1*D2*P2]^(k))*D3;
z(j,k) = M(2,1)./M(1,1); % add column variable 'k' to z
end
end
plot(lam,z);
Now z is a 401x6 array where each column corresponds to a different value of k.
For example, you can access your curve at k=3 as:
k = 3;
curve3 = z(:,k);
Notice that this code will generate 6 identical lines therefore you will see only one, but that depends on how you define z.
When you do M(2,1)./M(1,1) the value of k cannot influence the result because it applies identically to both numerator (M(2,1)) and denominator (M(1,1)).
  1 commentaire
Ashi Khajotia
Ashi Khajotia le 20 Avr 2023
Thanks a lot for your help :D

Connectez-vous pour commenter.

Plus de réponses (2)

Mathieu NOE
Mathieu NOE le 20 Avr 2023
hello
here you are
also you are plotting a complex valued array, so I assume you wanted to take the bas of it first
abs(z) seems to be always equal to 0.5 whatever k and lam (reduced the spacing for faster rendering)
n0 = 1;
n1 = 2;
n2 = 1;
n3 = 2;
d1 = 0.1;
d2 = 0.2;
lam = 3:0.1:7;
th = 0;
phi1 =(d1./lam).*sqrt((n1));
phi2 = (d2./lam).*sqrt((n2));
for k = 1:1:6
z = zeros(size(lam));
for j = 1:numel(lam)
D0 = [2 2; n0 -n0];
D1 = [2 2;n1 -n1];
D2 = [2 2; n2 -n2];
D3 = [2 2;n3 -n3];
P1 = [exp(-1i.*phi1(j)) 1; 1 exp(1i.*phi1(j))];
P2 = [exp(-1i*phi2(j)) 1; 1 exp(1i*phi2(j))];
M = D0*([D1*P1*D2*P2]^(k))*D3;
z(j) = M(2,1)./M(1,1);
end
leg_str{k} = ['k = ' num2str(k)];
plot(lam,abs(z));hold on
end
legend(leg_str);
  1 commentaire
Ashi Khajotia
Ashi Khajotia le 20 Avr 2023
Thank you for your help!! :D

Connectez-vous pour commenter.


Walter Roberson
Walter Roberson le 20 Avr 2023
n0 = 1;
n1 = 2;
n2 = 1;
n3 = 2;
d1 = 0.1;
d2 = 0.2;
lam = 3:0.01:7;
th = 0;
phi1 =(d1./lam).*sqrt((n1));
phi2 = (d2./lam).*sqrt((n2));
z = zeros(size(lam));
ax1 = subplot(2,1,1);
ax2 = subplot(2,1,2);
for k = 1:1:6
for j = 1:numel(lam)
D0 = [2 2; n0 -n0];
D1 = [2 2;n1 -n1];
D2 = [2 2; n2 -n2];
D3 = [2 2;n3 -n3];
P1 = [exp(-1i.*phi1(j)) 1; 1 exp(1i.*phi1(j))];
P2 = [exp(-1i*phi2(j)) 1; 1 exp(1i*phi2(j))];
M = D0*([D1*P1*D2*P2]^(k))*D3;
z(j) = M(2,1)./M(1,1);
end
plot(ax1, lam, real(z), 'DisplayName', "real k = " + k);
hold(ax1, 'on');
plot(ax2, lam, imag(z), 'DisplayName', "imag k = " + k);
hold(ax2, 'on');
end
hold(ax1, 'off');
legend(ax1, 'show');
hold(ax2, 'off');
legend(ax2, 'show')
The reason you only see one line on each graph is that all of the values are the same to within the tolerance of the graph.

Catégories

En savoir plus sur Graphics Performance dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by