Расчет накопительной суммы с помощью для циклов - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь найти сумму переменных в модельном поле из 27 слоев.Большинство переменных применимы к каждому слою, но для одной из переменных я измеряю изменение высоты и поэтому вычитаю «верхнюю высоту» предыдущих слоев из общей высоты в данном слое.

В основномЯ просто не уверен, как представить накопительную сумму в любой точке, используя циклы 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, что, когда он видит этот вход (или вывод ошибки), просто установить его равным нулю?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Итак, по комментарию я понял, что мне нужно просто пойти простым путем и указать первый слой вручную, а затем сложить оставшиеся.Вот код, который это исправил:

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
0 голосов
/ 14 февраля 2019

Использование структуры 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).В противном случае непредвиденные ошибки просто подавляются.

...