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