You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决MATLAB电池SOC优化约束中'优化变量除以非标量'报错

错误根因
  • 循环顺序颠倒:现有代码先构造SOC约束、后计算Cnew数组,调用Cnew时它还未完成赋值,本身就存在未定义变量的逻辑问题。
  • 数组索引缺失:Cnew是长度为d的逐日衰减数组,但你在构造第j个时间步的约束时,直接让优化变量除以整个Cnew数组,没有指定对应日期的标量Cnew值,违反了优化变量不能直接除以非标量的运算规则。
  • 优化框架限制:MATLAB基于问题的优化框架中,OptimizationVariable 对象的除法运算只支持除数为标量,或维度与优化变量完全匹配的数组,不支持广播式除法。
  • 隐含索引错误:原代码中j=1时对约束赋值没有加下标(j),会直接把n维约束数组覆盖为单个标量约束,后续赋值会触发维度不匹配报错。
修复方案
  1. 先调整代码顺序,预计算完所有Cnew值后再构造SOC约束
  2. 为每个时间步j匹配对应的日期编号z,取对应位置的标量Cnew值参与运算,也可以提前把衰减系数计算成标量数组,用乘法代替除法进一步规避运算限制。

假设你的总时间步n对应d天,每天包含step_per_day个时间步(如果时间步本身按天计数,n=d,则step_per_day=1),修改后的代码如下:

% 第一步:先预计算逐日衰减的容量Cnew
Cnew = zeros(d,1);
for z = 1:d
    if z==1
        Cnew(z) = Cnom;
    else
        Cnew(z) = Cnew(z-1)-0.00005;
    end
end

% 第二步:构造SOC约束
PowerFlow.Constraints.SOC = optimconstr(n);                  
for j=1:n   
    if j==1
        PowerFlow.Constraints.SOC(j) = SOC(j) == SOCini;
    else
        % 匹配当前时间步对应的日期z
        z = ceil(j / step_per_day); 
        % 取对应日期的标量Cnew参与运算
        PowerFlow.Constraints.SOC(j) = SOC(j) == SOC(j-1)+((Ppvb(j-1)*eta_pvb)-(Pbe(j-1)*eta_d)) * (100*dT / Cnew(z));            
    end
end

内容的提问来源于stack exchange,提问作者Lorenzo Vallerini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:06:03