1 主要内容
程序主要做的是一个考虑电、热、气网耦合调度的综合能源系统优化调度模型,考虑了电网与气网,电网与热网的耦合,电网部分为10机39节点的综合能源系统,热网为6节点,气网部分为比利时20节点气网,潮流部分电网是用了直流潮流,气网部分也进行了线性化的操作处理。
- 参考文献
《计及碳排放成本的电---气---热...源系统节点能价计算方法研究_邓红卫》
《计及需求响应与动态气潮流的电---气综合能源系统优化调度_张伊宁》
- 程序的模块化很好。
- 个模块的功能介绍很详细
- 工具:MATLAB➕YALMIP➕cplex
(之前有些程序反映求解失败,都是软件没有配置好,而且官网免费的cplex真的严重受限,我用的matlab2018a,yalmip和cplex都是用的公众号免费软件里面的版本,匹配性比较好,一些比较高的matlab版本我也没有合适的不限制变量和约束cplex,建议你再安装一个matlab,对电脑影响不大,具体配套软件和安装说明在公众号有详细介绍。)
2 部分代码
%导纳矩阵计算
% [Ybus, Yf, Yt] = makeYbus(baseMVA, bus, M_branch); % build admitance matrix
[Bbus, Bf, Pbusinj, Pfinj] = makeBdc(baseMVA, bus, branch); %直流潮流
%%
% 创建决策变量
%%
% 电网
% 火电发电机出力
gen_P = sdpvar(n_gen, n_T);
gen_P_upper = sdpvar(n_gen, n_T);
% 火电机组状态
u_state = binvar(n_gen, n_T);
% 电力系统各支路功率
PF_D = sdpvar(n_branch, n_T);
% 电力系统各节点相角
Va = sdpvar(n_bus,n_T);
%%
% 气网
GasFlow = sdpvar(n_GasBranch, n_T); %各管道气流量
GasPressure2 = sdpvar(n_GasBus, n_T); %各节点气压平方
GasSourceOutput = sdpvar(n_GasSource, n_T); %各天然气源节点出力
GasGenNeed = sdpvar(n_GasGen, n_T); %各天然气发电机耗气
%%
% 热网
TmprtrFromDir = sdpvar(n_HeatBranch, n_T); %正方向支路头结点温度
TmprtrToDir = sdpvar(n_HeatBranch, n_T); %正方向支路尾结点温度
TmprtrFromRev = sdpvar(n_HeatBranch, n_T); %逆方向支路头结点温度
TmprtrToRev = sdpvar(n_HeatBranch, n_T); %逆方向支路尾结点温度
TmprtrBusDir = sdpvar(n_HeatBus,n_T); %正方向系统各节点热水的温度
TmprtrBusRev = sdpvar(n_HeatBus,n_T); %逆方向系统各节点热水的温度
HeatSource = sdpvar(n_HeatBus, n_T); %热源供热,因为电炉和CHP连在同一个节点才写的这么诡异
HeatCHP = sdpvar(n_CHPgen,n_T); %chp机组热出力
HeatEBoiler = sdpvar(n_EBoiler,n_T); %电锅炉热出力
PowerEBoiler = sdpvar(n_EBoiler,n_T); %电锅炉耗电
C = []; %约束
% C = sdpvar(C)>=0;
SCUC_value = 0;
%%
%添加约束
%%
%火电机组开机费用
% Add_Huodian_Startup;
%%
%功率平衡
% Add_PowerBalance;
Add_PowerFlow;
%%
%爬坡约束
Add_Ramp;
%%
%最小启停时间限制
Add_MinUpDownTime;
%%
%火电机组出力
Add_Huodian_UnitOutput;
%%
%天然气网约束
Add_GasConstraints;
%%
%热网约束
Add_HeatConstraints;
%%
%火电二次费用函数
Add_Huodian_GenCost;
%%
%天然气费用
Add_Gas_Cost;
%%
%配置
ops = sdpsettings('solver','cplex','verbose',2,'usex0',0);
ops.gurobi.MIPGap = 1e-6;
ops.cplex.mip.tolerances.mipgap = 1e-6;
%%
%求解
result = optimize(C, SCUC_value, ops);
if result.problem == 0 % problem =0 代表求解成功
else
error('求解出错');
end