潮流上机课程设计报告.docx
《潮流上机课程设计报告.docx》由会员分享,可在线阅读,更多相关《潮流上机课程设计报告.docx(28页珍藏版)》请在冰豆网上搜索。
潮流上机课程设计报告
如果恰巧看到这篇的话,给你们几个忠告。
首先要说的是:
课设老师是sb,课设老师是sb,课设老师是sb,重说三;其次,要给他看程序的话,一定要早一点,不然你自己写的也成抄袭的了,亲身经历你们懂的;顺带,这sb看变量名认程序的,自己尽量把变量名都改了。
恩,基本就是这些了。
课程设计报告
(2015—2016年度第二学期)
名称:
电力系统潮流上机
院系:
电气与电子工程学院
班级:
学号:
学生姓名:
指导教师:
毛安家
设计周数:
两周
成绩:
日期:
年月日
一、课程设计的目的与要求
培养学生的电力系统潮流计算机编程能力,掌握计算机潮流计算的相关知识
二、设计正文(详细内容见附录)
1.手算
节点1为平衡节点,电压
,节点2为PQ节点,负荷功率
,节点3是PV节点,
,两条支路分别为
,
,对地支路
。
(要求应用牛顿-拉夫逊法或P-Q分解法手算求解,要求迭代两次。
)
(手算具体过程见附录)
2.计算机计算
编写潮流计算程序,要求如下:
2.1据给定的潮流计算任务书整理潮流计算的基础数据:
节点的分类,线路模型,等值变压器模型,电压等级的归算,标幺值的计算;
2.2基础数据的计算机存储:
节点数据,支路数据(包括变压器);
2.3用牛顿-拉夫逊法计算;
2.4根据所选潮流计算方法画流程图,划分出功能模块,有数据输入模块,导纳阵形成模块,解线性方程组模块,计算不平衡功率模块,形成雅可比矩阵模块,解修正方程模块,计算线路潮流。
(1)、每次迭代的各节点电压幅值、相位或者实部、虚部
(2)、收敛的迭代次数
(3)、收敛后各节点电压幅值、相位,各支路的
(4)、收敛后PV节点的注入Q
(5)、收敛后平衡节点的注入功率S
2.5据上述模块编制程序并上机调试程序,得出潮流计算结果;
2.6源程序及其程序中的符号说明集、程序流图
简单系统如下图所示,支路数据如下:
支路14,27,39为变压器支路,参数为
,
其余支路为线路支路,参数为
节点数据如下:
,
(计算机计算过程及程序代码等见附录)
3.思考题
3.1潮流计算的方法有哪些?
各有何特点?
3.2如果交给你一个任务,请你用已有的潮流计算软件计算北京城市电网的潮流,你应该做哪些工作?
(收集哪些数据,如何整理,计算结果如何分析)
3.3设计中遇到的问题和解决的办法。
(思考题回答见附录)
三、课程设计总结或结论
这次课程设计不仅涉及了当年就不懂的潮流计算的知识,还用到了荒废已久的C语言,我一开始是迷茫紧张的。
但是随着设计的进行,复习回想起了当年课程的内容,发现其实算法也就是把大问题分解成一个个步骤,只要把每个步骤认真做好,一点点像搭积木一样,最终就能做出一栋牢固的房屋。
编程过程中发现模板还是有一些小问题的,比如导纳矩阵的数组在模板中其实已经越界使用了,还有高斯算法的程序存在一些参数声明和类型转换的问题,不过问题都不大,很容易就改好了。
改动比较大的部分,就是我发现文件中的节点和线路数其实只在读数据的时候起作用,而且更改节点和线路数的时候还得改动程序,很不方便。
于是使用了calloc函数动态申请内存空间,开头读取一次文件中的节点和线路数后,全程都可以使用这两个参数,大大提升了程序的灵活性,只需要修改文件内容就可以计算各种情况。
动态的二维数组的构建方法是在XX中学习的,让人不得不佩服前人巧妙的思路。
还有编程中遇到的最大的问题就是数组空间申请的不足导致下标越界,从而在运行过程中出现了各种奇奇怪怪的报错,让我头疼了好一阵,最终发现还是自己粗心的问题,只要改正一个数组长度参数就好,真是让人哭笑不得。
这次课程设计帮我巩固了潮流计算的知识,让我对潮流计算的思路理解更加深刻了,也锻炼了我的编程能力,过程中大部分问题都是自己独立解决的(不得不说XX是个好帮手,不过涉及到比较专业性的问题XX就非常无力),当然与同学的交流帮我找出了不少程序的错漏。
在自己程序基本完成之后也帮助了其他同学解决了不少问题(个人感想是:
学会用debug大部分问题都能自己解决)。
虽然我一向比较倾向于独立解决问题,但实际情况告诉了我多与其他人交流会给自己很大的帮助,我以后会努力和他人交流,以更高的效率解决问题!
四、参考文献
1.《电力系统分析基础》,李庚银,机械工业出版社,2011年,第一版;
2.《电力系统稳态分析》,陈珩,中国电力出版社,2007年,第三版
附录(包括:
1.手算过程及结果;2.计算机计算流程图、表格、数据;3.思考题答案)
手算过程:
第一次迭代:
1.计算导纳矩阵
Y11=y13+y12=1/(0.01+j0.04)+1/(0.05+j0.02)=7.0588-j28.2353
Y12=-y12=-1/(0.05+j0.02)=-1.1765+j4.7059
Y13=-y13=-1/(0.01+j0.04)=-5.8824+j23.5294
Y21=-y12=-1/(0.05+j0.02)=-1.1765+j4.7059
Y22=y22=1/(0.05+j0.02)=1.1765-j4.7059
Y31=-y13=-1/(0.01+j0.04)=-5.8824+j23.5294
Y33=y13+y30=1/(0.01+j0.04)+j0.3=5.8824-j23.2294
则Y=
2.计算不平衡量
取▪U1=1.05+j0,▪U2(0)=1.00+j0,▪U3(0)=1.00+j0,
2号为PQ节点:
P2(0)=
=[1.00*(-1.1765*1.05)]+[1.00*(1.1765*1.00)]
=-0.0588
△P2(0)=-0.8-(-0.0588)=-0.7412
Q2(0)=
=[-1.00*(4.7059*1.05)]+[-1.00*(-4.7059*1.00)]
=-0.2353
△Q2(0)=-0.5-(-0.2353)=-0.2647
3号为PV节点:
P3(0)=
=[1.00*(-5.8824*1.05)]+[1.00*(5.8824*1.00)]
=-0.2941
△P3(0)=-0.4-(-0.2941)=-0.1059
U3(0)2=e32+f32=1
△U3(0)2=1.052-1=0.1025
3.计算雅可比矩阵
=
–G22f2+B22e2=-4.9412
=-1.1176
=1.2353
=-4.4706
=
=
=
=
=
=
=
=0
=-24.7059
=-5.5882
=0
=-2.0000
则J(0)=
4.解修正方程
计算略,解得修正量为:
=0.0947;
=0.1286
=-0.0513;
=0.0159
则修正后的电压量为:
=0.9053;
=-0.1286
=1.0513;
=-0.0159
第二次迭代:
1.计算不平衡量
▪U1=1.05+j0,▪U2
(1)=0.9053-j0.1286,▪U3
(1)=1.0513-j0.0159,
2号为PQ节点:
P2
(1)=
=[0.9053*(-1.1765*1.05)-0.1286*(4.7059*1.05)]+[0.9053*(1.1765*0.9053-4.7059*0.1286)-0.1286*(-1.1765*0.1286-4.7059*0.9053)]
=-0.7700
△P2
(1)=-0.8-(-0.7700)=-0.0300
Q2
(1)=
=-0.3800
△Q2
(1)=-0.5-(-0.3800)=-0.1200
3号为PV节点:
P3
(1)=
=-0.3831
△P3
(1)=-0.4-(-0.3831)=-0.0169
U3
(1)2=e32+f32=1.05132+0.01592=1.1055
△U3
(1)2=1.052-1.1055=-0.0030
2.计算雅可比矩阵
计算得J(0)=
3.解修正方程
计算略,解得修正量为:
△
=0.0335;△
=0
△
=0.0014;△
=0.0003
则修正后的电压量为:
=0.8717;
=-0.1286
=1.0499;
=-0.0162
最终计算结果:
1号平衡节点功率为:
S=1.2571+j0.6249;
2号PQ节点:
电压幅值为0.8812,相角为-0.1464;
3号PV节点:
电压相角为-0.0154,无功为-0.2274。
13节点间线路功率S13=0.4015-j0.0971,S31=-0.4000-j0.2274,线路损耗为:
0.0015-j0.3246;
12节点间线路功率S12=0.8555+j0.7221,S21=-0.7987-j0.4947,线路损耗为:
0.0568+j0.2274;
3号节点接地支路功率S30=-j0.6615,S03=0,线路损耗为:
-j0.6615;
全网网损为0.0571-j0.1025。
计算机程序潮流计算:
节点数据:
节点序号
电压幅值
相角
发出有功
发出无功
吸收有功
吸收无功
节点类型
1
1.04
0
0
0
0
0
2
2
1.025
0
1.63
0
0
0
1
3
1.025
0
0.85
0
0
0
1
4
1
0
0
0
0
0
0
5
1
0
0
0
1.25
0.5
0
6
1
0
0
0
0.9
0.3
0
7
1
0
0
0
0
0
0
8
1
0
0
0
1
0.35
0
9
1
0
0
0
0
0
0
线路数据:
线路序号
左节点
右节点
线路电阻R
线路电抗X
线路等效电纳B/2
线路变比
1
1
4
0
0.058
0
1.1
2
2
7
0
0.063
0
1.05
3
3
9
0
0.059
0
1.1
4
7
8
0.019
0.072
0.075
1
5
8
9
0.012
0.101
0.105
1
6
5
7
0.032
0.161
0.153
1
7
6
9
0.039
0.17
0.179
1
8
4
5
0.01
0.085
0.088
1
9
4
6
0.017
0.092
0.079
1
计算输出结果:
导纳矩阵内容:
每次迭代输出:
第1次:
第2次:
第3次:
第4次:
最终结果:
思考题:
3.1答:
有高斯-塞德尔法,牛顿-拉夫逊法,P-Q分解法等。
高斯-塞德尔法具有程序编制简单、占用内存少的优点,但算法收敛性差,计算时间长;
牛顿-拉夫逊法不仅在多数情况下没有发散的危险,而且收敛性强,可以大大节省计算时间,但对初始值的选择要求严格,必须选好恰当的初始值,否则不收敛;
P-Q分解法一般情况下迭代次数比牛顿-拉夫逊法多,但每次迭代时间比牛顿-拉夫逊法少,以致总速度比牛顿-拉夫逊法快。
3.2答:
在进行北京城市电网的潮流计算之前需要了解北京城市电网中所有的节点支路的相关数据,并对节点和支路分类。
处理PQ节点时要了解节点的注入有功和无功功率,PV节点要了解节点电压大小,注入有功功率及节点所能提供的最大和最小无功功率,对于平衡节点要了解节点的电压大小、相位及节点所能提供的最大和最小有功无功功率,此外还需的节点数据有,支路的电阻电抗电纳支路变压器的变比及线路所能传输的最大容量等。
计算结果分析,应考虑PQ节点的电压是否过高或过低,分析PV节点的电压幅值是否正常及无功功率是否超出范围,分析平衡节点有功无功功率是否在节点所能提供的范围之内,分析各支路的功率,看是否超出线路传输的最大容量,分析整个系统的网损是否达到标准。
3.3答:
算法构建的过程中,发现了自己对潮流计算了解的不足之处,各种公式掌握和理解的不够深刻,导致了算法设计的困难;程序方面,我发现了我和大家程序运行出错的最大原因,还是数组分配空间的不足,以及循环中数组下标的控制不当,导致数组访问越界,最终发生了数据混乱、数据空间重叠,甚至数据堆损坏、程序崩溃的情况,最终在我的仔细检查之下找到错误(感谢debug的断点和监视神器),在以后的编程过程中,我会吸取教训,避免再犯一样的错误。
程序流程图:
程序代码如下:
//aaa.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include"6GAUS.C"
structLine//线路结构体
{
intNum,NumI,NumJ;//线路号左节点名右节点名
doubleR,X,B,K,P12,Q12,P21,Q21;//电阻电抗电纳变比(K等于1为普通支路,不等于1为变压器支路的变比)线路左输入有功功率左输入无功功率右输入有功功率右输入无功功率
};
structBus//节点结构体
{
intNum;
doubleVolt,Phase,GenP,GenQ,LoadP,LoadQ;//节点的电压相角发出有功发出无功吸收有功吸收无功
intType;//节点类型(约定2为平衡节点,1为PV节点,0为PQ节点)
};
structssh//节点结构体(不明意义,但既然模板有就暂时留着)
{
intNumI,Num;
doubleG,B;
};
#include"stdio.h"
#include"string.h"
#include"math.h"
#include"stdlib.h"
#include"conio.h"
//#defineNBUS5
//#defineNLINE7
/*Globalvariables*/
intnL,nBus,nSH;//记录线路数,节点数,?
?
intmaxtime;//记录最大迭代次数
doublejd=0.0001;//默认精度设为0.0001
int_tmain(intargc,_TCHAR*argv[])
{
FILE*fp;
FILE*fpout;
inti,j,k,l,npv,npq,nbl,rtime=0,maxtime=50;//迭代次数置0,最大迭代次数默认设为50
inti1,i2,i3,kp,kq;
if((fp=fopen("in.txt","r"))==NULL)//从文件读取节点数,线路数,?
?
?
,最大迭代次数,精度值
{
printf("Cannotopenthefilenamed'in.txt'\n");exit(0);
}
fscanf(fp,"%d,%d,%d,%d,%f,",&nBus,&nL,&nSH,&maxtime,&jd);
if(fp!
=NULL)fclose(fp);
doubled1,d2,d3,d4,d5,d6,r,x,g,b,g12,g10,g20,b12,b10,b20,m,maxdp,maxdq,maxdu;
double*detp=(double*)calloc(nBus,sizeof(double)),
*detq=(double*)calloc(nBus,sizeof(double)),
*detu=(double*)calloc(nBus,sizeof(double)),//不平衡量
*e=(double*)calloc(nBus,sizeof(double)),//电压实部
*f=(double*)calloc(nBus,sizeof(double)),//电压虚部
*bb=(double*)calloc(2*nBus,sizeof(double)),//不平衡量矩阵
sump,sumq,sum_hl,sum_nj;//一些中间变量
double**H=(double**)calloc(nBus,sizeof(double*)),
**N=(double**)calloc(nBus,sizeof(double*)),
**J=(double**)calloc(nBus,sizeof(double*)),
**L=(double**)calloc(nBus,sizeof(double*)),
**R=(double**)calloc(nBus,sizeof(double*)),
**S=(double**)calloc(nBus,sizeof(double*)),//各雅可比子矩阵
**jac=(double**)calloc(2*(nBus),sizeof(double*)),//储存雅可比矩阵雏形
*jacc=(double*)calloc(4*(nBus-1)*(nBus-1),sizeof(double));//一维平铺的雅克比矩阵(便于使用高斯算法计算)
structLine*sLine=(Line*)calloc(nL,sizeof(Line));//线路结构体数组
structBus*sBus=(Bus*)calloc(nBus,sizeof(Bus));//节点结构体数组
structssh*sSH=(ssh*)calloc(nSH,sizeof(ssh));
double**YG=(double**)calloc(nBus+1,sizeof(double*)),//导纳矩阵实部
**YB=(double**)calloc(nBus+1,sizeof(double*));//导纳矩阵虚部
jac[0]=(double*)calloc(4*(nBus)*(nBus),sizeof(double));//分配第二维空间
for(i=0;i{
H[i]=(double*)calloc(nBus,sizeof(double));
N[i]=(double*)calloc(nBus,sizeof(double));
J[i]=(double*)calloc(nBus,sizeof(double));
L[i]=(double*)calloc(nBus,sizeof(double));
R[i]=(double*)calloc(nBus,sizeof(double));
S[i]=(double*)calloc(nBus,sizeof(double));
}
for(i=0;i{
YG[i]=(double*)calloc(nBus+1,sizeof(double));
YB[i]=(double*)calloc(nBus+1,sizeof(double));
}
for(i=1;i<2*(nBus);i++)
{
jac[i]=jac[i-1]+2*(nBus);//分配第二维指针地址
}
i1=i2=i3=0;
d1=d2=d3=d4=d5=d6=0.0;//变量初始化
if((fp=fopen("in.txt","r"))==NULL)
{
printf("Cannotopenthefilenamed'in.txt'\n");
exit(0);
}
fscanf(fp,"%d,%d,%d,%d,%lf,",&nBus,&nL,&nSH,&maxtime,&jd);//其实这里没有读数的必要了,只是为了换行读数据
for(i=0;isBus[i].Num=sBus[i].Type=0;sBus[i].Volt=1.0;
sBus[i].Phase=sBus[i].GenP=sBus[i].GenQ=sBus[i].LoadP=sBus[i].LoadQ=0.0;
fscanf(fp,"%d,%lf,%lf,%lf,%lf,%lf,%lf,%d",&i1,&d1,&d2,&d3,&d4,&d5,&d6,&i2);
sBus[i].Num=i1;sBus[i].Volt=d1;sBus[i].Phase=d2;sBus[i].GenP=d3;sBus[i].GenQ=d4;sBus[i].LoadP=d5,sBus[i].LoadQ=d6;sBus[i].Type=i2;
};
for(i=0;isLine[i].Num=sLine[i].NumI=sLine[i].NumJ=0;
sLine[i].R=sLine[i].X=sLine[i].B=0.0;sLine[i].K=1.0;
fscanf(fp,"%2d%3d%3d%lf%lf%lf%lf",&i1,&i2,&i3,&d1,&d2,&d3,&d4);
sLine[i].Num=i1;sLine[i].NumI=i2;sLine[i].NumJ=i3;sLine[i].R=d1;sLine[i].X=d2;sLine[i].B=d3;sLine[i].K=d4;
}
for(i=0;isSH[i].Num=sSH[i].NumI=0;sSH[i].G=sSH[i].B=0.0;
fscanf(fp,"%2d%3d%lf",&i1,&i2,&d1);
sSH[i].Num=i1;sSH[i].NumI=i2;sSH[i].B=d1;
}
if(fp!
=NULL)fclose(fp);
//------------------------生成导纳矩阵-------------------------
for(i=0;ifor(j=0;j{
YG[i][j]=0;
YB[i][j]=0;
}
for(l=0;l<