AMPL中如何计算时间依赖变量在多个时间步长上的累加和
AMPL 时间依赖变量多时间步累计求和写法修正
你现有代码的核心错误有两处:
- 未提前声明累计总和变量
Ea - 求和约束额外添加了时间索引
t in Time,且sum语句未指定遍历范围,会导致每个时间步都重复给Ea赋值,语法和逻辑都不成立。
全局总累计求和写法(所有时间步加总得到单一总和值)
修正后的.mod文件代码如下:
set Time default {}; # 时间步集合 param top{Time}; # 每个时间步对应的小时数 var E{Time} >= 0.001; # 时间依赖变量 var Ea >= 0; # 累计总和变量 # 全局累计总和约束 subject to annualElectricity: Ea = sum{t in Time} E[t] * top[t];
你提供的.dat文件无需修改,可以直接配合使用。
逐时间步累计求和写法(得到到每个时间步为止的累计值序列)
如果你需要的是每个时间步t对应的、从首步到t的累计值,可以用以下写法:
set Time default {}; param top{Time}; var E{Time} >= 0.001; var E_cum{Time} >= 0; # 逐时间步累计值数组 subject to cumulative_calc{t in Time}: E_cum[t] = sum{tt in Time: tt <= t} E[tt] * top[tt];
核心语法说明
- AMPL的
sum求和语句要求必须在大括号内指定遍历的集合和筛选条件,sum{t in Time}代表遍历整个Time集合的所有元素完成求和 - 全局总求和的约束不需要加时间索引,否则会为每个时间步生成重复的赋值约束,触发逻辑错误
内容的提问来源于stack exchange,提问作者catlover254
相关产品推荐
相关产品推荐

