带约束的向量

时间:2015-07-06 14:17:20

标签: matlab vector constraints

我正在为MATLAB上的论文工作,我有以下问题: 我有一个向量(Pbat = zeros(8760,1);),此向量取决于另外两个向量(PgenPload),应更改如下:

for i=1:length(Pload) 
    if i==1
        Pbat(i) = 1000;
    else
        if Pload(i) < Pgen(i)     %// Battery charging
            if Pbat(i) < Pbat_max && Pbat(i) > Pbat_min
                Pbat(i) = (Pbat(i-1)+(Pgen(i)-Pload(i));
            else
                Pbat(i) = Pbat(i-1);
            end
        elseif Pload(i) > Pgen(i)   %// Battery discharging
            if Pbat(i) < Pbat_max && Pbat(i) > Pbat_min
                Pbat(i) = (Pbat(i-1)-(Pload(i)-Pgen(i));
            else
                Pbat(i) = Pbat(i-1);
            end
        else
            Pbat(i) = Pbat(i-1);
        end
    end
end

但是,Pbat应该适用于Pbat_min <= Pbat(i) <= Pbat_max等约束所能获得的所有值。

当我运行上面的代码时,我得到一个常量值。此值为1000(在i==1时发生。)

2 个答案:

答案 0 :(得分:2)

我在您的代码中看到的问题是,在计算Pbat(i)之前,您检查[Pbat_min, Pbat_max]是否在Pbat(i) 的限制范围内。当Pbat初始化为0时,在此检查中,Pbat(i)将始终为零,测试可能会失败(如果Pbat_min>0)。

现在有另外一条评论:要计算Pbat(i),您可以添加(Pgen(i) - Pload(i))或减去(Pload(i) - Pgen(i))。这是完全相同的操作(简单的数学)。此外,如果该差异为零,则不添加任何内容 - 仍然是相同的操作。因此,您可以按

计算Pbat(i)
Pbat(i) = Pbat(i-1) + (Pgen(i) - Pload(i));

要包含对此答案的评论中所述的充电效率n,我们需要更多逻辑,因为它仅适用于Pgen(i) > Pload(i),即充电时。为此,我们可以例如引入增强效率

nAug = [1, n];

表示:放电时效率为1,充电时为n。现在,我们可以将差值乘以第一个元素(1),如果Pgen(i) <= Pload(i),则将其乘以第二个元素(n)。为此,我们使用逻辑表达式Pgen(i)>Pload(i),它返回0(第一种情况)或1(第二种情况)并添加1,因此我们可以使用它来逻辑索引增强向量nAug

Pbat(i) = Pbat(i-1) + nAug((Pgen(i)>Pload(i))+1) * (Pgen(i) - Pload(i));

计算完之后,您可以检查Pbat(i)是否在边界内,并将其设置为边界值,否则:

 if Pbat(i) > Pbat_max
     Pbat(i) = Pbat_max;
 elseif Pbat(i) < Pbat_min
     Pbat(i) = Pbat_min;
 end

一切设置在一起为您提供:

for i=1:length(Pload) 
    if i==1
        Pbat(i) = 1000;
    else
        % Calculate next value
        Pbat(i) = Pbat(i-1) + nAug((Pgen(i)>Pload(i))+1) * (Pgen(i) - Pload(i));

        % Check bounds
        if Pbat(i) > Pbat_max
            Pbat(i) = Pbat_max;
        elseif Pbat(i) < Pbat_min
            Pbat(i) = Pbat_min;
        end
    end
end

答案 1 :(得分:1)

您将Pbat初始化为零,然后,对于每个i,您检查当前Pbat(i)是否在允许的范围内:

if Pbat(i) < Pbat_max && Pbat(i) > Pbat_min

我不确定您对Pbat_min有什么价值,但我认为可以安全地假设它是非负数,因此对于{{{{}的所有值,此语句都会失败1}}。