《华电潮流上机课程设计报告程序(共21页).doc》由会员分享,可在线阅读,更多相关《华电潮流上机课程设计报告程序(共21页).doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上 电力系统潮流上机课程设计报告 院 系:电气与电子工程学院 班 级: 学 号: 学生姓名: 指导教师: 刘宝柱 设计周数: 成 绩: 日期:2012年1月5日专心-专注-专业一、课程设计的目的与要求培养学生的电力系统潮流计算机编程能力,掌握计算机潮流计算的相关知识二、设计正文(详细内容见附录)1 手算2 计算机计算3 思考题3.1潮流计算的方法有哪些?各有何特点?答: 潮流计算的方法主要有高斯-赛德尔迭代法、牛顿-拉夫逊迭代法和P-Q分解法。它们各自的特点如下:(1)高斯-赛德尔迭代法分为以节点导纳矩阵为基础的高斯-赛德尔迭代法和以以节点阻抗矩阵为基础的高斯-赛德尔迭
2、代法的原理比较简单,要求的数字计算机的内存量也比较小,但收敛性差,当系统规模变大时,迭代次数急剧上升,往往出现迭代不收敛的情况;而阻抗法改善了电力系统潮流计算导纳法德收敛性问题,在当时获得了广泛的应用,但是,阻抗法的主要缺点是占用计算机的内存很大,每次迭代的计算量很大。当系统不断扩大时,这些缺点就更加突出。(2)牛顿-拉夫逊法是数学中求解非线性方程式的典型方法,有较好的收敛性。只要在迭代过程中尽可能保持方程式系数矩阵的稀疏性,就可以大大提高牛顿潮流计算程序的计算效率,牛顿法在收敛性、 内存要求、计算速度方面都超过了阻抗法,成为知道目前仍被广泛采用的方法。(3)P-Q分解法潮流计算派生于以极坐标
3、表示时的牛顿-拉夫逊法,它根据电力系统的特点,抓住主要矛盾,对纯数学的牛顿法进行了改造。与牛顿法相比,P-Q分解法的修正方程的系数矩阵B和B”分别是(n-1)和(m-1)的方阵,替代了原有的(n+m-2)阶系数矩阵J;B、B”在迭代过程中可以保持不变且为对称的系数矩阵,提高了计算速度,降低了对存储容量的要求。P-Q分解法在计算速度方面有显著地提高,迅速得到了推广。3.2如果交给你一个任务,请你用已有的潮流计算软件计算北京城市电网的潮流,你应该做哪些工作?(收集哪些数据,如何整理,计算结果如何分析)答:(1)在进行北京城市电网的潮流计算之前需要了解北京城市电网中所有的节点支路的相关数据,并对节点
4、和支路分类。处理PQ节点时要了解节点的注入有功和无功功率;PV节点要了解节点电压大小,注入有功功率及节点所能提供的最大和最小无功功率;对于平衡节点要了解节点的电压大小、相位及节点所能提供的最大和最小有功无功功率,此外还需的节点数据有:支路的电阻电抗电纳支路变压器的变比及线路所能传输的最大容量等。(3) 计算结果分析:应考虑PQ节点的电压是否过高或过低,分析PV节点的电压幅值是否正常及无功功率是否超出范围,分析平衡节点有功无功功率是否在节点所能提供的范围之内,分析各支路的功率,看是否超出线路传输的最大容量,分析整个系统的网损是否达到标准3.3设计中遇到的问题和解决的办法。开始时我们进行原始数据的
5、读入和读出,这一部分的程序比较简单,所以我们都很顺利都写出程序。接下来就是节点导纳矩阵的形成。编写这一部分程序时我刚开始没有考虑到变压器支路,所以当原始数据改为四节点四支路的数据时,节点导纳矩阵的结果就出错了。经过改正之后终于得出了正确的节点导纳矩阵。然后就是计算不平衡功率和雅可比矩阵。计算不平衡功率时候,为了方便计算,我将各节点的不平衡功率放到一个一维数组里面。雅可比矩阵的形成这一部分上我用了很长时间才将程序写出来。首先是对角线上的H,N,J,L的计算公式写的很复杂,与同学讨论之后我发现可以先将每个节点的注入电流放到一个数组里面,这样后面用来求H ,N ,J,L 时就比较方便。在这一模块的过
6、程中,我没有注意到雅克比矩阵中PQ节点和PV节点的对应关系,而且我没有将节点号取出来,以致出现了错误的编程思路和错误的结果,后来在同组同学的帮助下我又进行了第二次的编程,思路是正确的,但是运行出来的结果却是错误的,我想应该是我哪个公式出了错,最终经过反复检查后终于得到了正确结果,在编写雅克比矩阵还需要注意H、J、N、L四个矩阵的形成以及循环的顺序,然后就是如何将雅可比矩阵的各个元素放到一个二维数组里,这一部分看起来很简单,但是却很容易出错,经过和同组同学的认真思考和检查,终于得出来了正确的雅可比矩阵。 三、课程设计总结或结论两周的潮流上机计算已经结束了,虽然时间很短,可是我却学到了很多。潮流上
7、机计算除了需要一定的电力系统稳态知识以外,还要有良好的C语言基础。潮流上机的过程让我们巩固了潮流计算过程和方法, 以及稳态的基础知识。此外,从潮流数据的读入和写出,节点导纳矩阵的形成,功率不平衡量的计算,到形成雅克比矩阵和功率损耗的计算,我不断地进行编程和学习,在两周的潮流上机过程中,我完成了程序的编写,掌握了计算机潮流计算的基本方法与步骤,了解了计算机潮流计算的优点与重要性。潮流计算最关键的是进行C语言的编程,没有良好的C语言基础很难快速地编出潮流计算程序,编写时需要注意循环和嵌套的使用,我在编写的过程中由于循环没有用好以及粗心等原因,导致多次编出来的程序出现错误,这在潮流计算中都是不应该出
8、现的。四、参考文献1. 电力系统稳态分析,陈珩,中国电力出版社,2007年,第三版;2. C语言程序设计,郑玲,中国电力出版社,2009年,第一版;形成节点导纳矩阵设非平衡节点电压初值ei(0) ,fi(0)输入原始数据启动附录(设计流程图、程序、表格、数据等)1、设计流程图 令迭代次数k=0对PQ节点计算对PV节点计算 令节点号i=1雅可比矩阵是否已形成,in? 是 计算雅可比矩阵各元素Hij(k)、Nij(k)、Jij(k)、Lij(k)增加迭代次数k=k+1否增加节点号i=i+1解修正方程,由及雅可比矩阵用牛顿-拉夫逊法求各节点的ei,fi计算节点的新电压ei(k+1)=ei(k)+ei
9、(k)fi(k+1)=fi(k)+fi(k)求出max(|dei|,|dfi|)判断迭代是否收敛|dei|,|dfi|计算平衡节点的功率及线路功率停止2、程序数据输入模块struct Line int Num,NumI,NumJ; float R,X,B,K; ;struct Bus int Num ; float Volt,Phase,GenP,GenQ,LoadP,LoadQ; int Type; ;struct Shunt int Num,NumI; float G,B; ; #includestdio.h#includestring.h#includemath.h#includestd
10、lib.h#define NBUS 4#define NLINE 4/* Global variables */int nL,nSH,nB,nVA;float XNBUS;int L;void main()FILE *fp;int i,j,k,l,h,c;int i1,i2,i3;float d1,d2,d3,d4,d5,d6,r,x,g,b,e;struct Line sLNLINE;struct Bus sBNBUS;struct Shunt sSHNBUS;float YGNBUSNBUS,YBNBUSNBUS;i1=i2=i3=0;d1=d2=d3=d4=d5=d6=0.0;e=0.0
11、0001;for(i=0;iNBUS;i+)/*Read the input data*/if(fp=fopen(data.txt,r)=NULL) printf(Can not open the file named data.txt n); exit(0); fscanf(fp,%d,%d,%d,&nB,&nL,&nSH);for(i=0;inB;i+) sBi.Num=sBi.Type=0;sBi.Volt=1.0; sBi.Phase=sBi.GenP=sBi.GenQ=sBi.LoadP=sBi.LoadQ=0.0; fscanf(fp,%d,%f,%f,%f,%f,%f,%f,%d
12、,&i1,&d1,&d2,&d3,&d4,&d5,&d6,&i2); sBi.Num=i1;sBi.Volt=d1;sBi.Phase=d2;sBi.GenP=d3;sBi.GenQ=d4;sBi.LoadP=d5,sBi.LoadQ=d6;sBi.Type=i2; ;for(i=0;inL;i+) sLi.Num=sLi.NumI=sLi.NumJ=0; sLi.R=sLi.X=sLi.B=0.0;sLi.K=1.0; fscanf(fp,%2d %3d %3d %f %f %f %f,&i1,&i2,&i3,&d1,&d2,&d3,&d4); sLi.Num=i1;sLi.NumI=i2;
13、sLi.NumJ=i3;sLi.R=d1;sLi.X=d2;sLi.B=d3;sLi.K=d4; for(i=0;inSH;i+) sSHi.Num=sSHi.NumI=0;sSHi.G=sSHi.B=0.0; fscanf(fp,%2d %3d %f,&i1,&i2,&d1); sSHi.Num=i1;sSHi.NumI=i2;sSHi.B=d1; if(fp!=NULL) fclose(fp);/*Make Y Matrix*/for(i=1;inB+1;i+)for(j=1;jnB+1;j+) YGij=0.0; YBij=0.0; ;for(l=0; lnL; l+) i=sLl.Nu
14、mI; j=sLl.NumJ; r=sLl.R; x=sLl.X; d1=r*r+x*x; g=r/d1; b=-x/d1; if(fabs(sLl.K-1.0)0.) YGii=YGii+g/sLl.B/sLl.B;YGjj=YGjj+g;YBii=YBii+b/sLl.B/sLl.B;YBjj=YBjj+b;YGij=YGij-g/sLl.B;YGji=YGji-g/sLl.B;YBij=YBij-b/sLl.B;YBji=YBji-b/sLl.B; /* Check the Y matrix */if(fp=fopen(GGBB.txt,w)=NULL) printf(Can not o
15、pen the file named GGBB.txt n);exit(0);fprintf(fp,-Y Matrix-n);for(i=1;inB+1;i+)for(j=1;j0.)fprintf(fp,Y(%3d,%-3d)=(%10.5f,%10.5f)n,i,j,YGij,YBij);if(fp!=NULL) fclose(fp);/* 设定电压初值*/float VNBUSNBUS=0;for(i=1;iNBUS+1;i+)if(sBi-1.Type=0)Vi0=1.0;Vi1=0.0;for(i=1;iNBUS+1;i+)if(sBi-1.Type=1)Vi0=sBi-1.Volt
16、;Vi1=0.0;for(i=1;iNBUS+1;i+)if(sBi-1.Type=2)Vi0=(sBi-1.Volt)*cos(sBi-1.Phase);/es Vi1=(sBi-1.Volt)*sin(sBi-1.Phase);/fs/输出电压初值if(fp=fopen(电压初值.txt,w)=NULL) printf(Can not open the file named 电压初值.txt n); exit(0);fprintf(fp,-电压初值-n);for(i=1;iNBUS+1;i+)for(j=1;j2;j+)fprintf(fp,Y(%2d )=(%10.5f,%10.5f)n
17、,i,Vi0,Vi1);if(fp!=NULL) fclose(fp);for(c=1;c+)/* 计算偏移量*/float PQ1002=0,dV100=0,df100=0;for(i=1;iNBUS;i+) if(sBi-1.Type=0)/计算PQ节点 for(j=1;jNBUS+1;j+)PQi0-=Vi0*(YGij*Vj0-YBij*Vj1)+Vi1*(YGij*Vj1+YBij*Vj0);PQi1-=Vi1*(YGij*Vj0-YBij*Vj1)-Vi0*(YGij*Vj1+YBij*Vj0); if(sBi-1.Type=1)/计算PV节点 for(j=1;jNBUS;j+)
18、PQi0-=Vi0*(YGij*Vj0-YBij*Vj1)+Vi1*(YGij*Vj1+YBij*Vj0); dVi=Vi1*Vi1+Vi0*Vi0; h=1;for(i=1;iNBUS;i+)if(sBi-1.Type=0)dfh=PQi0+sBi-1.GenP-sBi-1.LoadP;h+;dfh=PQi1+sBi-1.GenQ-sBi-1.LoadQ;h+;if(sBi-1.Type=1)dfh=PQi0+sBi-1.GenP-sBi-1.LoadP;h+;dfh=sBi-1.Volt*sBi-1.Volt-dVi;h+;/*输出偏移量*/ if(c=1)if(fp=fopen(第一次迭
19、代偏移量.txt,w)=NULL) printf(Can not open the file named 第一次迭代偏移量.txt n); exit(0);fprintf(fp,- 第一次迭代偏移量-n);for(i=1;ih;i+)fprintf(fp,df(%2d )=(%10.5f)n,i,dfi);if(fp!=NULL) fclose(fp); /* 计算雅克比矩阵*/float ga2*(NBUS-1)=0,gb2*(NBUS-1)=0;float H2*(NBUS-1)2*(NBUS-1)=0,J2*(NBUS-1)2*(NBUS-1)=0,L2*(NBUS-1)2*(NBUS-
20、1)=0,N2*(NBUS-1)2*(NBUS-1)=0,JJ2*(NBUS-1)2*(NBUS-1)=0,R2*(NBUS-1)2*(NBUS-1)=0,S2*(NBUS-1)2*(NBUS-1)=0; for(i=1;iNBUS;i+)for(j=1;jNBUS;j+)if(i=j)gai=-(PQi0*Vi0+PQi1*Vi1)/(Vi0*Vi0+Vi1*Vi1); /计算agbi=-(PQi0*Vi1-PQi1*Vi0)/(Vi0*Vi0+Vi1*Vi1); /计算bHii=-Vi0*YBii+YGii*Vi1+gbi; Nii=Vi0*YGii+YBii*Vi1+gai;Jii=-V
21、i0*YGii-YBii*Vi1+gai;Lii=Vi1*YGii-YBii*Vi0-gbi; Rii=2*Vi1; Sii=2*Vi0; elseHij=-Vi0*YBij+YGij*Vi1;/非对角线元素正确。 Nij=Vi0*YGij+YBij*Vi1;Jij=-Vi0*YGij-YBij*Vi1;Lij=-Vi0*YBij+YGij*Vi1; Rij=0.0; Sij=0.0;h=1;for(i=1;iNBUS;i+)l=1;if(sBi-1.Type=0)for(j=1;jNBUS;j+) JJhl=Hij;l+;JJhl=Nij;l+; h+; l=1; for(j=1;jNBUS
22、;j+) JJhl=Jij; l+; JJhl=Lij; l+; h+; l=1; if(sBi-1.Type=1) for(j=1;jNBUS;j+) JJhl=Hij;l+;JJhl=Nij;l+; h+; l=1; for(j=1;jNBUS;j+) JJhl=Rij;l+; JJhl=Sij;l+; h+; /* 输出雅克比矩阵*/if(c=1)if(fp=fopen(第一次迭代雅克比矩阵.txt,w)=NULL) printf(Can not open the file named 雅克比矩阵.txt n); exit(0);fprintf(fp,- 第一次迭代雅克比矩阵-n,c);
23、fprintf(fp, );for(i=1;ih;i+)fprintf(fp, %dtt,i);fprintf(fp,n);for(i=1;ih;i+)fprintf(fp,%2d ,i);for(j=1;jh;j+)fprintf(fp,%10.5ft,JJij);fprintf(fp,n);if(fp!=NULL) fclose(fp); /*高斯法求解方程组*/float U100=;int LH100=;float t,d;l=1;for(i=1;ih;i+) LHi=0;for(k=1;kh;k+)d=0.0;for(j=k;jd) d=fabs(JJkj); /在一行中找到一个最大
24、值赋值d,并用JSK记住这个最大值所在的列号LHk=j; if(fabs(d)0.) /如果d的数值太小,做为被除数将带来很大的误差l=0;else if(LHk!=k)for(i=1;ih;i+)t=JJik;JJik=JJiLHk; /进行列交换,让最大值始终在对角元上JJiLHk=t;if(l=0)break; for(j=k+1;jh;j+)JJkj=JJkj/JJkk; /对角元上的元素消为dfk=dfk/JJkk; for(i=k+1;ih;i+)for(j=k+1;j0.00001) /用追赶法,解方程组,求未知数x Uh-1=dfh-1;for(i=h-2;i=0;i-)t=0
25、.0;for(j=i+1;jh;j+)t=t+JJij*Uj;Ui=(dfi-t);/*输出高斯结果*/if(c=1)if(fp=fopen(第一次迭代高斯.txt,w)=NULL) printf(err);exit(0);for(i=1;ih;i+)fprintf(fp,%f,Ui);fprintf(fp,n);fclose(fp);/*得到电压值*/h=1;for(i=1;iNBUS;i+)if(sBi-1.Type=0)Vi1+=Uh;h+;Vi0+=Uh;h+;if(sBi-1.Type=1)Vi1+=Uh;h+;Vi0+=Uh;h+;/* 输出电压值*/ if(c=1)if(fp=f
26、open(第一次迭代电压值.txt,w)=NULL) printf(Can not open the file named 电压值.txt n); exit(0);fprintf(fp,-第一次迭代后的电压初值-n);for(i=1;iNBUS+1;i+)for(j=1;j2;j+)fprintf(fp,Y(%2d )=(%10.5f,%10.5f)n,i,Vi0,Vi1);if(fp!=NULL) fclose(fp);/*求最大变化值*/ float w;w=0;for(i=1;ifabs(w)w=Ui;if(w0.00001)break;/* 输出电压终值*/ if(fp=fopen(7
27、电压终值.txt,w)=NULL) printf(Can not open the file named 电压终值.txt n); exit(0); fprintf(fp,-电压终值-n); fprintf(fp,循环%d次n,c);for(i=1;iNBUS+1;i+)for(j=1;j2;j+)fprintf(fp,Y(%2d )=(%10.5f,%10.5f)n,i,Vi0,Vi1);if(fp!=NULL) fclose(fp);/计算平衡节点的功率float dp,ps,qs,dsp,dsq,sumgen; ps=0; qs=0;for(i=1;iNBUS+1;i+)if(sBi-1
28、.Type=2)for(j=1;jNBUS+1;j+)ps+=Vi0*(YGij*Vj0-YBij*Vj1)+Vi1*(YGij*Vj1+YBij*Vj0);/有功qs+=Vi1*(YGij*Vj0-YBij*Vj1)-Vi0*(YGij*Vj1+YBij*Vj0);/无功/各节点功率float g1,g2,b1,b2;float sP100100=,sQ100100=;for(l=0; lnL; l+) i=sLl.NumI; j=sLl.NumJ; if(fabs(sLl.K-1.0)0.) /*Normal lines or transformers*/sPij=Vi1*(-Vi1*sL
29、l.B+(Vi1-Vj1)*g-(Vi0-Vj0)*b)+Vi0*(Vi0*sLl.B+(Vi1-Vj1)*b+(Vi0-Vj0)*g); sQij=Vi0*(-Vi1*sLl.B+(Vi1-Vj1)*g-(Vi0-Vj0)*b)-Vi1*(Vi0*sLl.B+(Vi1-Vj1)*b+(Vi0-Vj0)*g); sPji=Vj1*(-Vj1*sLl.B+(Vj1-Vi1)*g-(Vj0-Vi0)*b)+Vj0*(Vi0*sLl.B+(Vj1-Vi1)*b+(Vj0-Vi0)*g); sQji=Vj0*(-Vj1*sLl.B+(Vj1-Vi1)*g-(Vj0-Vi0)*b)-Vj1*(Vi0*s
30、Ll.B+(Vj1-Vi1)*b+(Vj0-Vi0)*g); else /*abnormal transformer ratio*/ k=sLl.B;g1=g*(1-k)/k/k; /*简化公式所设中间变量*/b1=b*(1-k)/k/k;g2=g*(k-1)/k;b2=b*(k-1)/k;g/=k;b/=k;sPij=Vi0*(g*(Vi0-Vj0)-b*(Vi1-Vj1)+g1*Vi0-b1*Vi1)+Vi1*(g*(Vi1-Vj1)+b*(Vi0-Vj0)+g1*Vi1+b1*Vi0);sQij=Vi1*(g*(Vi0-Vj0)-b*(Vi1-Vj1)+g1*Vi0-b1*Vi1)-Vi
31、0*(g*(Vi1-Vj1)+b*(Vi0-Vj0)+g1*Vi1+b1*Vi0);sPji=Vj0*(g*(Vj0-Vi0)-b*(Vj1-Vi1)+g2*Vj0-b2*Vj1)+Vj1*(g*(Vj1-Vi1)+b*(Vj0-Vi0)+g1*Vj1+b1*Vj0);sQji=Vj1*(g*(Vj0-Vi0)-b*(Vj1-Vi1)+g2*Vj0-b2*Vj1)+Vj0*(g*(Vj1-Vi1)+b*(Vj0-Vi0)+g1*Vj1+b1*Vj0); /*网络总损*/dsp=ps;dsq=qs;sumgen=ps;for(i=1;iNBUS+1;i+)dsp+=sBi-1.GenP-sBi-1.LoadP;dsq+=sBi-1.GenQ-sBi-1.LoadQ;sumgen+=sBi-1.GenP;dp=dsp/sumgen*100;/输电效率 /* 输出功率情况*/if(fp=fopen(8功率情况.txt,w)=NULL) printf(Can not open the file named 功率情况.txt n); exit(0);fprintf(fp,-功率情况-n); fprintf(fp,平衡节点功率S=%10.5f+j%10.5fn,ps,qs);for(i=1;iNBUS+1;i+)
限制150内