Nested For Loop Help

1 次查看(过去 30 天)
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
  2 个评论
dpb
dpb 2019-3-18
Overload!!!!
We don't have your data, don't "know nuthnk!" about your problem space so have essentially "no chance!" to fix your problem as given.
As a start, I would recommend you compute what data you need and get it organized so you can retrieve that which needs to be plotted together by addressing it either as indices in arrays or by variables in a table or other data structure.
Once you have that, decide what is to be plotted on a given figure and arrange to create that number of figures and pull the necessary data for each...
Trying to do everything in one set of deeply nested loops is just too much complexity to keep straight.
Stephen23
Stephen23 2019-3-18
编辑:Stephen23 2019-3-18
Start by moving your scatter after the two inner loops, and preallocate the plotted data arrays before the two inner loops (pseudocode):
for ii = 1:3
A = nan(...); % preallocate
B = nan(...); % preallocate
C = nan(...); % preallocate
...
for jj = 1:5
for kk = 1:8
.... your code
end
end
figure()
subplot(...)
scatter(A,...)
subplot(...)
scatter(B,...)
subplot(...)
scatter(C,...)
end
That will give you exactly nine plots in three figures.

请先登录,再进行评论。

采纳的回答

Star Strider
Star Strider 2019-3-18
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.
  2 个评论
Jacey Allen
Jacey Allen 2019-3-18
Thank you so much! This gives me the 9 plots I need.
Star Strider
Star Strider 2019-3-18
As always, my pleasure!

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Graphics Object Programming 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by