建网站非要做外链吗,景观园林设计公司,陶瓷刀具网站策划书,网站开发 h5#x1f517; 运行环境#xff1a;Matlab、Python #x1f6a9; 撰写作者#xff1a;左手の明天 #x1f947; 精选专栏#xff1a;《python》 #x1f525; 推荐专栏#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### #x1f497; 大家好#x1f917; 运行环境Matlab、Python 撰写作者左手の明天 精选专栏《python》 推荐专栏《算法研究》 #### 防伪水印——左手の明天 #### 大家好我是左手の明天好久不见 今天分享matlab数学建模算法——发电机的最佳调度 最近更新2023 年 12 月 03 日左手の明天的第 298 篇原创博客 更新于专栏matlab #### 防伪水印——左手の明天 #### 一、发电机的最佳调度
发电机的最佳调度即如何以最佳方式调度两台燃气发电机即收益减去成本的值最大。它是一个复杂的问题需要考虑多种因素包括负载调节、动态调速和调节励磁电流。
负载调节通过调节发电机负载电流大小来调节发电机电量。在电气负荷变化较大时可通过增加或减少负载电流的方式来调节发电机输出电量。动态调速通过调整发电机的转速来调节发电机输出电量。这种方法适用于机械负载较大、稳定性要求高的情况。调节励磁电流通过调节发电机的励磁电流来控制发电机输出电量。增大励磁电流可提高输出电量,减小励磁电流则可降低输出电量。
为了实现最佳调度可以结合实际用电负荷的情况考虑预测误差等因素并采用适当的优化算法确定每个时间段内发电机的最优调度策略。在某些情况下还需要考虑发电机的启动和关闭时间以及不同发电机之间的协同工作等问题。
总之发电机的最佳调度需要综合考虑多种因素和技术手段以达到提高供电可靠性和经济性的目的。 二、实现步骤
实现发电机的最佳调度需要使用到许多数学和计算机技术其中MATLAB是一个非常强大的工具。以下是一个简单的步骤说明如何使用MATLAB实现发电机的最佳调度
1、数据收集与处理
首先需要收集发电机运行的数据包括历史发电数据、实时发电数据、电力需求数据、系统运行状态数据等。这些数据可以通过MATLAB的输入/输出函数例如readtable、readmatrix读取和处理。
2、负荷预测
利用收集到的历史负荷数据和实时数据通过时间序列分析、机器学习或深度学习等方法进行负荷预测。MATLAB提供了大量的统计和机器学习工具箱例如timeseries、neuralnet、ga等可以用来进行负荷预测。
3、能源管理策略选择与建模
根据实际情况选择不同的能源管理策略例如基于风能和太阳能的发电机组以及基于天然气和石油等传统能源的发电机组。然后根据各种策略建立模型这些模型可以包括功率平衡模型、优化模型等。
4、发电机组之间的协调和调度
针对多台发电机组之间的实时变化进行协调和调度。这需要考虑到每台发电机的特性、运行状态、出力能力等因素以及电力系统的稳定性要求和经济性要求。MATLAB的优化工具箱例如quadprog、fmincon等可以用来解决这类问题。
5、制定调度计划
根据负荷预测结果、能源管理策略和发电机组的协调和调度要求制定合理的调度计划。MATLAB的日期和时间函数例如datetime、now、adddays等可以用来处理日期和时间问题帮助制定合理的调度计划。
6、优化算法应用
利用MATLAB的优化工具箱例如linprog、quadprog、fmincon等对调度计划进行优化。这可以帮助找到更经济、更高效的调度方案提高电力系统的运行效率。
7、实施调度与监控
根据优化后的调度计划对发电机进行实际调度。在实施过程中需要密切关注电力系统的运行状态和发电机的运行情况及时调整调度计划以确保电力系统的稳定性和安全性。MATLAB的图形界面设计功能可以帮助设计一个实时的监控界面。
8、数据分析与评估
对调度过程中的数据进行深入分析评估调度计划的实施效果。MATLAB的数据处理和分析工具箱例如mean、std、corrcoef等可以帮助进行数据分析。同时也可以根据数据分析结果对发电机的维护策略进行改进提高维护水平和效率。 以上步骤是一个基本的框架具体实现还需要根据实际情况进行调整和完善。 三、问题定义
电力市场在一天的不同时段有不同用电价格。如果使用发电机供电可以根据这种可变价格安排发电机在用电价格高时运行。假设控制两台发电机。每台发电机有三个功率水平关、低和高。每台发电机在每个功率水平下都有指定的燃料消耗率和发电量。发电机关闭时燃料消耗为 0。
可以为每台发电机在一天中的每个半小时区间24 小时分为 48 个区间分配一个功率水平。根据历史记录假设知道在每个时间区间内每兆瓦时 (MWh) 的收入。
可以将调度问题表示为二元整数规划问题。定义索引 i、j 和 k以及二元调度向量 y如下所示 nPeriods 时间段数本例中为 48。 i 一个时间段1 i 48。 对于此示例j 发电机索引1 j 2。 在时间段 i 中发电机 j 在功率水平 k 上运行表示为 y(i,j,k) 1。让低功率为 k 1高功率为 k 2。当 sum_k y(i,j,k) 0 时发电机关闭。
确定发电机关闭后何时启动。为此定义辅助二元变量 z(i,j)该变量指示在时间段 i 中是否加电以启动发电机 j。 发电机 j 在时间段 i 关闭但在时间段 i 1 打开表示为 z(i,j) 1。在其他时间段 z(i,j) 0。换句话说当 sum_k y(i,j,k) 0 时 z(i,j) 1且 sum_k y(i1,j,k) 1。
需要一种基于 y 的设置自动设置 z 的方法。以下线性约束可处理此设置。
还需要成本问题的参数、每台发电机的发电水平、发电机的燃料消耗水平和可用燃料。 poolPrice(i) - i 区间内每兆瓦时的收入以美元为单位 gen(j,k) - 发电机 j 在功率水平 k 时产生的兆瓦数 fuel(j,k) - 发电机 j 在功率水平 k 时使用的燃料 totalFuel - 一天内可用的燃料 startCost - 发电机关闭后启动的成本以美元为单位 fuelPrice - 单位燃料的成本 四、matlab实现
数据汇总分析
load dispatchPrice; % Get poolPrice, which is the revenue per MWh
bar(poolPrice,.5)
xlim([.5,48.5])
xlabel(Price per MWh at each period) 按如下所示设置其他参数
fuelPrice 3;
totalFuel 3.95e4;
nPeriods length(poolPrice); % 48 periods
nGens 2; % Two generators
gen [61,152;50,150]; % Generator 1 low 61 MW, high 152 MW
fuel [427,806;325,765]; % Fuel consumption for generator 2 is low 325, high 765
startCost 1e4; % Cost to start a generator after it has been off
发电机效率
检查两台发电机在两个工作点的效率。
efficiency gen./fuel; % Calculate electricity per unit fuel use
rr efficiency; % for plotting
h bar(rr);
h(1).FaceColor g;
h(2).FaceColor c;
legend(h,Generator 1,Generator 2,Location,NorthEastOutside)
ax gca;
ax.XTick [1,2];
ax.XTickLabel {Low,High};
ylim([.1,.2])
ylabel(Efficiency)请注意在对应的工作点低和高上发电机 2 的效率稍高于发电机 1但发电机 1 在其高工作点的效率高于发电机 2 在其低工作点的效率。 解的变量
要设置问题需要以问题形式对所有问题数据和约束进行编码。变量 y(i,j,k) 表示问题的解辅助变量 z(i,j) 指示是否加电以启动发电机。y 是 nPeriods-by-nGens-by-2 数组z 是 nPeriods-by-nGens 数组。所有变量均为二元变量。
y optimvar(y,nPeriods,nGens,{Low,High},Type,integer,LowerBound,0,...UpperBound,1);
z optimvar(z,nPeriods,nGens,Type,integer,LowerBound,0,...UpperBound,1);
线性约束
要确保功率水平最多只有一个等于 1 的分量可设置线性不等式约束。
powercons y(:,:,Low) y(:,:,High) 1;
每个时间段的运行成本就是该时间段的燃料成本。对于在 k 水平上运行的发电机 j成本为 fuelPrice * fuel(j,k)。
创建表达式 fuelUsed 以说明使用的所有燃料。
yFuel zeros(nPeriods,nGens,2);
yFuel(:,1,1) fuel(1,1); % Fuel use of generator 1 in low setting
yFuel(:,1,2) fuel(1,2); % Fuel use of generator 1 in high setting
yFuel(:,2,1) fuel(2,1); % Fuel use of generator 2 in low setting
yFuel(:,2,2) fuel(2,2); % Fuel use of generator 2 in high settingfuelUsed sum(sum(sum(y.*yFuel)));
约束是所用燃料不得超过可用燃料。
fuelcons fuelUsed totalFuel;
设置发电机启动指示变量
如何让求解器自动设置 z 变量以匹配 y 变量的活动/关闭时间段要满足的条件是当 sum_k y(i,j,k) 0 且 sum_k y(i1,j,k) 1 时z(i,j) 1。
请注意当需要 z(i,j) 1 时sum_k ( - y(i,j,k) y(i1,j,k) ) 0。
因此请在问题表示中包含这些线性不等式约束。
sum_k ( - y(i,j,k) y(i1,j,k) ) - z(i,j) 0.
此外将 z 变量加入目标函数成本中。使用目标函数中的 z 变量求解器尝试降低其值这意味着它尝试将它们都设置为 0。但是对于发电机开启的那些时间区间线性不等式强制 z(i,j) 等于 1。
创建表示 y(i1,j,k) - y(i,j,k) 的辅助变量 w。用 w 表示发电机启动不等式。
w optimexpr(nPeriods,nGens); % Allocate w
idx 1:(nPeriods-1);
w(idx,:) y(idx1,:,Low) - y(idx,:,Low) y(idx1,:,High) - y(idx,:,High);
w(nPeriods,:) y(1,:,Low) - y(nPeriods,:,Low) y(1,:,High) - y(nPeriods,:,High);
switchcons w - z 0;
定义目标
目标函数包括运行发电机的燃料成本、运行发电机的收入和启动发电机的成本。
generatorlevel zeros(size(yFuel));
generatorlevel(:,1,1) gen(1,1); % Fill in the levels
generatorlevel(:,1,2) gen(1,2);
generatorlevel(:,2,1) gen(2,1);
generatorlevel(:,2,2) gen(2,2);
收入 y.*generatorlevel.*poolPrice。
revenue optimexpr(size(y));
for ii 1:nPeriodsrevenue(ii,:,:) poolPrice(ii)*y(ii,:,:).*generatorlevel(ii,:,:);
end
总燃料成本 fuelUsed*fuelPrice。
fuelCost fuelUsed*fuelPrice;
发电机启动成本 z*startCost。
startingCost z*startCost;
利润 收入 - 总燃料成本 - 启动成本。
profit sum(sum(sum(revenue))) - fuelCost - sum(sum(startingCost));
求解问题
创建一个优化问题并加入目标和约束。
dispatch optimproblem(ObjectiveSense,maximize);
dispatch.Objective profit;
dispatch.Constraints.switchcons switchcons;
dispatch.Constraints.fuelcons fuelcons;
dispatch.Constraints.powercons powercons;
为了节省空间隐藏迭代输出。
options optimoptions(intlinprog,Display,final);
求解。
[dispatchsol,fval,exitflag,output] solve(dispatch,options,options);
Solving problem using intlinprog.Optimal solution found.Intlinprog stopped because the objective value is within a gap tolerance of the optimal value, options.RelativeGapTolerance 0.0001. The intcon variables are integer within tolerance, options.IntegerTolerance 1e-05.
检查解
将解绘制为时间的函数。
subplot(3,1,1)
bar(dispatchsol.y(:,1,1)*gen(1,1)dispatchsol.y(:,1,2)*gen(1,2),.5,g)
xlim([.5,48.5])
ylabel(MWh)
title(Generator 1 Optimal Schedule,FontWeight,bold)
subplot(3,1,2)
bar(dispatchsol.y(:,2,1)*gen(2,1)dispatchsol.y(:,2,2)*gen(2,2),.5,c)
title(Generator 2 Optimal Schedule,FontWeight,bold)
xlim([.5,48.5])
ylabel(MWh)
subplot(3,1,3)
bar(poolPrice,.5)
xlim([.5,48.5])
title(Energy Price,FontWeight,bold)
xlabel(Period)
ylabel($ / MWh) 发电机 2 比发电机 1 运行时间长这是您所期望的结果因为这样效率更高。发电机 2 只要处于运行状态就以其高功率水平运行。发电机 1 主要在其高功率水平下运行但在一个时间单位内降至低功率。每个发电机每天运行一组连续的时间段因此每天只发生一次启动成本。
检查在发电机启动的时间段内 z 变量是否为 1。
starttimes find(round(dispatchsol.z) 1); % Use round for noninteger results
[theperiod,thegenerator] ind2sub(size(dispatchsol.z),starttimes)
theperiod 2×12316
thegenerator 2×112
发电机启动的时间段与绘图相匹配。