潮流计算上机报告 华电.docx
《潮流计算上机报告 华电.docx》由会员分享,可在线阅读,更多相关《潮流计算上机报告 华电.docx(27页珍藏版)》请在冰点文库上搜索。
潮流计算上机报告华电
《电力系统潮流上机》课程设计报告
院系:
电气与电子工程学院
班级:
学号:
学生姓名:
指导教师:
刘宝柱
设计周数:
两周
成绩:
日期:
2012年1月5日
一、课程设计的目的与要求
培养学生的电力系统潮流计算机编程能力,掌握计算机潮流计算的相关知识
二、设计正文(详细内容见附录)
1.手算:
要求应用牛顿-拉夫逊法或P-Q分解法手算求解,要求精度为0.001MW。
节点1为平衡节点,电压
,节点2为PQ节点,负荷功率
,节点3是PV节点,
,两条支路分别为
,
,对地支路
。
2.计算机计算
1.导纳阵
Y(1,1)=(1.01534,-8.19201)
Y(1,2)=(-0.56148,2.30208)
Y(1,3)=(0.00000,3.66667)
Y(1,4)=(-0.45386,1.89107)
Y(2,1)=(-0.56148,2.30208)
Y(2,2)=(1.04225,-4.67651)
Y(2,4)=(-0.48077,2.40385)
Y(3,1)=(0.00000,3.66667)
Y(3,3)=(0.00000,-3.33333)
Y(4,1)=(-0.45386,1.89107)
Y(4,2)=(-0.48077,2.40385)
Y(4,4)=(0.93463,-4.26159)
2.设定电压初值
3.计算功率和电压偏移;
同理可算出
4.根据求的第一次迭代时雅可比矩阵各元素的公式计算雅可比矩阵各个元素的具体值:
5.求高斯计算后的修正量:
6.计算各节点电压的一次近似值:
返回第三步重新迭代,并校验收敛与否,令
。
经过四次迭代后,收敛条件满足,停止迭代,求出的电压终值:
7.计算出平衡节点4的注入功率。
8.各节点间功率
9.网损为:
10.网损效率为:
2.05896%
3.思考题
3.1潮流计算的方法有哪些?
各有何特点?
答:
潮流计算方法主要包括:
高斯-赛德尔迭代法、牛顿-拉夫逊迭代法、P-Q分解法等算法。
各方法特点如下所示:
方法
高斯-赛德尔法
牛顿-拉夫逊迭代法
P-Q分解法
初值要求
不高
高
高
迭代次数
多
少
多
收敛速度
慢
较快
最快
精度
一样
一样
一样
应用
早期应用多,现在较少
广泛应用
应用较多
3.2如果交给你一个任务,请你用已有的潮流计算软件计算北京城市电网的潮流,你应该做哪些工作?
(收集哪些数据,如何整理,计算结果如何分析)
答:
1.所需要收集的数据:
A.电网中所有节点的数据:
a.各节点的类型,包括平衡节点、PV节点、PQ节点
b.对于平衡节点要了解节点的电压大小相位、及节点所能提供的最大最小有功无功功率
c.PV节点要知道节点电压大小注入有功功率及节点所能提供的最大和最小无功功.率
d.PQ节点要知道节点的注入有功和无功功率
B.电网中所有支路的数据:
a.各支路类型,即是否含有变压器
b.各支路的电阻、电感、电纳
c.各变压器的变比。
2.数据整理:
将上述数据资料进行分类整理,并为每个节点及支路编上编号。
将整理的结果写成本实验中所要求的格式(原始数据的txt文档),再用本实验所编制的程序进行求解,得到各节点电压、相位,各线路传输功率、损耗,平衡节点注入功率等数值。
3.计算结果分析:
可以大致了解整个电网的运行状况并按照电力系统知识依次进行所需的调整。
如调节各节点电压的大小以防止超出规定限度,调整各线路的有功无功分布状况分析整个系统的网损是否达到标准等。
3.3设计中遇到的问题和解决的办法。
1.在设计最开始遇到的问题就是由于以前C语言所学习的知识遗忘较多,对于程序的使用不太熟练,通过老师讲解、看书、询问同学逐渐扫除了这个障碍。
2.设计的时候对于电力系统整体的知识脉络不是很清晰,编写程序时所定义的变量容易弄混淆,编写的程序产生了较多的错误,经过仔细学习和对每一排程序的排查,找出了产生错误的地方。
同时也对潮流计算的过程有了更清楚的认识。
三、课程设计总结或结论
该门课程的主要目的是培养学生的电力系统潮流计算机编程能力,掌握计算机潮流计算的相关知识。
潮流计算是电力系统非常重要的分析计算,是电力系统最基本的计算,主要用以研究系统规划和运行中提出的各种问题。
现代电力系统潮流就算过程比较复杂,手算有很大的困难,而计算机作为一种处理数据的工具,具有计算速度快,准确率高的优点,因此现在电力系统的潮流大多也都采用计算机的算法求解。
对于写程序而言,C语言是一种简单但很实用的语言,利用C语言编程实现潮流计算不仅简单易行,而且还能加深对电力系统潮流这一物理感念的理解。
通过这次潮流对c++的面向对象编程及其过程有了更深入的了解。
对于潮流计算,我更深刻的掌握了牛拉法解潮流方程的方法以及对数学高次多元方程线性化在迭代求解的方法有了更深入的认识。
通过这次课程设计,自己动手编写潮流计算的程序,仔细分析了潮流计算各个步骤,理论与实践相结合,对潮流计算的思想和方法以及过程有了更深入的理解。
在这两周的学习里,我不仅对C语言的学习有了更深层次的理解,还对自己在《电力系统分析》这门课程里所学到的知识进行了查缺补漏,对电力系统的运行分析等有了更加深入的了解,受益匪浅。
四、参考文献
1.《电力系统计算:
电子数字计算机的应用》,西安交通大学等合编。
北京:
水利电力出版社;
2.《现代电力系统分析》,王锡凡主编,科学出版社;
3.《电力系统稳态分析》,陈珩,中国电力出版社,1995年,第二版;
附录(设计流程图、程序、表格、数据等)
1.设计流程图:
2.程序设计:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"math.h"
#defineNBUS5
#defineNLINE7
/*Globalvariables*/
intnL,nSH,nBUS,nVA;
doubled,t;
intL;
structLine
{
intNum,NumI,NumJ;
doubleR;
doubleX;
doubleB;
doubleK;
};
structBus
{
intNum;
doubleVolt,Phase,GenP,GenQ,LoadP,LoadQ;
intType;
};
structShunt
{
intNum,NumI;
doubleG,B;
};
voidmain()
{
FILE*fp;
FILE*fpout;
inti,j,k,l,h,c;
inti1,i2,i3,kp,kq,LH[100];
doubled,d1,d2,d3,d4,d5,d6,t,r,x,g,b,tt,LL,e,ps,qs,shsh,sum,w;
structLinesL[NLINE];
structBussBus[NBUS];
structShuntsSH[NBUS];
doubleYG[NBUS][NBUS],YB[NBUS][NBUS];
doubleV[100][2],U[100],dPQ[100],PQ[100][2],JJ[100][100]={0},H[100][100],J[100][100],N[100][100],L[100][100],sP[NBUS][NBUS]={0},sQ[NBUS][NBUS]={0},dsp,dsq,sumgen,dp;
i1=i2=i3=0;
d1=d2=d3=d4=d5=d6=ps=qs=0.0;
e=0.00001;
for(i=0;i/*Readtheinputdata*/
if((fp=fopen("data.txt","r"))==NULL)
{printf("Cannotopenthefilenamed'in.txt'\n");
exit(0);
}
fscanf(fp,"%d,%d,%d",&nBUS,&nL,&nSH);
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;isL[i].Num=sL[i].NumI=sL[i].NumJ=0;
sL[i].R=sL[i].X=sL[i].B=0.0;sL[i].K=1.0;
fscanf(fp,"%2d%3d%3d%lf%lf%lf%lf",&i1,&i2,&i3,&d1,&d2,&d3,&d4);
sL[i].Num=i1;sL[i].NumI=i2;sL[i].NumJ=i3;sL[i].R=d1;sL[i].X=d2;sL[i].B=d3;sL[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);
/*MakeYMatrix*/
for(i=1;iYG[i][j]=0.0;
YB[i][j]=0.0;
};
for(l=0;l{
i=sL[l].NumI;
j=sL[l].NumJ;
r=sL[l].R;
x=sL[l].X;
d1=r*r+x*x;
g=r/d1;
b=-x/d1;
if(fabs(sL[l].K-1.0)<0.000001)
{/*Normallinesortransformers*/
YG[i][i]=YG[i][i]+g;
YG[j][j]=YG[j][j]+g;
YB[i][i]=YB[i][i]+b+sL[l].B;
YB[j][j]=YB[j][j]+b+sL[l].B;
YG[i][j]=YG[i][j]-g;
YG[j][i]=YG[j][i]-g;
YB[i][j]=YB[i][j]-b;
YB[j][i]=YB[j][i]-b;
}
else
{/*abnormaltransformerratio*/
if(fabs(sL[l].B)>0.000001)
{
YG[i][i]=YG[i][i]+g/sL[l].B/sL[l].B;
YB[i][i]=YB[i][i]+b/sL[l].B/sL[l].B;
YG[j][j]=YG[j][j]+g;
YB[j][j]=YB[j][j]+b;
YG[i][j]=YG[i][j]-g/sL[l].B;
YG[j][i]=YG[j][i]-g/sL[l].B;
YB[i][j]=YB[i][j]-b/sL[l].B;
YB[j][i]=YB[j][i]-b/sL[l].B;
}
else
printf("节点%2d,%-2d之间变压器变比为0\n",i,j);
}
}
//ChecktheYmatrix
if((fp=fopen("GGBB.txt","w"))==NULL){
printf("Cannotopenthefilenamed'GGBB.txt'\n");exit(0);}
fprintf(fp,"---YMatrix---\n");
for(i=1;i0.000001)
fprintf(fp,"Y(%3d,%-3d)=(%10.5f,%10.5f)\n",i,j,YG[i][j],YB[i][j]);
if(fp!
=NULL)fclose(fp);
/*设定电压初值*/
for(i=1;iif(sBus[i-1].Type==0)
{
V[i][0]=0.0;
V[i][1]=1.0;
}
for(i=1;iif(sBus[i-1].Type==1)
{
V[i][1]=sBus[i-1].Volt;
V[i][0]=0.0;
}
for(i=1;iif(sBus[i-1].Type==2)
{
V[i][1]=sBus[i-1].Volt;
V[i][0]=sBus[i-1].Phase;
}
/*输出电压初值
if((fp=fopen("d:
\\lx\\电压初值.txt","w"))==NULL)
{
printf("Cannotopenthefilenamed'电压初值.txt'\n");
exit(0);
}
fprintf(fp,"---电压初值---\n");
for(i=1;ifor(j=1;j<2;j++)
fprintf(fp,"Y(%2d)=(%10.5f,%10.5f)\n",i,V[i][0],V[i][1]);
if(fp!
=NULL)fclose(fp);*/
for(c=1;;c++)
{
/*计算偏移量*/
for(i=1;i{
if(sBus[i-1].Type!
=2)
{
PQ[i][0]=0;
PQ[i][1]=0;
for(j=1;j{
PQ[i][0]-=V[i][1]*V[j][1]*(YG[i][j]*cos(V[i][0]-V[j][0])+YB[i][j]*sin(V[i][0]-V[j][0]));
PQ[i][1]-=V[i][1]*V[j][1]*(YG[i][j]*sin(V[i][0]-V[j][0])-YB[i][j]*cos(V[i][0]-V[j][0]));
}
}
}
h=1;
for(i=1;i{
if(sBus[i-1].Type==0)
{
dPQ[h]=PQ[i][0]+sBus[i-1].GenP-sBus[i-1].LoadP;
h++;
dPQ[h]=PQ[i][1]+sBus[i-1].GenQ-sBus[i-1].LoadQ;
h++;
}
if(sBus[i-1].Type==1)
{
dPQ[h]=PQ[i][0]+sBus[i-1].GenP-sBus[i-1].LoadP;
h++;
}
}
/*输出偏移量
if((fp=fopen("d:
\\lx\\偏移量.txt","w"))==NULL)
{
printf("Cannotopenthefilenamed'偏移量.txt'\n");
exit(0);
}
fprintf(fp,"---偏移量---\n");
for(i=1;ifprintf(fp,"dPQ(%2d)=(%10.5f)\n",i,dPQ[i]);
if(fp!
=NULL)fclose(fp);*/
/*计算雅克比矩阵*/
for(i=1;i{
for(j=1;j{
if(i==j)
{
H[i][j]=PQ[i][1]-V[i][1]*V[i][1]*YB[i][j];
J[i][j]=-PQ[i][0]-V[i][1]*V[i][1]*YG[i][j];
N[i][j]=-PQ[i][0]+V[i][1]*V[i][1]*YG[i][j];
L[i][j]=-PQ[i][1]-V[i][1]*V[i][1]*YB[i][j];
}
else
{
H[i][j]=V[i][1]*V[j][1]*(YG[i][j]*sin(V[i][0]-V[j][0])-YB[i][j]*cos(V[i][0]-V[j][0]));
J[i][j]=-V[i][1]*V[j][1]*(YG[i][j]*cos(V[i][0]-V[j][0])+YB[i][j]*sin(V[i][0]-V[j][0]));
N[i][j]=V[i][1]*V[j][1]*(YG[i][j]*cos(V[i][0]-V[j][0])+YB[i][j]*sin(V[i][0]-V[j][0]));
L[i][j]=V[i][1]*V[j][1]*(YG[i][j]*sin(V[i][0]-V[j][0])-YB[i][j]*cos(V[i][0]-V[j][0]));
}
}
}
h=1;
for(i=1;i{
l=1;
if(sBus[i-1].Type==0)
{
for(j=1;j{
if(sBus[j-1].Type==0)
{
JJ[h][l]=H[i][j];
l++;
JJ[h][l]=N[i][j];
l++;
}
if(sBus[j-1].Type==1)
{
JJ[h][l]=H[i][j];
l++;
}
}
h++;
l=1;
for(j=1;j{
if(sBus[j-1].Type==0)
{
JJ[h][l]=J[i][j];
l++;
JJ[h][l]=L[i][j];
l++;
}
if(sBus[j-1].Type==1)
{
JJ[h][l]=J[i][j];
l++;
}
}
h++;
}
if(sBus[i-1].Type==1)
{
for(j=1;j{
if(sBus[j-1].Type==0)
{
JJ[h][l]=H[i][j];
l++;
JJ[h][l]=N[i][j];
l++;
}
if(sBus[j-1].Type==1)
{
JJ[h][l]=H[i][j];
l++;
}
}
h++;
}
}
/*输出雅克比矩阵
if((fp=fopen("d:
\\lx\\雅克比矩阵.txt","w"))==NULL)
{
printf("Cannotopenthefilenamed'雅克比矩阵.txt'\n");
exit(0);
}
fprintf(fp,"---雅克比矩阵---\n");
fprintf(fp,"");
for(i=1;i{
fprintf(fp,"%d\t\t",i);
}
fprintf(fp,"\n");*/
for(i=1;i{
fprintf(fp,"%2d",i);
for(j=1;j{
fprintf(fp,"%10.5f\t",JJ[i][j]);
}
fprintf(fp,"\n");
}
if(fp!
=NULL)fclose(fp);
/*高斯法求解方程组*/
l=1;
for(i=1;i{
LH[i]=0;
}
for(k=1;k{
d=0.0;
for(j=k;j{
if(fabs(JJ[k][j])>d)
{
d=fabs(JJ[k][j]);/*在一行中找到一个最大值赋值d,并用JS[K]记住这个最大值所在的列号*/
LH[k]=j;
}
}
if(fabs(d)<0.000001)/*如果d的数值太小,做为被除数将带来很大的误差*/
{
l=0;
}
elseif(LH[k]!
=k)
{
for(i=1;i{
t=JJ[i][k];
JJ[i][k]=JJ[i][LH[k]];/*进行列交换,让最大值始终在对角元上*/
JJ[i][LH[k]]=t;
}
}
if(l==0)
{
break;
}
for(j=k+1;j{
JJ[k][j]=JJ[k][j]/JJ[k][k];/*对角元上的元素消为1*/
}
dPQ[k]=dPQ[k]/JJ[k][k];
for(i=k+1;i{
for(j=k+1;j{
JJ[i][j]=JJ[i][j]-JJ[i][k]*JJ[k][j];/*使下三角阵的元素为0*/
}
dPQ[i]=dPQ[i]-JJ[i][k]*dPQ[k];
}
}
if(fabs(JJ[h-1][h-1])>0.00001)
{/*用追赶法,解方程组,求未知数x*/
U[h-1]=dPQ[h-1];
for(i=h-2;i>=0;i--)
{
t=0.0;
for(j=i+1;j