使用 for 循环计算累积和
Calculating a cumulative sum with for loops
我正在尝试对 27 层模型字段中的变量求和。大多数变量适用于每一层,但对于其中一个变量,我正在测量高度的变化,因此从给定层的总高度中减去前面的层 "top height"。
基本上,我只是不确定如何使用 for 循环在任何时候表示累积和。
我目前正在根据我的代码尝试使用两个 for 循环来计算累加和并得到错误。
"Attempted to access flheight(299,162,0,12); index must be a positive integer or logical."
我知道那是因为 "flheight(299,162,0,12)" 不存在,因为没有 "layer = 0" 的三维空间。
no2molcm2 = 0;
dh = 0;
patm = 0;
no2ppm = 0;
for n=0:26
for i=1:27
T = Temp(299,162,i,12); % K
dh = (flheight(299,162,i,12)*100) -flheight(299,162,n,12)*100;
patm = sum(Pres(299,162,i,12))*(1/101325); %atm
R = 82.06; % cm3*atm/(k*mol)
av = 6.022140857747*(10^23); % 1/mol
no2ppm = sum(no2(299,162,i,12));
no2molcm2 = cumsum(((no2ppm*av*patm)/(R*T))*dh);
end
end
我的问题是,当它看到此输入(或错误输出)时,我究竟如何告诉 matlab 将其设置为零?
使用 try-catch 结构可能是解决您所问问题的最简单、最直接的快速修复方法。
try
"something that can go wrong"
catch ME
"what to do if it didn't work"
end
请注意,如果您知道错误的原因,最好的做法是检查该原因是否适用。即 if(i==0) (do what you must)
。否则,意外的错误情况会被简单地抑制。
因此,根据评论,我意识到我应该采取简单的方法并手动指定第一层,然后将其余层相加。这是修复它的代码:
latco = 1;
lonco = 200;
layer1 = (no2(latco,lonco,1,12)*av*(Pres(latco,lonco,1,12)*
(1/101325)))/(R*Temp(latco,lonco,1,12)*h1);
for n=1:26
for i=2:27
T = Temp(latco,lonco,i,12); % K
dh1 = flheight(latco,lonco,i,12)*100;
dh2 = flheight(latco,lonco,n,12)*100;
dh = dh1 - dh2;
patm = sum(Pres(latco,lonco,i,12))*(1/101325); %atm
no2ppm = no2(latco,lonco,i,12);
no2molcm2_26 = sum(((no2ppm*av*patm)/(R*T))*dh);
end
end
no2final = layer1 + no2molcm2_26
我正在尝试对 27 层模型字段中的变量求和。大多数变量适用于每一层,但对于其中一个变量,我正在测量高度的变化,因此从给定层的总高度中减去前面的层 "top height"。
基本上,我只是不确定如何使用 for 循环在任何时候表示累积和。
我目前正在根据我的代码尝试使用两个 for 循环来计算累加和并得到错误。
"Attempted to access flheight(299,162,0,12); index must be a positive integer or logical."
我知道那是因为 "flheight(299,162,0,12)" 不存在,因为没有 "layer = 0" 的三维空间。
no2molcm2 = 0;
dh = 0;
patm = 0;
no2ppm = 0;
for n=0:26
for i=1:27
T = Temp(299,162,i,12); % K
dh = (flheight(299,162,i,12)*100) -flheight(299,162,n,12)*100;
patm = sum(Pres(299,162,i,12))*(1/101325); %atm
R = 82.06; % cm3*atm/(k*mol)
av = 6.022140857747*(10^23); % 1/mol
no2ppm = sum(no2(299,162,i,12));
no2molcm2 = cumsum(((no2ppm*av*patm)/(R*T))*dh);
end
end
我的问题是,当它看到此输入(或错误输出)时,我究竟如何告诉 matlab 将其设置为零?
使用 try-catch 结构可能是解决您所问问题的最简单、最直接的快速修复方法。
try
"something that can go wrong"
catch ME
"what to do if it didn't work"
end
请注意,如果您知道错误的原因,最好的做法是检查该原因是否适用。即 if(i==0) (do what you must)
。否则,意外的错误情况会被简单地抑制。
因此,根据评论,我意识到我应该采取简单的方法并手动指定第一层,然后将其余层相加。这是修复它的代码:
latco = 1;
lonco = 200;
layer1 = (no2(latco,lonco,1,12)*av*(Pres(latco,lonco,1,12)*
(1/101325)))/(R*Temp(latco,lonco,1,12)*h1);
for n=1:26
for i=2:27
T = Temp(latco,lonco,i,12); % K
dh1 = flheight(latco,lonco,i,12)*100;
dh2 = flheight(latco,lonco,n,12)*100;
dh = dh1 - dh2;
patm = sum(Pres(latco,lonco,i,12))*(1/101325); %atm
no2ppm = no2(latco,lonco,i,12);
no2molcm2_26 = sum(((no2ppm*av*patm)/(R*T))*dh);
end
end
no2final = layer1 + no2molcm2_26