我正在为MATLAB上的论文工作,我有以下问题:
我有一个向量(Pbat = zeros(8760,1);
),此向量取决于另外两个向量(Pgen
和Pload
),应更改如下:
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
时发生。)
答案 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}}。