电网1202刘妍君1121600218.doc_第1页
电网1202刘妍君1121600218.doc_第2页
电网1202刘妍君1121600218.doc_第3页
电网1202刘妍君1121600218.doc_第4页
电网1202刘妍君1121600218.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电力系统潮流上机课程设计报告 院 系:电气与电子工程学院 班 级: 电网1202 学 号: 1121600218 学生姓名: 刘妍君 指导教师: 毛安家 设计周数: 两周 成 绩: 日期:2014年12月30日 课程 课程设计报告一、课程设计的目的与要求培养学生的电力系统潮流计算机编程能力,掌握计算机潮流计算的相关知识二、设计正文(详细内容见附录)1 手算:要求应用牛顿-拉夫逊法或P-Q分解法手算求解,要求迭代两次。节点1为平衡节点,电压,节点2为PQ节点,负荷功率,节点3是PV节点,两条支路分别为,对地支路。手算结果见附录。根据题意得出节点导纳矩阵为:1)第一次迭代:不平衡量为:雅克比矩阵为:由修正方程解得: 节点电压新值为:2)第二次迭代:不平衡量为:雅克比矩阵:由修正方程可得:迭代后的新值为:2 编写潮流计算程序,计算简单系统.简单系统如下图所示,支路数据如下:支路14,27,39为变压器支路,参数为,其余支路为线路支路,参数为,节点数据如下:,,牛顿-拉夫逊法的求解过程为:(程序代码以及结果见附录)3思考题3.1潮流计算的方法有哪些?各有何特点?潮流计算的方法主要有高斯-赛德尔迭代法、牛顿-拉夫逊迭代法和P-Q分解法。它们各自的特点如下:(1)高斯-赛德尔迭代法分为以节点导纳矩阵为基础的高斯-赛德尔迭代法和以以节点阻抗矩阵为基础的高斯-赛德尔迭代法的原理比较简单,要求的数字计算机的内存量也比较小,但收敛性差,当系统规模变大时,迭代次数急剧上升,往往出现迭代不收敛的情况;而阻抗法改善了电力系统潮流计算导纳法德收敛性问题,在当时获得了广泛的应用,但是,阻抗法的主要缺点是占用计算机的内存很大,每次迭代的计算量很大。当系统不断扩大时,这些缺点就更加突出。(2)牛顿-拉夫逊法是数学中求解非线性方程式的典型方法,有较好的收敛性。只要在迭代过程中尽可能保持方程式系数矩阵的稀疏性,就可以大大提高牛顿潮流计算程序的计算效率,牛顿法在收敛性、内存要求、计算速度方面都超过了阻抗法,成为知道目前仍被广泛采用的方法。(3)P-Q分解法潮流计算派生于以极坐标表示时的牛顿-拉夫逊法,它根据电力系统的特点,抓住主要矛盾,对纯数学的牛顿法进行了改造。与牛顿法相比,P-Q分解法的修正方程的系数矩阵B和B”分别是(n-1)和(m-1)的方阵,替代了原有的(n+m-2)阶系数矩阵J;B、B”在迭代过程中可以保持不变且为对称的系数矩阵,提高了计算速度,降低了对存储容量的要求。P-Q分解法在计算速度方面有显著地提高,迅速得到了推广。3.2如果交给你一个任务,请你用已有的潮流计算软件计算北京城市电网的潮流,你应该做哪些工作?(收集哪些数据,如何整理,计算结果如何分析)在进行北京城市电网的潮流计算之前需要了解北京城市电网中所有的节点支路的相关数据,并对节点和支路分类。处理PQ节点时要了解节点的注入有功和无功功率;PV节点要了解节点电压大小,注入有功功率及节点所能提供的最大和最小无功功率;对于平衡节点要了解节点的电压大小、相位及节点所能提供的最大和最小有功无功功率,此外还需的节点数据有:支路的电阻电抗电纳支路变压器的变比及线路所能传输的最大容量等。3.3设计中遇到的问题和解决的办法。(2)实验中需要使用文件的输入输出,学习了简单的文件读入读出函数及文件指针的使用方法。(3)关于导纳矩阵的形成,实验中有两种类型的线路,通过循环读入每条线路的信息并修改导纳矩阵,在读入输电线线路是由于疏忽讲电纳取了倒数,以致导纳矩阵gY_B中部分数值很大,幸好及时发现问题并改正。其次是变压器线路,变压器线路的等效模型参考电力系统分析基础书中第89页图4-3,程序要求读入数据中变压器线路的起点与终点的比值为1:k。(7)由于程序设计初期设置变量大多将一个复数的实部虚部分开保存,在计算线路功率是要将公式展开,对应计算实部虚部,但是如果程序定义了复数类并且重载运算符,会使线路功率计算更加便捷。三、课程设计总结或结论四、参考文献1. 电力系统计算:电子数字计算机的应用,西安交通大学等合编。北京:水利电力出版社;2. 现代电力系统分析,王锡凡主编,科学出版社;3. 电力系统稳态分析,陈珩,中国电力出版社,1995年,第三版;4. 算法竞赛入门经典训练指南,刘汝佳清华大学出版社,2012年,第一版;附录(设计流程图、程序、表格、数据等)1、程序设计流程图开始读入数据形成导纳矩阵设置初值,设cas=1计算不平衡量,雅克比矩阵高斯消元求修正值更新新值存在e,f大于精度或者cas规定值Cas+计算不平衡量,雅克比矩阵高斯消元求修正值更新新值计算各节点电压值及各线路功率,网损将结果输出到文件中结束程序否是2、计算机潮流程序(1)头文件 ”DeclearVar.h”#ifndef DECLEARVAR_H_INCLUDED#define DECLEARVAR_H_INCLUDED const int N=100; const int NLINE=100; const double Limit=1e-4; int n_node,n_line,cas; /平衡节点 type=0,e,f;PQ节点 type=1,PQ;PV节点 type=2,p v; struct tynode int id,type; double noda,nodb; gBusN; /变压器type=1,输电线type=2; struct tyline int id,type,start,ends; double x,r,bk; gLineNLINE; double gY_GNN,gY_BNN; double gDelta_PN,gDelta_QN,gDelta_PQ2*N; double gJaccobi2*N2*N; double gDelta_fN,gDelta_eN,gDelta_fe2*N; double gfN,geN; struct tynodeans int id,type; double e,f,v,g,p,q; nodeansN; struct fushu double p,q; SNN;#endif / DECLEARVAR_H_INCLUDED(2)头文件 ”DeclearFunc.h”#ifndef DECLEARFUNC_H_INCLUDED#define DECLEARFUNC_H_INCLUDEDvoid GetData();void GetYMatrix();void SetInitial();void GetUnbalance();void GetJaccobi();void GetRevised();void GetNewValue();void CalFlow();void GetAns();void OutPut();#endif / DECLEARFUNC_H_INCLUDED(3)主函数”main.cpp”#include#include#include DeclearVar.h#include DeclearFunc.husing namespace std;#define DataPath data.txt/*/复数由实部虚部转化为幅值p和相角q;fushu Getvg(fushu a) fushu tmpf; tmpf.p=sqrt(a.p*a.p+a.q*a.q); tmpf.q=atan(a.q/a.p); return tmpf;/*/void GetData()int i;FILE *fp;fp=fopen(DataPath,r);if(fp=NULL)printf(data.txt open error!n);elsefscanf(fp,%d %d,&n_node,&n_line);for(i=0;in_node;i+) fscanf(fp,%d%d%lf%lf,&gBusi.id,&gBusi.type,&gBusi.noda,&gBusi.nodb); for(i=0;in_line;i+) fscanf(fp,%d%d%d%d%lf%lf%lf,&gLinei.id,&gLinei.type,&gLinei.start,&gLinei.ends,&gLinei.r,&gLinei.x,&gLinei.bk);/*/DataRead Judgeprintf(%d %dn,n_node,n_line); for(i=0;in_node;i+) printf(%d %d %lf %lfn,gBusi.id,gBusi.type,gBusi.noda,gBusi.nodb); for(i=0;in_line;i+) printf(%d %d %d %d %lf %lf %lfn,gLinei.id,gLinei.type,gLinei.start,gLinei.ends,gLinei.r,gLinei.x,gLinei.bk);*/printf(文件读入搞定-n);return ;void GetYMatrix() int i,j,tst,ten; double tmp,tg,tb,k; for(i=0;in_node;i+) for(j=0;jn_node;j+) gY_Gij=0; gY_Bij=0; for(i=0;in_line;i+) tmp=gLinei.x*gLinei.x+gLinei.r*gLinei.r; tg=gLinei.r/tmp; tb=-gLinei.x/tmp; /printf(r=%.3lf x=%.3lf tmp=%.3lf tg=%.3lf tb=%3lfn,gLinei.r,gLinei.x,tmp,tg,tb); tst=gLinei.start-1; ten=gLinei.ends-1; if(gLinei.type=1) k=gLinei.bk; gY_Gtsttst+=(tg); gY_Btsttst+=(tb); gY_Gtenten+=(tg/k/k); gY_Btenten+=(tb/k/k); gY_Gtstten-=(tg/k); gY_Btstten-=(tb/k); gY_Gtentst-=(tg/k); gY_Btentst-=(tb/k); else if(gLinei.type=2) k=gLinei.bk; gY_Gtsttst+=(tg); gY_Btsttst+=(tb+k); gY_Gtenten+=(tg); gY_Btenten+=(tb+k); gY_Gtstten-=(tg); gY_Btstten-=(tb); gY_Gtentst-=(tg); gY_Btentst-=(tb); FILE *fp; fp=fopen(YMatrix.txt,w); if(fp=NULL) printf(YMatrix.txt文件打开失败!n); for(i=0;in_node;i+) for(j=0;jn_node;j+) fprintf(fp,%.3lf %.3lft,gY_Gij,gY_Bij); fprintf(fp,n); printf(导纳矩阵搞定-n);void SetInitial() int i; for(i=0;in_node;i+) if(gBusi.type=0) /平衡节点 gei=gBusi.noda; gfi=gBusi.nodb; else if(gBusi.type=1) /PQ节点 gei=1; gfi=0.0; else if(gBusi.type=2) /PV节点 gei=1;/gBusi.nodb; gfi=0.0; else printf(输入的节点类型出错!n); /* for(i=0;in_node;i+) printf(%.3lf ,gei);printf(n); for(i=0;in_node;i+) printf(%.3lf ,gfi);printf(n); */ printf(初始化数据完成-n);void GetUnbalance() int i,j; double tmp; for(i=1;in_node;i+) if(gBusi.type=2) tmp=0; for(j=0;jn_node;j+) tmp+=(gei*(gY_Gij*gej-gY_Bij*gfj)+gfi*(gY_Gij*gfj+gY_Bij*gej); gDelta_Pi=gBusi.noda-tmp; gDelta_Qi=gBusi.nodb*gBusi.nodb-gei*gei-gfi*gfi; else if(gBusi.type=1) tmp=0; for(j=0;jn_node;j+) tmp+=gei*(gY_Gij*gej-gY_Bij*gfj)+gfi*(gY_Gij*gfj+gY_Bij*gej); gDelta_Pi=gBusi.noda-tmp; tmp=0; for(j=0;jn_node;j+) tmp+=gfi*(gY_Gij*gej-gY_Bij*gfj)-gei*(gY_Gij*gfj+gY_Bij*gej); gDelta_Qi=gBusi.nodb-tmp; for(i=1;in_node;i+) /gDelta_PQ从2开始 gDelta_PQi*2=gDelta_Pi; gDelta_PQi*2+1=gDelta_Qi; /printf(%d %.5lf %d %.5lfn,i*2,gDelta_PQi*2,i*2+1,gDelta_PQi*2+1); FILE *fp; fp=fopen(Unbalance.txt,w); if(fp=NULL) printf(Unbalance.txt打开失败n); fprintf(fp,节点类型1为pv节点,2为pq节点n); for(i=2;in_node*2;i+=2) fprintf(fp,节点%d类型%d,Delta_p=%lf Delta_q=%lfn,i/2+1,gBusi/2.type,gDelta_PQi,gDelta_PQi+1);void GetJaccobi() int i,j,k; double tmp; for(i=1;in_node;i+) if(gBusi.type=1) for(j=1;jn_node;j+) if(i!=j) gJaccobii*2j*2=gY_Bij*gei-gY_Gij*gfi; gJaccobii*2j*2+1=-gY_Gij*gei-gY_Bij*gfi; gJaccobii*2+1j*2=gY_Bij*gfi+gY_Gij*gei; gJaccobii*2+1j*2+1=-gY_Gij*gfi+gY_Bij*gei; else tmp=0; for(k=0;kn_node;k+) tmp+=(gY_Gik*gfk+gY_Bik*gek); gJaccobii*2j*2=-tmp-gY_Gii*gfi+gY_Bii*gei; tmp=0; for(k=0;kn_node;k+) tmp+=(gY_Gik*gek-gY_Bik*gfk); gJaccobii*2j*2+1=-tmp-gY_Gii*gei-gY_Bii*gfi; tmp=0; for(k=0;kn_node;k+) tmp+=(gY_Gik*gek-gY_Bik*gfk); gJaccobii*2+1j*2=-tmp+gY_Gii*gei+gY_Bii*gfi; tmp=0; for(k=0;kn_node;k+) tmp+=(gY_Gik*gfk+gY_Bik*gek); gJaccobii*2+1j*2+1=+tmp-gY_Gii*gfi+gY_Bii*gei; else if(gBusi.type=2) for(j=1;jn_node;j+) if(i!=j) gJaccobii*2j*2=gY_Bij*gei-gY_Gij*gfi; gJaccobii*2j*2+1=-gY_Gij*gei-gY_Bij*gfi; gJaccobii*2+1j*2=0.0; gJaccobii*2+1j*2+1=0.0; else tmp=0; for(k=0;kn_node;k+) tmp+=(gY_Gik*gfk+gY_Bik*gek); gJaccobii*2j*2=-tmp-gY_Gii*gfi+gY_Bii*gei; tmp=0; for(k=0;kn_node;k+) tmp+=(gY_Gik*gek-gY_Bik*gfk); gJaccobii*2j*2+1=-tmp-gY_Gii*gei-gY_Bii*gfi; gJaccobii*2+1j*2=-2*gfi; gJaccobii*2+1j*2+1=-2*gei; FILE *fp1; fp1=fopen(Jaccobi.txt,w); if(fp1=NULL) printf(Jaccobi.txt文件打开失败!n); else for(i=2;i2*n_node;i+) for(j=2;j2*n_node;j+) fprintf(fp1,%8.3lf,gJaccobiij); fprintf(fp1,n); /printf(Jaccobi矩阵搞定-n);/高斯消元,参考刘汝佳算法竞赛入门经典训练指南154页void GetRevised() int i,j,k,r,n=n_node*2-2; double tmp,f,AN*2-2N*2-1;/存放增广矩阵 for(i=0;in;i+) for(j=0;jn;j+) Aij=gJaccobii+2j+2; Ain=gDelta_PQi+2; for(i=0;in;i+) r=i; for(j=i+1;jfabs(Ari) r=j; if(r!=i) for(j=0;j=n;j+) tmp=Arj; Arj=Aij; Aij=tmp; /i+1n行与第i行消元 for(k=i+1;kn;k+) f=Aki/Aii; for(j=i;j=0;i-) for(j=i+1;jn;j+) Ain-=Ajn*Aij; Ain/=Aii; for(i=0;in;i+) gDelta_fei+2=Ain; FILE *fp; fp=fopen(Delta_fe.txt,w); if(fp=NULL) printf(Delata_fe.txt打开失败n); for(i=2;in+2;i+=2) fprintf(fp,Delta_f%d=%.9lft Delta_e%d=%.9lfn,i/2+1,gDelta_fei,i/2+1,gDelta_fei+1); void GetNewValue() int i; for(i=1;in_node;i+) gfi-=gDelta_fei*2; gei-=gDelta_fei*2+1; int is_ok() /返回值为1需要继续迭代,返回值为0则不需要继续迭代 int i; double tmp=0; for(i=0;itmp) tmp=fabs(gDelta_fei); if(fabs(tmp)Limit) return 1; return 0;void GetAns() int i,j; fushu tmpf,a; double tmp,tmq; for(i=0;in_node;i+) nodeansi.id=gBusi.id; nodeansi.type=gBusi.type; if(nodeansi.type=0) nodeansi.e=gBusi.noda; nodeansi.f=gBusi.nodb; a.p=gBusi.noda; a.q=gBusi.nodb; tmpf=Getvg(a); nodeansi.v=tmpf.p; nodeansi.g=tmpf.q; tmp=0; tmq=0; for(j=0;jn_node;j+) tmp+=gei*(gY_Gij*gej-gY_Bij*gfj)+gfi*(gY_Gij*gfj+gY_Bij*gej); tmq+=gfi*(gY_Gij*gej-gY_Bij*gfj)-gei*(gY_Gij*gfj+gY_Bij*gej); nodeansi.p=tmp; nodeansi.q=tmq; else if(nodeansi.type=1) nodeansi.e=gei; nodeansi.f=gfi; nodeansi.p=gBusi.noda; nodeansi.q=gBusi.nodb; a.p=gei; a.q=gfi; tmpf=Getvg(a); nodeansi.v=tmpf.p; nodeansi.g=tmpf.q; else if(nodeansi.type=2) nodeansi.e=gei; nodeansi.f=gfi; a.p=gei; a.q=gfi; tmpf=Getvg(a); nodeansi.v=tmpf.p; nodeansi.g=tmpf.q; nodeansi.p=gBusi.noda; tmq=0; for(j=0;jn_node;j+) tmq+=gfi*(gY_Gij*gej-gY_Bij*gfj)-gei*(gY_Gij*gfj+gY_Bij*gej); nodeansi.q=tmq; void CalFlow() int i,j,k; double tmpg,tmpb,tmp,x,r,kb; double BN,GN;/对地导纳统计 for(i=0;in_node;i+) Bi=Gi=0; for(i=0;in_line;i+) if(gLinei.type=2) BgLinei.start-1+=gLinei.bk; BgLinei.ends-1+=gLinei.bk; else if(gLinei.type=1) x=gLinei.x; r=gLinei.r; kb=gLinei.bk; tmp=x*x+r*r; GgLinei.start-1+=r/tmp*(kb-1)/kb; BgLinei.start-1+=(-x/tmp*(kb-1)/kb); GgLinei.ends-1+=r/tmp*(1-kb)/kb/kb; BgLinei.ends-1+=(-x/tmp*(1-kb)/kb/kb); for(k=0;kn_line;k+) i=gLinek.start-1; j=gLinek.ends-1; Sij.p=(gei*gei+gfi*gfi)*(Gi+gY_Gij)-(gei*gej+gfi*gfj)*gY_Gij-(gfi*gej-gei*gfj)*gY_Bij; Sij.q=-(gei*gei+gfi*gfi)*(Bi+gY_Bij)-(gfi*gej-gei*gfj)*gY_Gij+(gei*gej+gfi*gfj)*gY_Bij; i=gLinek.ends-1; j=gLinek.start-1; Sij.p=(gei*gei+gfi*gfi)*(Gi+gY_Gij)-(gei*gej+gfi*gfj)*gY_Gij-(gfi*gej-gei*gfj)*gY_Bij; Sij.q=-(gei*gei+gfi*gfi)*(Bi+gY_Bij)-(gfi*gej-gei*gfj)*gY_Gij+(gei*gej+gfi*gfj)*gY_Bij; void OutPut() FILE *fp; fp=fopen(result.txt,w); int i,j,st,en; fprintf(fp,节点信息如下:n); fprintf(fp,节点类型0:平衡节点 1:pq节点 2:pv节点n); for(i=0;in_node;i+) fprintf(fp,节点%d类型%d e=%lf f=%lft,nodeansi.id,nodeansi.type,nodeansi.e,nodeansi.f); fprintf(fp,幅值=%lf 相角=%lftP=%lf Q=%lfn,nodeansi.v,nodeansi.g,nodeansi.p,nodeansi.q); fprintf(fp,nn支路功率信息如下:n); fprintf(fp,P=n); for(i=0;in_node;i+) for(j=0;jn_node;j+) fprintf(fp,%lft,Sij.p); fprintf(fp,n); fprintf(fp,Q=n); for(i=0;in_node;i+) for(j=0;jn_node;j+) fprintf(fp,%lft,Sij.q); fprintf(fp,n); fprintf(fp,nn支路网损信息如下:n); for(i=0;in_line;i+) st=gLinei.start; en=gLinei.ends; fprintf(fp,第%d条支路连接%d %dt网损p=%lf tq=%lfn,i+1,st,en,(Sst-1en-1.p+Sen-1st-1.p),(Sst-1en-1.q+Sen-1st-1.q); int main() int i; GetData(); GetYMatrix(); SetInitial(); cas=1; GetUnbalance(); GetJaccobi(); GetRevised(); GetNewValue(); printf(已迭代%d次n,cas); while(is_ok()=1&cas=10&is_ok()=1) printf(不收敛n); else printf(精度限制为%.10lf,已得到结果n,Limit); GetAns(); CalFlow(); OutPut(); return 0;3、潮流计算读入数据及结果1读入数据 存于data.txt中9 91 0 1.04 02 2 1.63 1.0253 2 0.85 1.0254 1 0.0 0.05 1 -1.25 -0.56 1 -0.9 -0.37 1 0.0 0.08 1 -1.0 -0.359 1 0.0 0.01 1 1 4 0.0 0.058 1.12 1 2 7 0.0 0.063 1.053 1 3 9 0.0 0.059 1.14 2 7 8 0.019 0.072 0.0755 2 8 9 0.012 0.101 0.1056 2 5 7 0.032 0.161 0.1537 2 6 9 0.039 0.170 0.1798 2 4 5 0.010 0.085 0.0889 2 4 6 0.017 0.092 0.0792生成导纳矩阵:存于YMatrix.txt中0.000 -17.2410.000 0.0000.000 0.0000.000 15.6740.000 0.0000.000 0.0000.000 0.0000.000 0.0000.000 0.0000.000 0.0000.000 -15.8730.000 0.0000.000 0.0000.000 0.0000.000 0.0000.000 15.1170.000 0.0000.000 0.0000.000 0.0000.000 0.0000.000 -16.9490.000 0.0000.000 0.0000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论