电力的生产问题含代码程序.docx
《电力的生产问题含代码程序.docx》由会员分享,可在线阅读,更多相关《电力的生产问题含代码程序.docx(17页珍藏版)》请在冰点文库上搜索。
电力的生产问题含代码程序
电力生产优化问题的数学模型
摘要:
本文解决的是日常生活中的电力生产问题,由于各种型号发电机的发电能力不同以及每天各时段需电量的不同,且各种型号的发电机使用成本也不一样,合理配置和使用各型号的发电机不仅可以减少资源的浪费,也可以减少发电机每天的使用成本。
在可持续发展的社会中,如何节约资源、提高效率是当前社会面临的重要问题之一,为此,我们建立了一个单目标多约束的最优化模型,以每一天的总成本为目标函数,进而求得发电机每天使用成本的最优值。
对于问题一:
要求得目标函数的最优解,需要将题目中所涉及到的诸如每日需电量、发电机数量、最大(小)输出功率等相应的约束条件列出来,进而利用LINGO软件对目标函数进行求解得到合理的发电机使用数量及一天的最小使用总成本。
对于问题二:
在问题一的基础上,增加了正在工作的发电机组必须留出20%的发电能力余量,以防用电量突然上升的条件。
将模型一用户每日需电量的约束条件改一下,即可得到模型二的约束条件,二者的目标函数是一样的,同样利用LINGO软件即可得到模型二的最优解。
关键词:
单目标多约束最优解LINGO软件
1.问题重述
在追求可持续发展的今天,节约资源、提高效率是日常生活中必不可少的。
发电机作为电力的源泉,向人们提供日常生活中所需电量,如何合理安排分配发电机组的工作,将发电成本降到最低,是我们要着重考虑的问题。
本文所考虑的就是合理安排发电机工作的数学建模问题。
题目要求:
为满足每日电力需求(单位为兆瓦(MW)),可以选用四种不同类型的发电机。
每日电力需求如下表1。
表1:
每日用电需求(兆瓦)
时段(0-24)
0-6
6-9
9-12
12-14
14-18
18-22
22-24
需求
12000
32000
25000
36000
25000
30000
18000
每种发电机都有一个最大发电能力,当接入电网时,其输出功率不应低于某一最小输出功率。
所有发电机都存在一个启动成本,以及工作于最小功率状态时的固定的每小时成本,并且如果功率高于最小功率,则超出部分的功率每兆瓦每小时还存在一个成本,即边际成本。
这些数据均列于表2中。
表2:
发电机情况
可用数量
最小输出功率(MW)
最大输出功率(MW)
固定成本(元/小时)
每兆瓦边际成本(元/小时)
启动成本
型号1
10
750
1750
2250
2.7
5000
型号2
4
1000
1500
1800
2.2
1600
型号3
8
1200
2000
3750
1.8
2400
型号4
3
1800
3500
4800
3.8
1200
只有在每个时段开始时才允许启动或关闭发电机。
与启动发电机不同,关闭发电机不需要付出任何代价。
本文要解决的问题有:
问题一:
试确定在每个时段应分别使用各型号发电机的数量,以使每天的总成本最小,并求出最小总成本。
问题二:
在现实生活中,用电量不可能恒定不变,所以为了更符合实际,增强方案的可行性,要求发电机要保留一定的发电能力,以应对突发情况。
所以假设:
在任何时刻,正在工作的发电机组必须留出20%的发电能力余量,以防用电量突然上升。
试确定每个时段又应分别使用各型号发电机的数量,以使每天的总成本最小,并求出此时的最小总成本。
2.问题分析
2.1发电机使用总成本组成分析
所有发电机都存在一个启动成本,发电机频繁启动会提升启动成本,所以要在尽可能满足供电需求的基础上减少发电机的启动次数,进而减少启动成本;发电机工作于最小功率状态时的固定的每小时成本称为固定成本,并且如果功率高于最小功率,则超出部分的功率每兆瓦每小时还存在一个成本,即边际成本。
由题知,为满足供电量(附录1为一天中不同时间段所需电量),共有四种发电机可选择,每种发电机都有一个最大发电能力,当接入电网时,其输出功率不应低于某一最小输出功率。
一般来讲,我们希望发电机的发电能力越大越好,但是有了边际成本这一约束,必须通过计算和编程来合理安排发电机的数量、型号以及发电功率。
与启动发电机不同,关闭发电机不需要付出任何代价。
总成本构成图
2.2问题的分析
此题研究的是每天各时段发电机在满足供电量的前提下,运行总成本最小的问题。
全天可分为7个时段,均由4种类型型号的发电机组来发电,由于各时段用电量不同,所以每个时段所需要的发电机型号和数量也不尽相同。
在考虑发电机时,其总成本费用由固定成本、边际成本和启动成本三部分构成。
因此,在选择发电机型号和数量时,必须三方面综合考虑,来寻求最优解。
此外,题目对启动成本的特殊定义,我们必须考虑到相邻时段重复启动成本对总成本造成的误差。
对于所划定的7个时段,可以通过求取每个时段的局部最优来获得目标的整体最优。
针对问题一:
我们在满足发电需求量的前提下,对7个时段各阶段的固定成本,边际成本和启动成本,进行叠加求和,得出目标函数,通过约束利用软件求解即可获得结果。
针对问题二:
题目要求在任何时刻,机组必须留出20%的发电能力余量以防用电量的突然上升。
容易看出,它跟问题一极为相似,只是在问题一的基础上增加了一个需求发电量的约束,方法与问题一相同。
3数据分析
3.1每日用电需求量
由题目中给出的表1,列出了一天中各时段的用电需求量,从表1中很容易看出一天中不同的时段电量的需求量不同,12-14时段用电量达到最高值,各时段用电需求量参照下表。
表1:
每日用电需求(兆瓦)
时段(0-24)
0-6
6-9
9-12
12-14
14-18
18-22
22-24
需求
12000
32000
25000
36000
25000
30000
18000
为了便于书写和说明,将各时段进行标记,我们将每天分为7个时段,具体如下:
每日用电需求(兆瓦)
时段i
1
2
3
4
5
6
7
需求
12000
32000
25000
36000
25000
30000
18000
3.2不同型号发电机的基本情况
由表2可以确定解决本问题的一些约束条件,如可用数量,最小最大输出功率,以及使用的成本问题。
表2:
发电机情况
可用数量
最小输出功率(MW)
最大输出功率(MW)
固定成本(元/小时)
每兆瓦边际成本(元/小时)
启动成本
型号1
10
750
1750
2250
2.7
5000
型号2
4
1000
1500
1800
2.2
1600
型号3
8
1200
2000
3750
1.8
2400
型号4
3
1800
3500
4800
3.8
1200
由上表及题目可知,总成本=固定成本+边际成本+启动成本,欲获得最低总成本,必须权衡三者之间的关系,确定各时段各型号发电机的使用数量;又从“只有在每个时段开始时才允许启动或关闭发电机,与启动发电机不同,关闭发电机不需要付出任何代价”知启动成本是建模的关键。
启动成本在计算总费用时必须考虑相邻时间段同种型号的使用台数。
对于连续工作的电机我们只需在第一次启动时计算它们的启动成本,而对于后面时段重复使用的发电机则不计启动成本。
例如,第一时间段使用4台型号一的电机,第二时间段使用型号一的电机台数不大于4,则启动费用为0;如果大于4则只需计算超出4的台数的启动成本。
编程时我们以(0~6)为起点,以(22~24)为终点算出最小成本。
为了探究发电机功率与成本之间的关系,我们根据表2给出的数据,利用MATLAB软件绘制出每小时发电总成本与电机功率的关系图,代码见附录一。
从上图可知,每小时的发电成本随着功率的增加而增加。
型号2,3的斜率比较小,说明功率的变化对型号2,3的影响最小,由此可以估计,在满足发电需求量条件的前提下应优先考虑使用型号2与型号3的发电机。
4.模型的假设和符号说明
4.1模型的假设
假设1:
题目所给数据是全部合理、正确的。
假设2:
各时段发电机组的成本完全按清单计算。
假设3:
所有发电机均能正常工作,且工作过程中不存在发电机的损坏。
假设4:
各时段开关发电机的时间忽略不计。
假设5:
发电机一开始就工作在指定功率状态。
假设6:
外界环境对发电机组没有影响。
4.2符号说明
符号
符号说明
第i个时间段
型号j发电机的总数量,单位:
台
第i个时间段型号j发电机的启动数量,单位:
台
型号j发电机正常工作时最小输出功率,单位:
兆瓦
型号j发电机正常工作时最大输出功率,单位:
兆瓦
型号j发电机的固定成本,单位:
元/小时
型号j发电机的边际成本,单位:
元/小时·兆瓦
型号j发电机的启动成本,单位:
元/台
第i个时间段型号j发电机的输出功率,单位:
兆瓦
第i个时间段的总功率,单位:
兆瓦
i=1,2,······7;j=1,2,3,4
5.模型一的建立与求解
5.1模型一的准备
本模型总成本由固定成本、边际成本和启动成本三部分构成,目的是获得每天的总成本最小,由此我们采用单目标多约束非线性规划。
单目标多约束非线性规划简介:
如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。
单目标多约束即为在多种约束条件下满足同一个目标。
5.2模型一的建立
5.2.1确定目标函数
(1)假设发电机工作之前,均处于关闭状态,定义
(i)启动成本
由于下一时间段的启动成本必须考虑上一时间段的启动台数,如果后一时间段同种型号的电机台数小于或等于前一时间段,则后一时间段启动成本为0,反之就需计算超出的台数的启动成本。
故在确定目标函数之前,我们还需做如下定义:
得到不同时段启动成本:
(ii)固定成本
由表二知,固定成本与时间及台数有关,所以可以得到不同时间段的固定
成本:
(iii)边际成本
由题可知,边际成本与时间和台数有关,所以可以得到不同时间段的边际成本:
(2)由总费用=启动成本费用+固定成本费用+边际成本费用,可得到最终目标函数:
5.2.2确定约束条件
约束一:
每种型号的发电机有数量和输出功率限制
(1)型号1的发电机的数量和输出功率限制
,
(2)型号2的发电机的数量和输出功率限制
,
(3)型号3的发电机的数量和输出功率限制
,
(4)型号4的发电机的数量和输出功率限制
,
约束二:
每段时间供应的发电量要满足电力需求量
5.2.3综上所述我们得到问题一的非线性规划模型
s.t
5.3模型一的求解
这是一个非线性规划问题,Lingo软件是一种专门用于求解数学规划问题的优化计算软件包,其程序执行速度快,易于方便地输入、修改、求解和分析一个数学规划(优化问题),因此在本模型的求解中我们采用Lingo软件进行运算。
求解的一天下来的最小成本是1484860元,求解的Lingo程序代码见附录二,具体发电机组各时段数量分配见下表。
时间段
型号
1
2
3
4
5
6
7
0~6
6~9
9~12
12~14
14~18
18~22
22~24
1
台数
0
4
4
6
3
3
0
功率
752.000
1650.00
750.00
1750.00
1200.00
1533.33
1748.36
2
台数
4
4
4
4
4
4
4
功率
1000.00
1500.00
1100.00
1500.00
1500.00
1500.00
1500.00
3
台数
4
7
7
7
5
7
5
功率
2000.00
2000.00
2000.00
2000.00
2000.00
2000.00
2000.00
4
台数
0
3
2
3
3
3
1
功率
1802.00
1800.00
1800.00
1833.33
1800.00
1800.00
2000.00
5.4模型一的结果分析
考虑到题目中的约束条件较多,而题目要求求全天的最小费用,所以我们采用首先分段分析在整体求解的方法,来建立模型。
这样所求的结果简单易懂并且减小了编程的难度,便于检验分析。
缺点是:
增大了编程的篇幅。
结果中型号2、3的发电机组用量较多,恰好满足功率与成本关系曲线中的假设估计,经过检验后我们的结果严格满足题目中的约束条件,并且都在零点或零点附近取值。
综上所述:
我们的结果是较为合理和符合要求的.
6.问题二的解答
针对问题二,我们建立模型二
6.1模型二的建立
6.1.1确定目标函数
模型二的目标函数与模型一相同:
W=
其中
6.1.2确定约束条件
约束条件一同模型一
约束条件二:
正在工作的发电机组必须留出20%的发电能力余量,以防用电量突然上升
则每段时间供应的发电量要满足电力需求量
6.1.3综上所述我们得到问题二的非线性规划模型
W=
6.2模型二的求解
这仍然是一个线性规划模型,因此我们仍利用lingo软件进行编程求解(求解程序见附录3),我们考虑发电余量之后,求的一天下来最小成本为1885490元,具体发电机组安排如下表:
6.3模型二的结果分析
基于模型二是以模型一为基础的,只是约束条件不同,因此优缺点和模型一类似。
对于二要保留20%的发电能力,同时又要满足需求,所以需要的电机台数比问题一中的多,费用自然比一中的高。
问题一的结果为W
(1)=1463193,问题二的结果为W
(2)=1885420。
W
(2)乘以0.8等于1508392,该结果略大于W
(1)。
综上所述,问题二中的结果也是较为符合题意的。
时间段
型号
1
2
3
4
5
6
7
0~6
6~9
9~12
12~14
14~18
18~22
22~24
1
台数
1
7
7
8
6
6
1
功率
1000.0
1750.0
807.0
1750.0
750.0
1683.0
752.0
2
台数
4
4
4
4
4
4
4
功率
1500.0
1500.0
1500.0
1500.0
1338.0
1500.0
1437.0
3
台数
4
8
8
8
8
8
8
功率
2000.0
2000.0
2000.0
2000.0
2000.0
2000.0
2000.0
4
台数
0
3
2
3
3
3
0
功率
1800.0
1917.0
1801.0
3000.0
1800.0
1801.0
1998.0
7.模型优缺点及推广
7.1模型优点:
(1)运用适合每段时间的通用算法,分段进行分析,使建模过程一目了然,方便理解。
(2)充分利用软件资源,先用matlab生成的图形进行分析,大致了解发电机组最优使用情况,然后用lingo求约束性的非线性方程,编写的程序清楚明了,方便检查,可及时发现错误。
7.2模型的缺点:
(1)建立的模型中,部分型号的发电机长期循环使用,长时间下去,可能对发电机造成损坏。
(2)假设条件过于模型化,真正运行起来可能与所建立的模型有些出入。
(3)发电机长期使用时未考虑第七时段到第二天第一时段过度时期的启动成本。
7.3模型的推广:
我们建立的方法和思想可以推广到其他类似方面的问题。
本文所建立的模型不仅估算出发电厂全天发电机组的最佳安排,而且还能给其他企业安排提供一些理论参考。
如公交系统,不同时段人流量不同,不同路线的人流量也不同,故需要的公交数量也就不同了,我们就可以采用本文所建模型。
参考文献
[1]岂兴明等,MATLAB7.0程序设计快速入门,北京:
人民邮电出版社,2009
[2]司守奎,数学建模算法与程序,烟台:
海军航空工程学院,2007
[3]
附录
功率与成本关系图matlab代码:
x1=750:
1:
1750;
x2=1000:
1:
1500;
x3=1200:
1:
2000;
x4=1800:
1:
3500;
y1=2250+(x1-750)*2.7+5000;
y2=1800+(x2-1000)*2.2+1600;
y3=3750+(x3-1200)*1.8+2400;
y4=4800+(x4-1800)*3.8+1200;
plot(x1,y1,'r',x2,y2,'g',x3,y3,'k',x4,y4,'b');
grid;
xlabel('功率x');
ylabel('成本y');
title('图1 功率与成本的关系');
legend('y1','y2','y3','y4');
text(1300,8200,'型号1');
text(1250,3600,'型号2');
text(1500,6400,'型号3');
text(2500,8000,'型号4');
模型一建立lingo代码:
sets:
shiduan/1..7/:
h,t;
xinghao/1..4/:
N,Pmin,Pmax,G,B,Q;
link(shiduan,xinghao):
x,w;
endsets
min=@sum(xinghao(j):
Q(j)*x(1,j)+G(j)*t
(1)*x(1,j)+(w(1,j)-Pmin(j))*x(1,j)*B(j)*t
(1))+@sum(link(i,j)|i#ge#2:
@if(x(i,j)#gt#x(i-1,j),(x(i,j)-x(i-1,j))*Q(j),0)+x(i,j)*t(i)*G(j)+(w(i,j)-Pmin(j))*t(i)*x(i,j)*B(j));
@for(link(i,j):
x(i,j)<=N(j));
@for(link(i,j):
w(i,j)>=Pmin(j));
@for(link(i,j):
w(i,j)<=Pmax(j));
@for(shiduan(i):
@sum(xinghao(j):
w(i,j)*x(i,j))>=h(i));
@for(link:
@gin(x));
data:
t=6332442;
h=12000320002500036000250003000018000;
N=10483;
Pmin=750100012001800;
Pmax=1750150020003500;
G=2250180037504800;
B=2.72.21.83.8;
Q=5000160024001200;
enddata
end
模型二建立lingo代码:
sets:
shiduan/1..7/:
h,t;
xinghao/1..4/:
N,Pmin,Pmax,G,B,Q;
link(shiduan,xinghao):
x,w;
endsets
min=@sum(xinghao(j):
Q(j)*x(1,j)+G(j)*t
(1)*x(1,j)+(w(1,j)-Pmin(j))*x(1,j)*B(j)*t
(1))+@sum(link(i,j)|i#ge#2:
@if(x(i,j)#gt#x(i-1,j),(x(i,j)-x(i-1,j))*Q(j),0)+x(i,j)*t(i)*G(j)+(w(i,j)-Pmin(j))*t(i)*x(i,j)*B(j));
@for(link(i,j):
x(i,j)<=N(j));
@for(link(i,j):
w(i,j)>=Pmin(j));
@for(link(i,j):
w(i,j)<=Pmax(j));
@for(shiduan(i):
@sum(xinghao(j):
0.8*w(i,j)*x(i,j))>=h(i));
@for(link:
@gin(x));
data:
t=6332442;
h=12000320002500036000250003000018000;
N=10483;
Pmin=750100012001800;
Pmax=1750150020003500;
G=2250180037504800;
B=2.72.21.83.8;
Q=5000160024001200;
enddata
end