如何解决MATLAB电池SOC优化约束中'优化变量除以非标量'报错
错误根因
- 循环顺序颠倒:现有代码先构造SOC约束、后计算Cnew数组,调用Cnew时它还未完成赋值,本身就存在未定义变量的逻辑问题。
- 数组索引缺失:Cnew是长度为d的逐日衰减数组,但你在构造第j个时间步的约束时,直接让优化变量除以整个Cnew数组,没有指定对应日期的标量Cnew值,违反了优化变量不能直接除以非标量的运算规则。
- 优化框架限制:MATLAB基于问题的优化框架中,
OptimizationVariable对象的除法运算只支持除数为标量,或维度与优化变量完全匹配的数组,不支持广播式除法。 - 隐含索引错误:原代码中j=1时对约束赋值没有加下标
(j),会直接把n维约束数组覆盖为单个标量约束,后续赋值会触发维度不匹配报错。
修复方案
- 先调整代码顺序,预计算完所有Cnew值后再构造SOC约束
- 为每个时间步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
相关产品推荐
相关产品推荐

