Запустите Matlab для цикла с ненулевого значения

У меня есть код ниже, в котором я пытаюсь запустить цикл "number_panels" и "number_turbines" for с ненулевого числа.

В частности, я пытаюсь получить от 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