【问题标题】:Vectors with constraints带约束的向量
【发布时间】:2015-07-06 14:17:20
【问题描述】:

我正在撰写关于 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 &lt;= Pbat(i) &lt;= Pbat_max

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

【问题讨论】:

  • 如果你能用文字来解释逻辑而不是只用未注释的代码来解释会有所帮助

标签: matlab vector constraints


【解决方案1】:

我在您的代码中看到的问题是您检查Pbat(i) 是否在[Pbat_min, Pbat_max] 的限制范围内在计算Pbat(i) 之前。由于Pbat 被初始化为0,因此在此检查中,Pbat(i) 将始终为零并且测试可能会失败(如果Pbat_min&gt;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) &gt; Pload(i),即充电时。为此,我们可以例如引入增强的效率

nAug = [1, n];

表示:放电时效率为1,充电时效率为n。现在我们可以将我们的差乘以第一个元素 (1) 如果 Pgen(i) &lt;= Pload(i) 或乘以第二个元素 (n) 否则。为此,我们使用逻辑表达式Pgen(i)&gt;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

【讨论】:

  • 成功了,谢谢!最后一件事是Pload(i) &lt; Pgen(i)Pbat(i) = Pbat(i-1) + n*(Pgen(i) - Pload(i));。因为有一个充电效率低于单位由于损耗。我怎样才能保持你的写作格式?
  • 我修改了我的答案以包含它。希望此解决方案对您有用!
  • 为一个很好的详细答案投上一票,以弥补最近的抄袭,你只是上面的受害者......
【解决方案2】:

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

if Pbat(i) &lt; Pbat_max &amp;&amp; Pbat(i) &gt; Pbat_min

我不确定Pbat_min 的值是多少,但我想可以安全地假设它为非负数,因此该语句对于i 的所有值都将失败。

【讨论】:

  • 没错,我改了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多