Стартирайте matlab for цикъл от ненулева стойност

Имам кода по-долу, в който се опитвам да стартирам цикъла for "number_panels" и "number_turbines" от ненулево число.

По-конкретно опитвам се за 3000 до 4000 "number_panels" с интервал от 500 панела и от 5 до 8 "number_turbines" с един интервал на турбина, т.е.

number_of_days = 2;

for number_panels = 3000:500:4000 % range of PV panel units examined

for number_turbines = 5:8  % range of wind turbine units examined


    for h=1:24 %# hours

       for d = 1:number_of_days %# which day



            n = h + 24*(d-1);
            % hourly_deficit_1(...,..., h, d)= Demand(n)-(PV_supply(n)... %


            hourly_deficit(number_panels + 1, number_turbines + 1, h,d) = hourly_annual_demand(n) - (hourly_annual_PV(n)*number_panels) - (hourly_annual_WT(n)*number_turbines);% hourly power deficit (RES supply with demand)


            if hourly_deficit(number_panels + 1, number_turbines + 1, h,d)< 0 % zero out negative hourly deficit values (this is power surplus from RES)

                hourly_deficit(number_panels + 1, number_turbines + 1, h,d) = 0;

            end

Когато правя това, получавам размер (hourly_deficit) = 4001,9,24,2, докато очаквам и се опитвам да постигна размер 3,4,24,2. Някой знае ли къде бъркам?


person user643469    schedule 23.07.2012    source източник


Отговори (1)


Стойността на променливата number_panels започва от 3000 вместо от 0 или 1. По този начин, когато индексирате матрица с тази променлива като стойност на индекса, Matlab смята, че искате 3001-ви индекс и по този начин ви дава матрица, която е 3000 нули, като 3001-вата е настройте на това, което питате.

Ако следвате цикъла в следващия му цикъл, стойността на number_panels става 3500. Сега индексирате на 3501 въз основа на вашия код. Това означава, че всички места от 3002 до 3500 ще бъдат запълнени с нули и 3501 ще бъде зададена на каквато и стойност да му дадете.

Същата логика важи и за number_turbines Единствената разлика е, че ще индексирате с 1 вместо с 500, както сте с number_panels.

Ако искате да се върнете към матрицата на размера, която очаквате, ще трябва да промените начина, по който извиквате стойностите на индекса. Това може да стане по няколко начина. Можете да имате брояч в for-цикъла или можете да използвате математика на модула. Математическият модул не работи добре, когато използвате размер на стъпката, който не е 1. Също така не работи, когато стигнете до точката, в която имате стойност на индекс, която е кратна на началния ви индекс.

Ще трябва да разберете какво ще работи най-добре за вас на тази арена. Особено след като искате да използвате размер на стъпката, който не е 1. Но за number_turbines, което преминава от 5 до 8, можете просто да индексирате, като използвате number_turbines - 5 + 1 или по-сбито number_turbines-4.

За по-голяма яснота, ето кода, който предоставихте с необходимите настройки, за да покажете използването на споменатото в коментарите. Моля, обърнете внимание, че ще трябва да промените -4 за стойността на индекса number_turbines, ако започнете от нещо различно от 5. Също така имайте предвид, че трябва да индексирате вектора number_panels сега, тъй като това не е циклична стойност.

Надявам се това да помогне!

number_of_days = 2;
number_panels = 3000:500:4000;

for idx_number_panels = 1:length(number_panels) % range of PV panel units examined

    for number_turbines = 5:8  % range of wind turbine units examined


        for h=1:24 %# hours

            for d = 1:number_of_days %# which day



                n = h + 24*(d-1);
                % hourly_deficit_1(...,..., h, d)= Demand(n)-(PV_supply(n)... %


                hourly_deficit(idx_number_panels , number_turbines -4, h,d) = hourly_annual_demand(n) - (hourly_annual_PV(n)*number_panels(idx_number_panels)) - (hourly_annual_WT(n)*number_turbines);% hourly power deficit (RES supply with demand)


                if hourly_deficit(idx_number_panels, number_turbines -4, h,d)< 0 % zero out negative hourly deficit values (this is power surplus from RES)

                    hourly_deficit(idx_number_panels, number_turbines -4, h,d) = 0;

                end
            end
        end
    end
end
person Ben A.    schedule 23.07.2012
comment
добре, така че трябва да използвам number_panels = 2999:500:3999? и ако е така, как да се отърва от нулите, така че да мога да чета резултатите от набора от данни по-лесно. Благодаря ти - person user643469; 23.07.2012
comment
Ще трябва да сте малко креативни с това решение. Честно казано може да е по-лесно, ако просто имате друга променлива, която започва от 1 и индексира с всеки цикъл за number_panels. - person Ben A.; 23.07.2012
comment
Това е мястото, където страховитият синтаксис for panel_num=1:length(number_panels) всъщност има смисъл. - person tmpearce; 23.07.2012
comment
не съм сигурен, че следвам, дължината (number_panels) трябва да даде вектор 3x1 от 3000;3500;4000 брой панели? - person user643469; 23.07.2012
comment
Актуализирах с примерен код, който да следвате. Надяваме се, че работи, тъй като просто е въведен и не е тестван. - person Ben A.; 23.07.2012
comment
благодаря, но горното умножава всичко по дължината на вектора, който е 3, а не по 3000, 3500 и 4000. - person user643469; 23.07.2012
comment
Има ли логика в това? Не съм сигурен, че командата за дължина трябва да се използва във всеки случай - person user643469; 23.07.2012
comment
Е, проверете мястото, където трябва да се случи това умножение, и се уверете, че е индексирано правилно. Както казах, не можах да тествам това, за да се уверя, че работи. Но съм доста уверен, че трябва да работи. Уверете се, че използвате number_panels(idx_number_panels) като стойност за умножение. Не idx_number_panels - person Ben A.; 23.07.2012