潮流计算课程设计.docx
《潮流计算课程设计.docx》由会员分享,可在线阅读,更多相关《潮流计算课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
潮流计算课程设计
1摘要…………………………………………………………………………………………………1
2任务及要求………………………………………………………………………………………2
3设计原理……………………………………………………………………………………3
4计算过程与步骤………………………………………………………………………………4
4.1主程序设计……………………………………………………………………4
4.2原始数据输入……………………………………………………………………20
5运行计算结果…………………………………………………………………………21
6小结………………………………………………………………………………………22
7参考文献……………………………………………………………………………………23
摘要
电力系统稳态分析包括潮流计算(或潮流分析)和静态安全分析。
潮流计算针对电力革统各正常运行方式,而静态安全分析则要研究各种运行方式下个别系统元件退出运行后系统的状况。
其目的是校验系统是否能安全运行,即是否有过负荷的元件或电压过低的母线等。
原则上讲,静态安全分析也可U用潮流计算来代替。
但是一般静态安全分析需要校验的状态数非常多,用严格的潮流计算来分析这些状态往往计算量过大,因此不得不寻求一些特殊的算法以满足要求。
利用电子数字计算机进行电力系统潮流计算从20世纪50年代中期就己开始,此后,潮流计算曾采用了各种不同的方法,这些方法的发展主要是围绕着对潮流计算的一些基本要求进行的,对潮流计算的要求可以归纳为下面几点:
(1)计算方法的可靠性或收敛性;
(2)对计算速度和内存量的要求;
(3)计算的方便性和灵活性。
电力系统潮流计算中,传统存储稀疏导纳阵一般采用静态数组的方式。
比如可以用两个数组GII[N],BII[N]来存放对角元素的实部和虚部,用YDZ[N]数组来存放各行非对角元素首元素在所有的非对角元素中所处的位置,用YDS[N]数组来存放导纳矩阵各行非对角元素的个数,每个数组所占的单元与系统的节点数相等。
在定义Y[L][3]数组来存储非对角元素,L为支路总条数,分别存储非对角元素的实部,虚部和列号。
这样存储的好处是:
取用导纳阵比较直观,而且可以节省存储空间。
关键字:
电力系统分析潮流计算计算机导纳矩阵
2任务及要求
编程计算潮流
节点数:
3支路数:
3计算精度:
0.00010
支路1:
0.0300+j0.0900
1┠—————□—————┨2
支路2:
0.0200+j0.0900
2┠—————□—————┨3
支路3:
0.0300+j0.0900
3┠—————□—————┨1
节点1:
PQ节点,S
(1)=-0.5000-j0.2000
节点2:
PQ节点,S
(2)=-0.6000-j0.2500
节点3:
平衡节点,U(3)=1.0000∠0.0000
计算在达到精度的条件下:
各节点电压
平衡节点功率
输电线路功率
输电线路上损耗的功率
网络总损耗
3设计原理
本文采用了P—Q分解法进行潮流计算。
其P—Q分解法潮流计算流程框图如图3.1所示。
图3.1P—Q分解法潮流计算流程框图
4计算过程与步骤
4.1主程序设计
#include
#include
#defineM50/*矩阵阶数*/
inti,j,k,l,z;/*循环变量*/
intn,/*节点数*/
m,/*支路数*/
dd,/*对地支路数*/
pq,/*PQ节点数*/
pv,/*PV节点数*/
byqn,/*变压器数*/
number,
ii,
ll=1,
li=1;
floateps,/*精度*/
max1,max2;
staticfloatG[M][M],B[M][M],
D1[M],D2[M],yue[M][M],xing[M][M];
structjiedian/*节点结构体*/
{intnum,s;/*num为节点号,s为节点类型*/
floatp,q,e,f,v;
}jiedian[M];
structzhilu/*支路结构体*/
{intnum;
intp1,p2;/*支路的两个节点*/
floatr,x;/*支路的电阻与电抗*/
}zhilu[M];
structbyq
{intnum,
p1,
p2;
floatr,x,s,k;
}byq[M];
FILE*fp1,*fp2;
voiddata1()/*读取数据*/
{inth,numb;
fp1=fopen("input.txt","r");
if(fp1==NULL)
{printf("cannotopenfile!
\n");
printf("在盘内创建一个文件,并命名为input.txt.文件输入内容的格式如下:
.\n");
printf("\n==============================================================\n");
printf("第一行:
节点数,支路数,对地支路数,变压器数,PQ节点数,PV节点数,精度,\n");
printf("换行后输入:
第几个节点,节点类型,有功功率,无功功率,电压值,电压角度\n");
printf("(若是PQ节点则类型是1,电压是自己预置的值;\n");
printf("PV节点类型是2,不用输入无功功率,电压是题目给定的值;\n");
printf("平衡节点类型是3,只需输入电压及其角度。
)\n");
printf("注意每次输入一个节点应该换行。
\n");
printf("\n继续换行输入:
第几条支路,支路类型,支路连接的第一个节点号,支路连接的第二个节点号,支路电阻,支路电抗\n");
printf("注意:
支路没有变压器类型是1,有是2。
若有变压器则还需要输入其变比和容量\n");
printf("\n==============================================================\n");
exit(0);
}
fscanf(fp1,"%d,%d,%d,%d,%d,%d,%f\n",&n,&m,&dd,&byqn,&pq,&pv,&eps);/*输入节点数,支路数,对地支路数,PQ节点数PV节点数和精度*/
j=1;k=pq+1;
for(i=1;i<=n;i++)/*输入节点类型的输入功率和节电电压初值*/
{
fscanf(fp1,"%d,%d",&numb,&h);
if(h==1)/*类型h=1是PQ节点*/
{fscanf(fp1,",%f,%f,%f,%f\n",&jiedian[j].p,&jiedian[j].q,&jiedian[j].e,&jiedian[j].f);
jiedian[j].num=numb;
jiedian[j].s=h;
j++;
}
if(h==2)/*类型h=2是pv节点*/
{fscanf(fp1,",%f,%f,%f\n",&jiedian[k].p,&jiedian[k].v,
&jiedian[k].f);
jiedian[k].num=numb;
jiedian[k].e=jiedian[k].v;
jiedian[k].s=h;
k++;
}
if(h==3)/*类型h=3是平衡节点*/
{fscanf(fp1,",%f,%f\n",&jiedian[n].e,&jiedian[n].f);
jiedian[n].num=numb;
jiedian[n].s=h;
}
}
for(i=1;i<=m+byqn;i++)/*输入支路阻抗*/
{fscanf(fp1,"%d,%d",&number,&ii);
if(ii==1)
{fscanf(fp1,",%d,%d,%f,%f\n",&zhilu[ll].p1,
&zhilu[ll].p2,&zhilu[ll].r,&zhilu[ll].x);
zhilu[ll].num=ll;ll++;}
if(ii==2)/*变压器编号num,所连节点p1,p2,阻抗r,x,变比k,容量s*/
{fscanf(fp1,",%d,%d,%f,%f,%f,%f\n",&byq[li].p1,
&byq[li].p2,&byq[li].r,&byq[li].x,&byq[li].k,&byq[li].s);
byq[li].num=li;li++;}
}
fclose(fp1);
if((fp2=fopen("output.txt","w"))==NULL)
{printf("cannotopenfile!
\n");
exit(0);
}
fprintf(fp2,"\n潮流上机实习华北电力大学电自0804周大千200801000928\n");
fprintf(fp2,"\n**************原始数据**************\n");
fprintf(fp2,"===================================================================\n");
fprintf(fp2,"节点数:
%2d支路数:
%2d对地支路数:
%2d变压器数:
%2dPQ节点数:
%2dPV节点数:
%2d精度:
%.5f\n",
n,m,dd,byqn,pq,pv,eps);
fprintf(fp2,"-------------------------------------------------------------------\n");
for(i=1;i<=pq;i++)
fprintf(fp2,"PQ节点节点%2dP[%d]=%fQ[%d]=%f\n",
jiedian[i].num,jiedian[i].num,jiedian[i].p,jiedian[i].num,jiedian[i].q);
for(i=pq+1;i<=pq+pv;i++)
fprintf(fp2,"PV节点节点%2dP[%d]=%fV[%d]=%f\n",
jiedian[i].num,jiedian[i].num,jiedian[i].p,jiedian[i].num,jiedian[i].v);
fprintf(fp2,"平衡节点节点%2de[%d]=%ff[%d]=%f\n",
jiedian[n].num,jiedian[n].num,jiedian[n].e,jiedian[n].num,jiedian[n].f);
fprintf(fp2,"-------------------------------------------------------------------\n");
for(i=1;i<=m;i++)
fprintf(fp2,"支路%2d相关节点:
%2d,%2dR=%fX=%f\n",
i,zhilu[i].p1,zhilu[i].p2,zhilu[i].r,zhilu[i].x);
for(i=1;i<=byqn;i++)
fprintf(fp2,"变压器编号%2d相关节点:
%2d,%2dR=%fX=%f变比K=%f\n",byq[i].num,
byq[i].p1,byq[i].p2,byq[i].r,byq[i].x,byq[i].k);
fprintf(fp2,"===================================================================\n");
}
voidform_y()/*形成节点导纳矩阵*/
{intbn;
floatS,g,b,g1,b1,g2,b2;
for(i=1;i<=m;i++)
for(i=1;i<=m;i++)
/*对地导纳*/
if((zhilu[i].p1==0)||(zhilu[i].p2==0))
{S=zhilu[i].r*zhilu[i].r+zhilu[i].x*zhilu[i].x;
if(S==0){G[zhilu[i].p1][zhilu[i].p2]=B[zhilu[i].p1][zhilu[i].p2]=G[zhilu[i].p2][zhilu[i].p1]=B[zhilu[i].p2][zhilu[i].p1]=0;continue;}
if(zhilu[i].p1==0)
{G[zhilu[i].p1][zhilu[i].p2]+=zhilu[i].r/S;
B[zhilu[i].p1][zhilu[i].p2]+=-zhilu[i].x/S;
G[zhilu[i].p2][zhilu[i].p1]=G[zhilu[i].p1][zhilu[i].p2];
B[zhilu[i].p2][zhilu[i].p1]=B[zhilu[i].p1][zhilu[i].p2];
}
if(zhilu[i].p2==0)
{G[zhilu[i].p2][zhilu[i].p1]+=zhilu[i].r/S;
B[zhilu[i].p2][zhilu[i].p1]+=-zhilu[i].x/S;
G[zhilu[i].p1][zhilu[i].p2]=G[zhilu[i].p2][zhilu[i].p1];
B[zhilu[i].p1][zhilu[i].p2]=B[zhilu[i].p2][zhilu[i].p1];
}
}
for(i=1;i<=m;i++)/*节点导纳矩阵的主对角线上的导纳*/
for(j=1;j<=n;j++)
if((zhilu[i].p1==j)||(zhilu[i].p2==j))
{S=zhilu[i].r*zhilu[i].r+zhilu[i].x*zhilu[i].x;
if(S==0)continue;
G[j][j]+=zhilu[i].r/S;
B[j][j]+=-zhilu[i].x/S;
}
for(j=1;j<=n;j++)
for(bn=1;bn<=byqn;bn++)
{if(byq[bn].p1==j)
{S=byq[bn].r*byq[bn].r+byq[bn].x*byq[bn].x;
g=byq[bn].r/S;
b=-byq[bn].x/S;
g2=g/byq[bn].k;
b2=b/byq[bn].k;
g1=g*((1-byq[bn].k)/(byq[bn].k*byq[bn].k));
b1=b*((1-byq[bn].k)/(byq[bn].k*byq[bn].k));
G[j][j]=G[j][j]+g2+g1;
B[j][j]=B[j][j]+b2+b1;}
if(byq[bn].p2==j)
{S=byq[bn].r*byq[bn].r+byq[bn].x*byq[bn].x;
g=byq[bn].r/S;
b=-byq[bn].x/S;
g2=g/byq[bn].k;
b2=b/byq[bn].k;
g1=g*(byq[bn].k-1)/byq[bn].k;
b1=b*(byq[bn].k-1)/byq[bn].k;
G[j][j]=G[j][j]+g2+g1;
B[j][j]=B[j][j]+b2+b1;}
}
for(k=1;k<=m;k++)/*节点导纳矩阵非主对角线上的导纳*/
{i=zhilu[k].p1;
j=zhilu[k].p2;
S=zhilu[k].r*zhilu[k].r+zhilu[k].x*zhilu[k].x;
if(S==0)continue;
G[i][j]+=-zhilu[k].r/S;
B[i][j]+=zhilu[k].x/S;
G[j][i]=G[i][j];
B[j][i]=B[i][j];
}
for(bn=1;bn<=byqn;bn++)
{i=byq[bn].p1;j=byq[bn].p2;
S=byq[bn].r*byq[bn].r+byq[bn].x*byq[bn].x;
G[i][j]+=-(byq[bn].r/S)/byq[bn].k;
B[i][j]+=(byq[bn].x/S)/byq[bn].k;
G[j][i]=G[i][j];
B[j][i]=B[i][j];}
/*输出节点导纳矩阵*/
fprintf(fp2,"\n\n*********计算结果*********\n");
fprintf(fp2,"\n节点导纳矩阵为:
");
for(i=1;i<=n;i++)
{fprintf(fp2,"\n");
for(j=1;j<=n;j++)
fprintf(fp2,"%8.5f+j%8.5f",G[i][j],B[i][j]);
}
fprintf(fp2,"\n==============================================================\n");
fprintf(fp2,"\nB'矩阵为:
");
for(i=1;i<=n-1;i++)
{fprintf(fp2,"\n");
for(j=1;j<=n-1;j++)
fprintf(fp2,"%8.5f",B[i][j]);
}
fprintf(fp2,"\n==============================================================\n");
fprintf(fp2,"\nB''矩阵为:
");
for(i=1;i<=pq;i++)
{fprintf(fp2,"\n");
for(j=1;j<=pq;j++)
fprintf(fp2,"%8.5f",B[i][j]);
}
fprintf(fp2,"\n==============================================================\n");
}
voidyueyue()
{
inta,b;
for(a=1;a<=M;a++)
{for(b=1;b<=M;b++)
{yue[a][b]=0;xing[a][b]=0;}
}
for(i=1;i<=pq;i++)
{for(j=1;j<=pq;j++)
xing[i][j]=B[i][j];
}
for(i=1;i<=pq+pv;i++)
{for(j=1;j<=pq+pv;j++)
yue[i][j]=B[i][j];
}
}
voidxingxing()/*形成矩阵方程*/
{floatei,ej,fi,fj;
inti1,j1;
floatdP[M];
for(i=1;i<=pq+pv;i++)/*初始化矩阵*/
{dP[i]=0;
D1[i]=0;
}
for(i=1;i<=pq;i++)/*PQ节点函数残量*/
{ei=jiedian[i].e;
fi=jiedian[i].f;
for(j=1;j<=n;j++)
{i1=jiedian[i].num;
j1=jiedian[j].num;
ej=jiedian[j].e;
fj=jiedian[j].f;
dP[i]+=ej*(G[i1][j1]*cos(fi-fj)+B[i1][j1]*sin(fi-fj));
}
dP[i]=jiedian[i].p-dP[i]*ei;
}
for(i=pq+1;i<=pq+pv;i++)/*PV节点函数残量*/
{ei=jiedian[i].e;
fi=jiedian[i].f;
for(j=1;j<=n;j++)
{i1=jiedian[i].num;
j1=jiedian[j].num;
ej=jiedian[j].e;
fj=jiedian[j].f;
dP[i]+=ej*(G[i1][j1]*cos(fi-fj)+B[i1][j1]*sin(fi-fj));
}
dP[i]=jiedian[i].p-dP[i]*ei;
}
for(i=1;i<=pq+pv;i++)/*形成函数残量矩阵D[M]*/
D1[i]=dP[i]/jiedian[i].e;/*形成^P*/
max1=D1[1];
for(i=2;i<=pq+pv;i++)
if(fabs(D1[i])>fabs(max1))
max1=D1[i];
max1=fabs(max1);
fprintf(fp2,"\n%8.5f\n",max1);
}
voidxingxing1()/*形成矩阵方程*/
{floatei,ej,fi,fj;
inti1,j1;
floatdQ[M];
for(i=1;i<=pq+pv;i++)/*初始化矩阵*/
{
dQ[i]=0;
D2[i]=0;
}
for(i=1;i<=pq;i++)/*PQ节点函数残量*/
{ei=jiedian[i].e;
fi=jiedian[i].f;
for(j=1;j<=n;j++)
{i1=jiedian[i].num;
j1=jiedian[j].num;
ej=jiedian[j].e;
fj=jiedian[j].f;
dQ[i]+=ej*(G[i1][j1]*sin(fi-fj)-B[i1][j1]*cos(fi-fj));
}
dQ[i]=jiedian[i].q-dQ[i]*ei;
}
for(i=1;i<=pq;i++)
D2[i]=dQ[i]/jiedian[i].e;/*形成^Q*/
max2=D2[1];
for(i=2;i<=pq;i++)
if(fabs(D2[i])>fabs(max2))
max2=D2[i];
max2=fabs(max2);
fprintf(fp2,"\n%8.5f\n",max2);
}
voidhua()
{
intc,d;
for(c=1;c<=pq+pv;c++)
yue[c][pq+pv+1]=D1[c]