MATLAB: Nested For Loop Help

indexingnested for loops

I am trying to graph 9 plots. 3 for each altitude, with given T0 and P0, for Mach (M0) against F,spillage, and N_corr4. I had to find an M0 for each altitude(i), each mdotf(j), and each operating line that has the given parameters from the mdot_corr2 to N_corr2 section of the code(k). I'm pretty sure I have a good concept for finding the needed values to come up with my plots, but I am not confident in how I indexed the variables, used fsolve with the indexing, nested the for loops, and how I made the plots inside of the for loops. When I ran this code, it took forever and gave me over 400 plots when I stopped it. Any help would be much appreciated!!
alt=[0,5000,10000];
T0=[288,255.65,223.26];
P0=[101325,54019.9,26500];
mdotf=[mdotfR*.2:mdotfR*.2:mdotfR*3];
mdot_corr2=[mdot_corr21,mdot_corr22,mdot_corr23,mdot_corr24,mdot_corr25,mdot_corr2R,mdot_corr26,mdot_corr27];
total_temp_ratio_42=[total_temp_ratio_42_1,total_temp_ratio_42_2,total_temp_ratio_42_3,total_temp_ratio_42_4,total_temp_ratio_42_5,total_temp_ratio_42_R,total_temp_ratio_42_6,total_temp_ratio_42_7];
tc=[tc1,tc2,tc3,tc4,tc5,tcR,tc6,tc7];
pc=[pc1,pc2,pc3,pc4,pc5,pcR,pc6,pc7];
tt=[tt1,tt2,tt3,tt4,tt5,ttR,tt6,tt7];
pt=[pt1,pt2,pt3,pt4,pt5,ptR,pt6,pt7];
N_corr2=[N_corr21,N_corr22,N_corr23,N_corr24,N_corr25,N_corr2R,N_corr26,N_corr27];
for i=1:3
for j=1:15
for k=1:8
fun3=@(M0) (((pdR*P0(i)*(1+((g-1)/2)*M0^2)^(g/(g-1)))/Pstp)*sqrt(Tstp)*mdot_corr2(k)*cp*sqrt((T0(i)*(1+((g-1)/2)*M0^2)))*(total_temp_ratio_42(k)-tc(k))-mdotf(j)*h);
M0_0=.5;
M0(i,j,k)=fsolve(fun3,M0_0);
%Station 0%
u0(i,j,k)=M0(i,j,k)*sqrt(g*R*T0(i));
rho0(i)=P0(i)/(R*T0(i));
tr(i,j,k)=1+((g-1)/2)*M0(i,j,k)^2;
pr(i,j,k)=tr(i,j,k)^(g/(g-1));
%Station 2%
Pt2(i,j,k)=pdR*P0(i)*(1+((g-1)/2)*M0(i,j,k)^2)^(g/(g-1));
Tt2(i,j,k)=T0(i)*(1+((g-1)/2)*M0(i,j,k)^2);
%Station 3%
Tt3(i,j,k)=Tt2(i,j,k)*tc(k);
Pt3(i,j,k)=Pt2(i,j,k)*pc(k);
%Station 4%
Tt4(i,j,k)=total_temp_ratio_42(k)*Tt2(i,j,k);
Pt4(i,j,k)=Pt3(i,j,k)*pbR;
%Station 5%
Tt5(i,j,k)=Tt4(i,j,k)*tt(k);
Pt5(i,j,k)=Pt4(i,j,k)*pt(k);
%Station 8%
Tt8(i,j,k)=Tt5(i,j,k);
Pt8(i,j,k)=Pt5(i,j,k);
T8(i,j,k)=Tt8(i,j,k)/(1+((g-1)/2)*M8^2);
P8(i,j,k)=Pt8(i,j,k)/((1+((g-1)/2)*M8^2)^(g/(g-1)));
rho8(i,j,k)=P8(i,j,k)/(R*T8(i,j,k));
u8(i,j,k)=M8*sqrt(g*R*T8(i,j,k));
%Performance%
f(i,j,k)=(tr(i,j,k)*(total_temp_ratio_42(k)-tc(k)))/(h/(cp*T0(i)));
mdot(i,j,k)=mdotf(j)/f(i,j,k);
A0(i,j,k)=mdot(i,j,k)/(rho0(i)*u0(i,j,k));
spillage(i,j,k)=(rho0(i)*u0(i,j,k)*A1R)-(rho0(i)*u0(i,j,k)*A0(i,j,k));
A8(i,j,k)=mdot(i,j,k)/(rho8(i,j,k)*u8(i,j,k));
F(i,j,k)=mdot(i,j,k)*(u8(i,j,k)-u0(i,j,k))+(P8(i,j,k)-P0(i))*A8(i,j,k);
mdot_corr4(i,j,k)=mdot(i,j,k)*(sqrt(Tt4(i,j,k)/Tstp)/(Pt4(i,j,k)/Pstp));
turb_xaxis(k)=mdot_corr2(k)*N_corr2(k)*(1/(pc(k)*pbR));
N_corr4(i,j,k)=turb_xaxis(k)/mdot_corr4(i,j,k);
if pc(k)>15.6
break
end
if Tt4(i,j,k)>2200
break
end
if N_corr2(k)>25000
break
end
if M0(i,j,k)<0 && M0(i,j,k)>2.4
break
end
figure
hold on
scatter(M0(i,j,k),F(i,j,k))
hold off
figure
hold on
scatter(M0(i,j,k),spillage(i,j,k))
hold off
figure
hold on
scatter(M0(i,j,k),N_corr4(i,j,k))
hold off
end
end
end

Best Answer

If you only want plots for the three ‘i’ indices, I would remove the scatter calls from the innermost loop, change them to plot calls, and put them in the outermost loop instead:
for i=1:3
for j=1:15
for k=1:8
... CODE ...
end
end
figure
hold on
plot(squeeze(M0(i,:,:)),squeeze(F(i,:,:)))
hold off
figure
hold on
plot(squeeze(M0(i,:,:)),squeeze(spillage(i,:,:)))
hold off
figure
hold on
plot(squeeze(M0(i,:,:)),squeeze(N_corr4(i,:,:)))
hold off
end
The scatter function wants only vectors, however plot will accept 2D matrices. The squeeze function eliminates the first (‘i’ dimension), so plot will not throw an error on matrices with dimensions greater than 2.
NOTE — This is UNTESTED CODE. I can’t run your code to check this, however some experiments I did suggest that this will work.
Experiment to get the result you want.