How do you make multiple for loops into one for loop?
37 views (last 30 days)
Show older comments
Hello,
I have a rough code that I want to fix/optimize. I have 5 for loops: all of them utilize the same given data but each loop builds off each other i.e. one loop creates a 10x1 matrix and the following loop uses those values to create a new set and so on. Each loop has a new equation which creates the values that uses the previous loop's value all to end in a final loop that uses all the found values to create a 10x10 matrix. I am struggling to get the final loop to work as well as optimizing the code to reduce the number of loops for the equations. Thank you!
clc; clear vars; clear all;
G=1367;%solar constant
phi=43.07;%lattitude of madison, wi
n=32;
delta = 23.45*sind(360*((284+n)/365));
w1=-75; w2=75; %hour angles from 7AM-5PM
w=15.* [-5 -4 -3 -2 -1 1 2 3 4 5]; %hour angles
t=[8 9 10 11 12 1 2 3 4 5]; %time 7AM-5PM
kT=[0.5 0.5 0.5 0.6 0.6 0.7 0.7 0.7 0.8 0.8]; %given values
A = ((12*3600*G)/pi); %simplified for eq
B = (1+(0.033*cosd((360*n)/365)));%simplified for eq
C = ((cosd(phi)*cosd(delta)*(sind(w2)-sind(w1))...%simplified for eq
+((pi*(w2-w1)/180)*sind(phi)*sind(delta))));%simplified for eq
Io = A*B*C; %hourly radiation on horizontal surface MJ/m^2
N=length(kT);
O=length(w);
IT=zeros(N, length(w));%populated matrix that fills, used for graphing
for j=1:O %1st loop uses changing w values
Rb(j,:)=(cosd(phi)*cosd(delta).*cosd(w(j)))+(sind(phi)*sind(delta));
%this equation is needed for final IT equation
end
for i=1:N %2nd loop needed to find I for final IT equation w/changing kT vals
I(i,:)=Io.*kT(i); %needed for following loops
end
for i=1:N %3rd loop needed to find Id for final IT equation w/changing kT vals
Id(i,:)=(.9511-(.1604*kT(i))+(4.388*kT(i)^2)-(16.638*kT(i)^3)+(12.336*kT(i)^4)).*I(i);
end
for i=1:N %4th loop needed to find Ib for final IT equation w/changing kT vals
Ib(i,:)=(1-(Id(i)/I(i)))*I(i);
end
for i=1:N %final loop uses all values created by previous loops to create a 10x10 matrix
%not exactly sure how to do the final loop, this is a rough guess
for k=1:length(w)
IT(i,k)=(Ib(i)*Rb(k))+(Id(i)*((1-cosd(beta))/2))+(I(i)*rho*((1-cosd(beta))/2));
%not sure if this is possible
end
end
2 Comments
Manikanta Aditya
on 31 Mar 2024
Hey,
Looks like you are trying to calculate the values of 'Rb', 'I','Id','Ib' and 'IT' in seperate loops. You can actually calculate all these values in a single loop.
clc; clear vars; clear all;
G=1367; %solar constant
phi=43.07; %latitude of Madison, WI
n=32;
delta = 23.45*sind(360*((284+n)/365));
w1=-75; w2=75; %hour angles from 7AM-5PM
w=15.* [-5 -4 -3 -2 -1 1 2 3 4 5]; %hour angles
kT=[0.5 0.5 0.5 0.6 0.6 0.7 0.7 0.7 0.8 0.8]; %given values
A = ((12*3600*G)/pi); %simplified for eq
B = (1+(0.033*cosd((360*n)/365))); %simplified for eq
C = ((cosd(phi)*cosd(delta)*(sind(w2)-sind(w1))... %simplified for eq
+((pi*(w2-w1)/180)*sind(phi)*sind(delta))); %simplified for eq
Io = A*B*C; %hourly radiation on horizontal surface MJ/m^2
N=length(kT);
O=length(w);
IT=zeros(N, length(w)); %populated matrix that fills, used for graphing
for i=1:N
for j=1:O
Rb=(cosd(phi)*cosd(delta).*cosd(w(j)))+(sind(phi)*sind(delta));
I=Io.*kT(i);
Id=(.9511-(.1604*kT(i))+(4.388*kT(i)^2)-(16.638*kT(i)^3)+(12.336*kT(i)^4)).*I;
Ib=(1-(Id/I))*I;
IT(i,j)=(Ib*Rb)+(Id*((1-cosd(beta))/2))+(I*rho*((1-cosd(beta))/2));
end
end
Thanks.
Accepted Answer
Voss
on 31 Mar 2024
Edited: Voss
on 31 Mar 2024
No loops required:
Rb = cosd(phi)*cosd(delta).*cosd(w)+(sind(phi)*sind(delta)); % row vector the same size as w
I = Io.*kT; % row vector the same size as kT
Id = (0.9511-0.1604*kT+4.388*kT.^2-16.638*kT.^3+12.336*kT.^4).*I; % row vector the same size as kT and I
Ib = (1-(Id./I)).*I; % row vector the same size as kT, I, and Id
IT = Ib.'.*Rb+Id.'.*(1-cosd(beta))/2+I.'*rho*((1-cosd(beta))/2); % matrix of size numel(kT)-by-numel(w)
% because I, Id, and Ib are transposed
% in this line and Rb is not
(Assuming beta and rho are scalars - they are not defined in the question.)
More Answers (0)
See Also
Categories
Find more on Oceanography and Hydrology in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!