《电力系统潮流上机》课程设计报告
院 系:电气与电子工程学院
班 级: 电网1102
学 号: 24
学生姓名:
指导教师:
设计周数: 两周
成 绩:
日期:20##年12月30日
一、课程设计的目的与要求
培养学生的电力系统潮流计算机编程能力,掌握计算机潮流计算的相关知识
二、设计正文(详细内容见附录)
1. 手算
要求应用牛顿-拉夫逊法或P-Q分解法手算求解,要求迭代两次。
节点1为平衡节点,电压,节点2为PQ节点,负荷功率,节点3是PV节点,,两条支路分别为,,对地支路
2. 计算机计算
见电脑
3.思考题
3.1潮流计算的方法有哪些?各有何特点?
答:潮流计算方法主要包括:高斯-赛德尔迭代法、牛顿-拉夫逊迭代法、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.设计的时候对于电力系统整体的知识脉络不是很清晰,编写程序时所定义的变量容易弄混淆,编写的程序产生了较多的错误,经过仔细学习和对每一排程序的排查,找出了产生错误的地方。同时也对潮流计算的过程有了更清楚的认识。
3. 另外一个要注意的就是c++中数组是从0开始的,课本都是从1开始,这个在编程时要十分注 意。
三、课程设计总结或结论
将近两周的潮流计算让我不仅对本学期学习的电力系统有了一个更深刻的认识,而且还巩固了我的编程能力和c++的知识。
刚开始的几天是熟悉C++上机环境,在老师的简单介绍下,温习了接一个简单的方程组,然后学会了简单的文件的输入和输出以及在电脑上显示你的数据。这些都是简单的应用,在后面的程序编写中都是以这个为基础的。幸运的是,老师给出了几个子程序的例子,不但让我们有了一个参照的标准,并且提高了编程的正确率。
元旦过后,正式进入状态,开始大规模编写程序。在课本和老师的指导下,从文件的读入,到形成节点导纳矩阵,都花费了很长时间,在形成雅克比矩阵中,我的程序出现了错误,结果查明是下表没有对应。
最后一部分就是计算线路功率和损耗。这部分老师没有给出例子。但是经过这样一个时间的训练,在课本公式的推导下,我把公式分解成实部和虚部,分别计算。在输入时,还是要十分注意下标的对应。最后部分的编写解释主程序,主要是负责把几个已经编号的子程序调用,还要同时编写控制循环精度和次数的条件。这部分主要是应用Break语句和循环,让迭代过程收敛。
整个程序的验收是通过验证5节点的一个网络和计算一个9节点的网络,最后应该都达到了预期的目的。
通过这次潮流对c++的面向对象编程及其过程有了更深入的了解。对于潮流计算,我更深刻的掌握了牛拉法解潮流方程的方法以及对数学高次多元方程线性化在迭代求解的方法有了更深入的认识。通过这次课程设计,自己动手编写潮流计算的程序,仔细分析了潮流计算各个步骤,理论与实践相结合,对潮流计算的思想和方法以及过程有了更深入的理解。在两周的潮流上机过程中,我完成了程序的编写,掌握了计算机潮流计算的基本方法与步骤,了解了计算机潮流计算的优点与重要性。
潮流计算最关键的是进行C++语言的编程,没有良好的C++语言基础很难快速地编出潮流计算程序,编写时需要注意循环和嵌套的使用,我在编写的过程中由于循环没有用好以及粗心等原因,导致多次编出来的程序出现错误,这在潮流计算中都是不应该出现的。另外一个要注意的就是c++中数组是从0开始的,课本都是从1开始,这个在编程时要十分注意。
总之,潮流计算设计是一个及时巩固c++编程和电力系统基础知识的良好手段。
四、参考文献
1. 《电力系统计算:电子数字计算机的应用》,西安交通大学等合编。北京:水利电力出版社;
2. 《现代电力系统分析》,王锡凡主编,科学出版社;
3. 《电力系统稳态分析》,陈珩,中国电力出版社,1995年,第三版;
附录(设计流程图、程序、表格、数据等)
#include "stdafx.h"
#include "fstream"
#include "iostream"
#include "DataFormm.h"
#include "NEquation.h"
#include "math.h"
using namespace System;
using namespace std;
#define PI 3.1415926
void DataRead();
void FormY();
void VoltageInitial();
void SetUnbalance();
void FormJacobi();
void GetRevised();
void GetNewVoltageValue();
void BusBalance();
void BranchPQ();
void BranceLoss();
int main(array ^args) //主程序
{
int k,flag;
float mm,DeltaU[2*(BusNum-1)];
DataRead();
FormY();
VoltageInitial();
for(k=0;k<100;k++)
{
SetUnbalance();
FormJacobi();
GetRevised();
GetNewVoltageValue();
mm=fabs(DeltaU[0]);
for(int i=1;i<2*(BusNum-1);i++)
{
if(mm
{
mm=fabs(DeltaU[i]);
}
}
if(mm
break;
}
cout<
BusBalance();
BranchPQ();
BranceLoss();
Console::WriteLine(L"Hello World");
return 0;
}
void DataRead() //节点、支路数据读入子程序
{ ifstream infile1;
infile1.open("BranchData2.txt");
for(int i=0;i
infile1>>Branch[i].Num>>Branch[i].BusFirst>>Branch[i].BusEnd>>Branch[i].R>>Branch[i].X>>Branch[i].B>>Branch[i].K;
infile1.close();
ifstream infile2;
infile2.open("BusData2.txt");
for(int i=0;i
infile2>>Bus[i].Num>>Bus[i].BusType>>Bus[i].Voltage>>Bus[i].Phase>>Bus[i].Pg>>Bus[i].Qg>>Bus[i].Pl>>Bus[i].Ql;
infile2.close();
}
void FormY() //形成节点导纳矩阵子程序
{
for(int i=0;i
{ for(int j=0;j
{ G[i][j]=0;
B[i][j]=0;
}
}
int m,n;//设置两个变量分别存储之路手摸节点的编号
for(int i=0;i
{
float GG,BB,B0,G1,G2,B1,B2;
m=Branch[i].BusFirst-1;//减是因为数组下标从开始,节点号从开始
n=Branch[i].BusEnd-1;
//以下为变压器变比不唯
Branch[i].R=Branch[i].K*Branch[i].R;
Branch[i].X=Branch[i].K*Branch[i].X;
//将变压器变比引起的对地之路转换成电(=@__@=)哪里?
G1=(1-Branch[i].K)/(Branch[i].K*Branch[i].K)/(Branch[i].R*Branch[i].R+Branch[i].X*Branch[i].X)*Branch[i].R;
B1=-(1-Branch[i].K)/(Branch[i].K*Branch[i].K)/(Branch[i].R*Branch[i].R+Branch[i].X*Branch[i].X)*Branch[i].X;
//将变压器变比引起的对地之路换成daona,末端
G2=(Branch[i].K-1)/Branch[i].K/(Branch[i].R*Branch[i].R+Branch[i].X*Branch[i].X)*Branch[i].R;
B2=-(Branch[i].K-1)/Branch[i].K/(Branch[i].R*Branch[i].R+Branch[i].X*Branch[i].X)*Branch[i].X;
//变压器非标准变比处理完毕
GG=Branch[i].R/(Branch[i].R*Branch[i].R+Branch[i].X*Branch[i].X);
BB=-Branch[i].X/(Branch[i].R*Branch[i].R+Branch[i].X*Branch[i].X);
B0=Branch[i].B;//接地数据
G[m][m]+=GG+G1;
G[m][n]-=GG;
G[n][m]-=GG;
G[n][n]+=GG+G2;
B[m][m]+=BB+B0+B1;
B[m][n]-=BB;
B[n][m]-=BB;
B[n][n]+=BB+B0+B2;
}
ofstream outfile1("resultY2.txt");
for(int i=0;i
{ for(int j=0;j
{outfile1<
outfile1<
}
outfile1.close();
}
void VoltageInitial() //设置节点电压子程序
{
for(int i=0;i
{
if(Bus[i].BusType==3)
{Ue[i]=1.04;
Uf[i]=0.0;
}
else
{Ue[i]=1.0;
Uf[i]=0.0;
}
cout<
}
}
void SetUnbalance() //计算功率不平衡量子程序
{
for(int i=1;i
{ P[i]=0;
Q[i]=0;
for(int j=0;j
{ P[i]=P[i]+Ue[i]*(G[i][j]*Ue[j]-B[i][j]*Uf[j])+Uf[i]*(G[i][j]*Uf[j]+B[i][j]*Ue[j]);
Q[i]=Q[i]+Uf[i]*(G[i][j]*Ue[j]-B[i][j]*Uf[j])-Ue[i]*(G[i][j]*Uf[j]+B[i][j]*Ue[j]);
}
//cout<
if(Bus[i].BusType==1) //PQ
{ DeltaP[i]=Bus[i].Pg-Bus[i].Pl-P[i];
DeltaQU2[i]=Bus[i].Qg-Bus[i].Ql-Q[i];
}
else if(Bus[i].BusType==2) //PV
{ DeltaP[i]=Bus[i].Pg-Bus[i].Pl-P[i];
DeltaQU2[i]=Bus[i].Voltage*Bus[i].Voltage-(Ue[i]*Ue[i]+Uf[i]*Uf[i]);
}
}
for(int i=0;i
{ Delta[2*i]=DeltaP[i+1];
Delta[2*i+1]=DeltaQU2[i+1];
} //形成delta值
ofstream outfile2("Delta2.txt");
for(int j=0;j<2*(BusNum-1);j++)
{ outfile2<
outfile2.close();
}
void FormJacobi() //形成雅各比矩阵子程序
{float H[BusNum-1][BusNum-1],N[BusNum-1][BusNum-1],J[BusNum-1][BusNum-1],L[BusNum-1][BusNum-1];
float a[BusNum],b[BusNum];
for(int i=1;i
{a[i]=G[i][i]*Ue[i]-B[i][i]*Uf[i];
b[i]=G[i][i]*Uf[i]+B[i][i]*Ue[i];
for(int j=0;j
{ if(j!=i)
{a[i]=a[i]+(G[i][j]*Ue[j]-B[i][j]*Uf[j]);
b[i]=b[i]+(G[i][j]*Uf[j]+B[i][j]*Ue[j]);
}
}
}
for(int i=1;i
{
for(int j=1;j
{ if(i==j)
{ H[i][i]=-B[i][i]*Ue[i]+G[i][i]*Uf[i]+b[i];
N[i][i]=G[i][i]*Ue[i]+B[i][i]*Uf[i]+a[i];
if(Bus[i].BusType==1)
{ J[i][i]=-G[i][i]*Ue[i]-B[i][i]*Uf[i]+a[i];
L[i][i]=-B[i][i]*Ue[i]+G[i][i]*Uf[i]-b[i];
}
else if(Bus[i].BusType==2)
{ J[i][i]=2*Uf[i];
L[i][i]=2*Ue[i];
}
}
else if(i!=j)
{ H[i][j]=-B[i][j]*Ue[i]+G[i][j]*Uf[i];
N[i][j]=G[i][j]*Ue[i]+B[i][j]*Uf[i];
if(Bus[i].BusType==1)
{ J[i][j]=-G[i][j]*Ue[i]-B[i][j]*Uf[i];
L[i][j]=-B[i][j]*Ue[i]+G[i][j]*Uf[i];
}
else if(Bus[i].BusType==2)
{ J[i][j]=0;
L[i][j]=0;
}
}
}
}
for(int i=0;i
{ for(int j=0;j
{ Jacobi[2*i][2*j]=H[i+1][j+1];
Jacobi[2*i][2*j+1]=N[i+1][j+1];
Jacobi[2*i+1][2*j]=J[i+1][j+1];
Jacobi[2*i+1][2*j+1]=L[i+1][j+1];
}
}
ofstream outfile4;
outfile4.open("Jacobi2.txt");
for(int i=0;i<2*(BusNum-1);i++)
{
for(int j=0;j<2*(BusNum-1);j++)
{
outfile4<
}
outfile4<
}
outfile4.close();
}
void GetRevised() //求解修正方程得到电压增量子程序
{
NEquation Object;//建立一个对象
Object.SetSize(2*(BusNum-1));//设置矩阵的维数
ifstream infile1;
infile1.open("Jacobi2.txt");
for(int i=0;i<2*(BusNum-1);i++)
{ for(int j=0;j<2*(BusNum-1);j++)
{ Object.Data(i,j)=Jacobi[i][j];
infile1>>Object.Data(i,j);
}
}
infile1.close();
ifstream infile2;
infile2.open("Delta2.txt");
for(int i=0;i<2*(BusNum-1);i++)
infile2>>Object.Value(i);
infile2.close();
Object.Run();
for(int i=0;i<(BusNum-1);i++)
{ //DeltaU[i]=Object.Value(i);
DeltaUf[i]=Object.Value(2*i);
DeltaUe[i]=Object.Value(2*i+1);
DeltaU[2*i]=DeltaUf[i];
DeltaU[2*i+1]=DeltaUe[i];
}//结果输出
ofstream outfile5("revised equation2.txt");
for(int j=0;j<2*(BusNum-1);j++)
{ outfile5<
outfile5.close();
}
void GetNewVoltageValue() //得到新的电压子程序
{
for(int i=0;i
//if(Bus[i].BusType!=3)
{Ue[i+1]+=DeltaUe[i];
Uf[i+1]+=DeltaUf[i];
}
ofstream outfile6("new voltage value2.txt");
for(int i=0;i
{ //if(Bus[i].BusType==1||Bus[i].BusType==2)
outfile6<
}
outfile6.close();
}
void BusBalance() //计算平衡节点功率子程序
{
for(int i=0;i
{
if(Bus[i].BusType==3)
{
P[i]=0.0;
Q[i]=0.0;
for(int j=0;j
{
P[i]+=Ue[i]*(G[i][j]*Ue[j]-B[i][j]*Uf[j])+Uf[i]*(G[i][j]*Uf[j]+B[i][j]*Ue[j]);//有功
Q[i]+=Uf[i]*(G[i][j]*Ue[j]-B[i][j]*Uf[j])-Ue[i]*(G[i][j]*Uf[j]+B[i][j]*Ue[j]);//无功
}
}
}
ofstream outfile7("BusBalance2.txt");
for(int i=0;i
if(Bus[i].BusType==3)
{ outfile7<
outfile7.close();
}
void BranchPQ() //计算支路功率子程序
{ float B0;
for(int i=0;i
{
for(int j=0;j
{
if(i!=j&(G[i][j])!=0&(B[i][j])!=0)
{B0=Branch[i].B;
BranchP[i][j]=Ue[i]*(-Uf[i]*B0+Ue[i]*0+(Ue[i]-Ue[j])*G[i][j]-(Uf[i]-Uf[j])*B[i][j])+Uf[i]*(Ue[i]*B0+Uf[i]*0+(Ue[i]-Ue[j])*B[i][j]+(Uf[i]-Uf[j])*G[i][j]);
BranchQ[i][j]=Uf[i]*(-Uf[i]*B0+Ue[i]*0+(Ue[i]-Ue[j])*G[i][j]-(Uf[i]-Uf[j])*B[i][j])-Ue[i]*(Ue[i]*B0+Uf[i]*0+(Ue[i]-Ue[j])*B[i][j]+(Uf[i]-Uf[j])*G[i][j]);
BranchP[j][i]=Ue[j]*(-Uf[j]*B0+Ue[j]*0+(Ue[j]-Ue[i])*G[j][i]-(Uf[j]-Uf[i])*B[j][i])+Uf[j]*(Ue[j]*B0+Uf[j]*0+(Ue[j]-Ue[i])*B[j][i]+(Uf[j]-Uf[i])*G[j][i]);
BranchQ[j][i]=Uf[j]*(-Uf[j]*B0+Ue[j]*0+(Ue[j]-Ue[i])*G[j][i]-(Uf[j]-Uf[i])*B[j][i])-Ue[j]*(Ue[j]*B0+Uf[j]*0+(Ue[j]-Ue[i])*B[j][i]+(Uf[j]-Uf[i])*G[j][i]);
}
}
}
ofstream outfile8("BranchPQ2.txt");
for(int i=0;i
{ for(int j=0;j
//if(i!=j&(G[i][j])!=0&(B[i][j])!=0)
{ outfile8<
}
outfile8<
}
outfile8.close();
}
void BranceLoss() //计算线路上损耗子程序
{ float LossP[BusNum][BusNum],LossQ[BusNum][BusNum],LossPP,LossQQ;
LossPP=0;
LossQQ=0;
for(int i=0;i
{
for(int j=0;j
{
if(i!=j&(G[i][j])!=0&(B[i][j])!=0)
{
LossP[i][j]=BranchP[i][j]+BranchP[j][i];
LossQ[i][j]=BranchQ[i][j]+BranchQ[j][i];
}
}
}
for(int i=0;i
for(int j=0;j
{
if(i!=j&(G[i][j])!=0&(B[i][j])!=0)
{LossPP+=LossP[i][j];
LossQQ+=LossQ[i][j];
}
}
ofstream outfile9("BranchLoss2.txt");
{ outfile9<<0.5*LossPP<<"\t "<<0.5*LossQQ<
outfile9.close();
}