潮流计算代码c++.docx
《潮流计算代码c++.docx》由会员分享,可在线阅读,更多相关《潮流计算代码c++.docx(38页珍藏版)》请在冰豆网上搜索。
![潮流计算代码c++.docx](https://file1.bdocx.com/fileroot1/2023-1/4/44755119-37c4-444d-9048-e1a25d402173/44755119-37c4-444d-9048-e1a25d4021731.gif)
潮流计算代码c++
《电力系统潮流上机》课程设计报告
院系:
电气与电子工程学院
班级:
电气1405
学号:
1141180505
学生姓名:
指导教师:
孙英云
设计周数:
两周
成绩:
日期:
2017年7月5日
一、课程设计的目的与要求
培养学生的电力系统潮流计算机编程能力,掌握计算机潮流计算的相关知识
二、设计正文
1.掌握计算机潮流计算的原理:
a)复习电力系统分析基础中潮流的计算机算法一章,重点掌握节点分类、潮流算法介绍
b)详细阅读牛拉法部分,掌握潮流方程(极坐标、直角坐标)的写法,掌握雅可比矩阵的公式及排列顺序和潮流方程、变量顺序的关系,掌握迭代法收敛条件及迭代法的基本原理
c)设计程序框图,划分功能模块、并对每个模块的输入输出量进行细化。
2.编写计算机潮流计算程序
a)学习了解IEEE标准格式数据,学习掌握C/C++读取数据的方法
b)设计计算机数据存储母线、支路数据的结构,并将所读取的数据存放于所设计的结构当中
c)学习节点排序、节点导纳阵计算方法,编写节点导纳阵生成模块
d)编写潮流方程不平衡量计算模块
e)编写雅可比矩阵生成子模块
f)利用给定的pfMatrix类,编写修正量计算模块
g)实现潮流计算主程序,并利用IEEE标准节点数据进行校验,要求能够输出计算结果、支路潮流等必要信息
3.思考题
1.潮流计算的方法有哪些?
各有何特点?
答:
潮流计算分为简单电力网络的手算和复杂电力网络的机算两大类,其中机算又有高斯-赛德尔法、牛顿-拉夫逊法和P-Q分解法。
各方法特点如下所示:
手算求解潮流一般只用于简单的网络中,计算量大,对于多节点的网络用手算一般难以解决问题。
但是通过手算可以对物理概念的理解,还可以在运用计算机计算前由手算的形式求取某些原始数据。
方法
高斯-赛德尔法
牛顿-拉夫逊法
P-Q分解法
初值要求
不高
高
高
迭代次数
多
少
多
收敛速度
慢
较快
最快
精度
三者一样
应用
早期应用多,现在较少
广泛应用
应用较多
2.如果交给你一个任务,请你用已有的潮流计算软件计算北京城市电网的潮流,你应该做哪些工作?
(收集哪些数据,如何整理,计算结果如何分析)
答:
①.所需要收集的数据:
A.电网中所有节点的数据:
a.各节点的类型,包括平衡节点、PV 节点、PQ 节点
b. 对于平衡节点要了解节点的电压大小相位、及节点所能提供的最大最小有功无功功率
c. PV节点要知道节点电压大小注入有功功率及节点所能提供的最大和最小无功功.率
d. PQ节点要知道节点的注入有功和无功功率
B.电网中所有支路的数据:
a.各支路类型,即是否含有变压器
b.各支路的电阻、电感、电纳
c.各变压器的变比。
②.数据整理:
将上述数据资料进行分类整理,并为每个节点及支路编上编号。
将整理的结果写成本实验中所要求的格式(原始数据的txt文档),再用本实验所编制的程序进行求解,得到各节点电压、相位,各线路传输功率、损耗,平衡节点注入功率等数值。
③.计算结果分析:
考虑PQ节点的电压是否过高或过低;
分析PV节点的电压幅值是否正常及无功功率是否超出范围;
分析平衡节点有功、无功功率是否在节点所能提供的范围之内;
分析给定之路的功率,看是否超出线路的最大传输容量;
分析整个系统的网损是否达到标准。
3.设计中遇到的问题和解决的办法。
c++好久没用,有些生疏。
经过复习与XX,渐渐回忆起来。
潮流计算机解法已经遗忘,经过复习查书,很快熟悉起来。
对老师的思路不是很理解,经过与同学一起探讨,得到了正确答案。
三、课程设计总结或结论
2016下半年学历电力系统潮流计算,当时并没有编程实践,就背了背矩阵公式。
现在真让我们上手实践,感觉还是略有难度,很有挑战性,毕竟平时没多少机会接触程序。
通过这两周的摸索与交流,最终完成了潮流的编程计算。
由于是在老师的工作基础上进行补充与改造,所以要读懂老师的代码。
我觉得老师的注释还是太少,而且还是英文(虽然英语也能看懂,但还是觉得中文环境用中文好)。
在对节点数据的处理上,我们对老师的思路并不能感到理解,因此在后面雅克比矩阵生成与不平衡量计算模块绕了些许弯路,我最后还是没采用老师的办法。
除了算法的设计外,最恼人的当属开发工具了,机房是vs2010,而我电脑上是vc++6.0与vs2015,一开始用vc写,然后出了一个迷之bug,换到了vs2010才解决。
但我电脑装上vs2010却因为2015的存在无法运行,vs2015也无法运行我在2010下写好的程序。
不想卸掉花老长时间才装上的巨大2015,为此浪费了许多时间,很令人生气。
能够亲手实践电力系统潮流的计算机计算,还是学到了很多知识,对潮流计算那一部分知识又有了更深的印象。
四、参考文献
1.《电力系统稳态分析》,陈珩,中国电力出版社,2007年,第三版;
2.《高等电力网络分析》,张伯明,陈寿孙,严正,清华大学出版社,2007年,第二版
3.《电力系统计算:
电子数字计算机的应用》,西安交通大学等合编。
北京:
水利电力出版社;
4.《现代电力系统分析》,王锡凡主编,科学出版社;
二、程序
Example.cpp
#include
#include
#include
#include"pf.h"
usingnamespacestd;
voidmain()
{
pfA;
A.readDataFromFile("009ieee.dat");
A.initPFData();
A.makeYMatrix();
A.makeJacobi();
A.solveLF();
A.outputResult();
system("pause");
}
Pf.cpp
#include"pf.h"
usingnamespacestd;
pf:
:
pf(void)
{
m_Line=NULL;
m_Bus=NULL;
m_Bus_newIdx=NULL;
m_pv_Num=0;
m_sw_Num=0;
m_pq_Num=0;
}
pf:
:
~pf(void)
{
if(m_Line!
=NULL)delete[]m_Line;
if(m_Bus!
=NULL)delete[]m_Bus;
if(m_Bus_newIdx!
=NULL)delete[]m_Bus_newIdx;
}
intpf:
:
readDataFromFile(stringfileName)
{
inti;
stringstrLine,strTemp;
ifstreamfin;
//openfiletoread;
fin.open(fileName.c_str());
if(!
fin.fail())
{
//1.readSBase;
getline(fin,strLine);
strTemp.assign(strLine,31,6);
m_SBase=atof(strTemp.c_str());
//2.readBusDatahere;
//2.1readBusnum;
getline(fin,strLine);
size_tpos_begin,pos_end;
pos_begin=strLine.find("FOLLOWS");
pos_begin=pos_begin+size_t(10);
pos_end=strLine.find("ITEM");
strTemp=strLine.substr(pos_begin,pos_end-pos_begin);
m_Bus_Num=atoi(strTemp.c_str());
//2.2readeachbusdatahere
//allocatememoryform_Bus
m_Bus=newBus[m_Bus_Num];
m_Bus_newIdx=newint[m_Bus_Num];
for(inti=0;i{
getline(fin,strLine);
strTemp=strLine.substr(0,4);
//readbusnum
m_Bus[i].Num=atoi(strTemp.c_str());
//readbusName;
strTemp=strLine.substr(5,7);
m_Bus[i].Name=strTemp;
//readbustypePQ:
Type=1;PV:
Type=2;swing:
Type=3;
//判断条件YY
strTemp=strLine.substr(24,2);
if(atoi(strTemp.c_str())<=1)
{
m_Bus[i].Type=1;
m_pq_Num++;
}
elseif(atoi(strTemp.c_str())==2)
{
m_Bus[i].Type=2;
m_pv_Num++;
}
elseif(atoi(strTemp.c_str())==3)
{
m_Bus[i].Type=3;
m_sw_Num++;
}
//readbusVoltage
strTemp=strLine.substr(27,6);
m_Bus[i].V=atof(strTemp.c_str());
//readbusangle
strTemp=strLine.substr(33,7);
m_Bus[i].theta=atof(strTemp.c_str())/180*3.1415926;
//readbusLoadP
strTemp=strLine.substr(40,9);
m_Bus[i].LoadP=atof(strTemp.c_str())/m_SBase;
//readbusLoadQ
strTemp=strLine.substr(49,10);
m_Bus[i].LoadQ=atof(strTemp.c_str())/m_SBase;
//readbusGenP
strTemp=strLine.substr(59,8);
m_Bus[i].GenP=atof(strTemp.c_str())/m_SBase;
//readbusGenQ
strTemp=strLine.substr(67,8);
m_Bus[i].GenQ=atof(strTemp.c_str())/m_SBase;
//readbusShuntconductanceG
strTemp=strLine.substr(106,8);
//readbusShuntsusceptanceB
strTemp=strLine.substr(114,8);
}
//3.readLineDatahere;
//3.1readLinenum;
getline(fin,strLine);
getline(fin,strLine);
pos_begin=strLine.find("FOLLOWS");
pos_begin=pos_begin+size_t(10);
pos_end=strLine.find("ITEM");
strTemp=strLine.substr(pos_begin,pos_end-pos_begin);
m_Line_Num=atoi(strTemp.c_str());
//3.2readeachlinedata;
m_Line=newLine[m_Line_Num];
for(i=0;i{
getline(fin,strLine);
//readTapbusnumber
strTemp=strLine.substr(0,4);
m_Line[i].NumI=atoi(strTemp.c_str());
//readZbusnumber
strTemp=strLine.substr(5,4);
m_Line[i].NumJ=atoi(strTemp.c_str());
//readlinetype
strTemp=strLine.substr(18,1);
m_Line[i].Type=atoi(strTemp.c_str());
//readlineresistanceR
strTemp=strLine.substr(19,10);
m_Line[i].R=atof(strTemp.c_str());
//readlinereactanceX
strTemp=strLine.substr(29,11);
m_Line[i].X=atof(strTemp.c_str());
//readlinechargingB
strTemp=strLine.substr(40,10);
m_Line[i].B=atof(strTemp.c_str());
//readtransformerratio
strTemp=strLine.substr(76,6);
m_Line[i].K=atof(strTemp.c_str());
}
//4.closethefile;
fin.close();
}
else
cout<<"fileopenfail!
"<return0;
}
intpf:
:
initPFData()
{
//accordingtoPage132ofrefbook3,
//reindexthebusnumasethesequence[PQPVSW];
intiPQ,iPV,iSW;
iPQ=0;
iPV=0;
iSW=0;
inti;
for(i=0;i{
switch(m_Bus[i].Type)
{
case1:
m_Bus_newIdx[i]=iPQ;
iPQ++;
break;
case2:
m_Bus_newIdx[i]=iPV+m_pq_Num;
iPV++;
break;
case3:
m_Bus_newIdx[i]=iSW+m_pq_Num+m_pv_Num;
iSW++;
break;
}
}
for(i=0;icout<//herewegivethesizeofJacobimatrix;
m_Jacobi.setSize(2*m_pq_Num+m_pv_Num,2*m_pq_Num+m_pv_Num);
m_Matrix_G.setSize(m_Bus_Num,m_Bus_Num);
m_Matrix_B.setSize(m_Bus_Num,m_Bus_Num);
return0;
}
intpf:
:
getBusIdx(intbusNum)
{
//returntheindexofbusfrombusNum
inti,idx=-1;
for(i=0;i{
if(m_Bus[i].Num==busNum)
idx=i;
}
returnidx;
}
intpf:
:
makeYMatrix()
{
//TODO
inti;
floatLine_G;
floatLine_B;
for(i=0;i{
Line_G=m_Line[i].R/(m_Line[i].R*m_Line[i].R+m_Line[i].X*m_Line[i].X);
Line_B=-m_Line[i].X/(m_Line[i].R*m_Line[i].R+m_Line[i].X*m_Line[i].X);
if(m_Line[i].Type!
=2)
{
//m_Matrix_G.DumpInfo("here");
m_Matrix_G(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumI))=m_Matrix_G(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumI))+Line_G;
m_Matrix_G(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumJ))+=-Line_G;
m_Matrix_G(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumI))+=-Line_G;
m_Matrix_G(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumJ))=m_Matrix_G(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumJ))+Line_G;
m_Matrix_B(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumI))=m_Matrix_B(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumI))+Line_B+m_Line[i].B/2;
m_Matrix_B(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumJ))+=-Line_B;
m_Matrix_B(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumI))+=-Line_B;
m_Matrix_B(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumJ))=m_Matrix_B(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumJ))+Line_B+m_Line[i].B/2;
}
else
{
m_Matrix_G(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumI))=m_Matrix_G(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumI))+Line_G/(m_Line[i].K*m_Line[i].K);
m_Matrix_G(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumJ))+=-Line_G/m_Line[i].K;
m_Matrix_G(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumI))+=-Line_G/m_Line[i].K;
m_Matrix_G(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumJ))=m_Matrix_G(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumJ))+Line_G;
m_Matrix_B(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumI))=m_Matrix_B(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumI))+Line_B/(m_Line[i].K*m_Line[i].K);
m_Matrix_B(getBusIdx(m_Line[i].NumI),getBusIdx(m_Line[i].NumJ))+=-Line_B/m_Line[i].K;
m_Matrix_B(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumI))+=-Line_B/m_Line[i].K;
m_Matrix_B(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumJ))=m_Matrix_B(getBusIdx(m_Line[i].NumJ),getBusIdx(m_Line[i].NumJ))+Line_B;
}
}
m_Matrix_G.outputMatrixtoFile("G.txt");//实部
m_Matrix_B.outputMatrixtoFile("B.txt");//虚部
return0;
}
intpf:
:
makeJacobi()
{
intequNum=2*m_pq_Num+m_pv_Num;
inti,j,k;
doubleH,J,N,L;
//initJacobimatrix;
for(i=0;i{
for(j=0;j{
m_Jacobi(i,j)=0.0;
}
}
for(i=0;i{
for(j=0;j{
H=0.0;