资源描述
数据结构与数据库实验
仅供参考
实验三 电力网络信息存储及导纳矩阵处理
实验名称: 电力网络信息存储及导纳矩阵处理
专 业: 电气工程
姓 名:
学 号:
电力网络信息存储及导纳矩阵处理
一、 实验要求
(1) 网络数据输入的内容包括节点信息和支路信息
(2) 可适合任意规模的网络
(3) 可查询节点、支路信息(根据节点名或支路名)
(4) 形成导纳矩阵及输出
(5) 导纳矩阵稀疏处理
(6) 基于导纳矩阵的稀疏表示,获取 Yij
(7) 测试数据
IEEE 5 节点网络
(8)选作内容
IEEE 14 节点网络。
二、 概要设计
1.采用的数据结构的定义及主要功能模块的功能:
Ø 在本实验中,导纳矩阵数据的输入采用文件流方式的读方式建立,输出采用文件流写方式输出,导纳矩阵数据的存储采用邻接表存储方式。为了适合任意规模的网络,导纳矩阵的建立采用动态创建方式,存储的物理结构为非连续存储,稀疏矩阵的压缩处理采用邻接表和三元组。对于矩阵的存储节点类以及支路信息节点类采用结构体template <typename NameType,typename BDataType>struct BusNode和template <typename NameType,typename BDataType>structBranchNode 定义,节点链表类为template <typename NameType,typename BDataType, typename DataType>struct SBusNode,支路节点链表类template <typename NameType,typename BDataType,typename DataType>struct SBranchNode,稀疏矩阵三元组类template<typename T>struct Twice,邻接表头指针节点类template<typename T,typename DataType>struct YNode,邻接表next域节点类template<typename T>struct YYNode,以上全为结构体定义,方便调用,稀疏矩阵采用模板类template <typename NameType,typename BDataType,typename DataType>class Matrix。计算导纳模块牵涉到复数的运算,所以采用自定义复数类class Complex,并重载了+、+=、/、/=以及插入符<<等。
Ø 矩阵的建立分为节点信息矩阵的建立void CreatBusM(int n,int d[],char*filename)和支路信息矩阵的建立void CreatBranchM(int n,int d[],char*filename),相应的输出分为节点的输出void PrintBus()和支路信息的输出void PrintBranch(),输出的形式与文件中数据的存储形式类似。节点自导纳的创建分为稀疏矩阵的创建CreatSparseMatrix(int d[])以及压缩矩阵的创建MatrixY(int d[]),导纳矩阵输出为复数的输出,在复数类中重载了输出<<符,ostream&operator<<(ostream& out,Complex&c) ,输出的形式分为两种,一种是矩阵形式输出,一种是只打印非零值的输出。
Ø 为了更好地体现类的封装性,在本实验中采用调用函数和执行函数分离的方式,可以使相关类的数据更加安全。如节点及支路信息的查询函数Search(),执行函数为支路查询函数void SearchBranch(int,int)和节点查询函数void SearchBus(int i,SBusNode<NameType,BDataType,DataType>*BS),它们是私有函数,而在计算导纳时,真正的执行函数是void CaculateY(int,int),void Caculate()是用来调用它的接口函数。避免类的内容被篡改,使类的内容更加安全。
2、各个结构体及类的声明及其功能如下:
1、节点模板:
template <typename NameType,typename BDataType>struct BusNode//节点
{//I: 节点编号
//Name:名称
//Type:节点类型 1=PQ 2:PV 3:SlackBus
//V: 电压幅值
//cita:电压角度
//LP: 负荷P
//LQ: 负荷Q
NameType name1;
int I1;
int type1;
BDataType V;
BDataType cita1;
BDataType LP;
BDataType LQ;
//BusNode<NameType,DataType>*next;
};
template <typename NameType,typename BDataType, typename DataType>struct SBusNode//节点结点链表
{
DataType data;//节点编号
BusNode<NameType,BDataType>*next;
};
2、支路节点模板:
、
template <typename NameType,typename BDataType>struct BranchNode//支路
{
/*i: 支路的始端节点编号
j: 支路的末端节点编号
Name:支路名称
Type:类型, 2=变压器 1=线路
R: 电阻
X: 电抗
B: 线路总电纳(pai型等值电路)
K: 变压器非标准变比 */
NameType name2;
int I2;//行
int J2;//列
int type2;
BDataType R;
BDataType X;
BDataType B;
BDataType K;
//BranchNode<NameType,DataType>*next;
};
template <typename NameType,typename BDataType,typename DataType>struct SBranchNode//支路结点链表
{
DataType data;//支路编号
BranchNode<NameType,BDataType>*next;
};
3、稀疏矩阵节点模板类
template<typename T>struct YYNode{
T C;
int I3;
int J3;
// YYNode<T> *next;
//YYNode(){J3=0;next=NULL;}
};
template<typename T,typename DataType>struct YNode{
DataType data;
YYNode<T> *next;
};
4、三元组模板类
template<typename T>struct Twice{//稀疏矩阵三元组类
T data;
int row,col;//行号列号
};
5、矩阵模板类:
template <typename NameType,typename BDataType,typename DataType>class Matrix//稀疏矩阵
{
private:
Complex cc[14][14];
SBranchNode< NameType,BDataType,DataType>*branch;//支路结点链表头指针
SBusNode<NameType,BDataType, DataType>*bus;//节点结点链表头指针
YNode<Complex,DataType> *y;//稀疏矩阵邻接表头结点
Twice<Complex> *aa;//压缩稀疏矩阵三元组
// Twice<Complex> *cc;;//稀疏矩阵三元组
int nn;//节点个数
bool SearchBranch(int i,int j,SBranchNode<NameType,BDataType,DataType>*BS);//支路信息查询函数
void SearchBus(int i,SBusNode<NameType,BDataType,DataType>*BS); //节点信息查询函数
Complex CaculateY(int,int);//导纳Yij的计算函数
public:
Matrix(){}
~Matrix(){
delete[]bus;
delete[]branch;//动态建立,要有自己的析构函数
}
//BusNode<string,double> SearchBus(int);
// void SearchBranch(int,int);
void CreatBusM(int n,int d[],char*filename);//创建节点信息矩阵
void CreatBranchM(int n,int d[],char*filename);//创建支路信息矩阵
void PrintBus();//输出接点信息
void PrintBranch();//输出支路信息
void PrintY();//输出Yij的值
void PrintSparseMatrix();//打印稀疏矩阵
void Search();//查询函数
void MatrixY(int d[]);//邻接表
void PrintSMatrix();//打印矩阵
void PrintMatrix();//打印矩阵
void Caculate();//计算导纳的接口函数
void CreatSparseMatrix(int d[]);//创建导纳稀疏矩阵
};
6、复数类:
class Complex{
public:
double real;
double image;
Complex(double r=0,double i=0){real=r;image=i;}
~Complex(){}
Complex operator+(Complex);
Complex operator+(double);
Complex operator=(Complex);
Complex operator/(double);
Complex operator/=(Complex);
void Print(Complex);
void Print0(Complex,Complex);
friend ostream&operator<<(ostream& out,Complex&c);
};
三、 详细设计
1、各主要模块的流程图:
(1)文件流的读入:
Ø 从文件中依次读入节点或支路信息,每读入一组数据,建立一个邻接表节点,读入的数据和节点的数据域一一对应,最终生成存储了所有从文件读入的电力网的节点和支路信息的邻接表。
文件流读入数据是否已读完
否
是
动态创建邻接表头结点
动态创建信息存储节点
以编号的节点为头节点创建链表
结束
2、创建导纳稀疏矩阵:
建立二维数组
初始化为零
遍历支路信息的邻接表
计算相应支路的导纳值存入数组
3、稀疏矩阵的压缩处理:
建立节点编号的头结点链表
遍历支路信息的邻接表
为相应的支路建立存储节点
以相应的编号节点为头结点建立邻接表
3、导纳计算:
自导纳 i=j
从支路信息邻接表获取数据数据
将所有与i有关的互导纳相加,然后求其相反数,即为自导纳
互导纳 i!=j
根据数据域的电阻、电抗,将阻抗求倒数转换为导纳
判断支路数据域的变比K是否为零
否
将转换后的导纳值除以变比获得相应支路的导纳值
四、 调试分析
测试数据的输出结果:
(1) 下图初始选择界面,可根据需要选择005或者014,或者终止。
(2) 若输入除“a”、”b”、”$”以外的字符,系统提示错误,要求重新输入选择符。下图为输入“w”时的系统界面:
(3) 输入a,选择005bus.txt 以及005branch.Txt
打印005bus信息以及005branch信息
打印导纳稀疏矩阵,并提示是否输出矩阵的非零值
(4) 打印非零数据
非零数据,包括自导纳和互导纳
(5) 查询:查询节点信息或者支路信息
输入节点超出范围,提示
打印支路导纳值
若支路不存在,提示
打印支路信息
输入支路两端节点号
打印节点信息
输入节点编号
(6) 可以以“@“结束对005的查询,进入下一轮的选择,进入014
打印014bus信息
打印014branch的信息
(7)打印导纳矩阵
互导纳
自导纳
(9)查询节点和支路信息
源程序:
主程序
#include<iostream>
#include<fstream>
#include<string>
#include"Matrix.h"
using namespace std;
void run(){
Matrix<double,double,int> m;
int i;
i=m.SBalance();
cout<<"balance"<<i<<endl;
int n1=5;
int n2=14;
int d14[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14};
int d5[]={1,2,3,4,5};
char a;
cout<<"Please choose the Matrix you want to check . 005 (a) OR 014 (b) "<<endl;
cout<<"Also this progess can be ended by entering '$'."<<endl;
cin>>a;
while(a!='a'&& a!='b'&& a!='c'){
cout<<"ERROR.Please Try Again."<<endl;
cout<<"Please choose the Matrix you want to check . 005 (a) OR 014 (b) ."<<endl;
cin>>a;
}
if(a=='a'||a=='b'){
if(a=='b'){
cout<<"014bus"<<endl;
m.CreatBusM(n2,d14,"014bus.txt");
m.PrintBus();
cout<<"014branch.txt"<<endl;
m.CreatBranchM(n2,d14,"014branch.txt");
m.PrintBranch();
m.PrintMatrix();
m.CreatSparseMatrix(d14);
// m.CreatB1();
cout<<"B1:"<<endl;
m.PrintB1();
cout<<"B2:"<<endl;
m.PrintB2();
// m.PrintSparseMatrix();
char s1;
cout<<"Print the non-zero value of the SparseMatrix. YES (y/Y) OR NOT (n/N)."<<endl;
cin>>s1;
if(s1=='y'||s1=='Y') m.MatrixY(d14);
m.Search();
run();
return ;
}
if(a=='a'){
cout<<"005bus.txt"<<endl;
m.CreatBusM(n1,d5,"005bus.txt");
m.PrintBus();
cout<<"005branch.txt"<<endl;
m.CreatBranchM(n1,d5,"005branch.txt");
m.PrintBranch();
m.CreatSparseMatrix(d14);
m.PrintSMatrix();
cout<<"B1:"<<endl;
m.PrintB1();
cout<<"B2:"<<endl;
m.PrintB2();
//m.PrintSparseMatrix();
cout<<"Print the non_zero value of the SparseMatrix. YES (y/Y) OR NOT (n/N)."<<endl;
char s2;
cin>>s2;
if(s2=='y'||s2=='Y') m.MatrixY(d5);
m.Search();
run();
return ;
}
}
if(a=='c') return;
}
int main(){
run();
return 0;
}
头文件:
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
#include"Complex.h"
using namespace std;
#define max 14;
template <typename NameType,typename BDataType>struct BusNode//节点
{//I: 节点编号
//Name:名称
//Type:节点类型 1=PQ 2:PV 3:SlackBus
//V: 电压幅值
//cita:电压角度
//LP: 负荷P
//LQ: 负荷Q
NameType name1;
int I1;
int type1;
BDataType V;
BDataType cita1;
BDataType LP;
BDataType LQ;
//BusNode<NameType,DataType>*next;
};
template <typename NameType,typename BDataType>struct BranchNode//支路
{
/*i: 支路的始端节点编号
j: 支路的末端节点编号
Name:支路名称
Type:类型,2=变压器 1=线路
R: 电阻
X: 电抗
B: 线路总电纳(pai型等值电路)
K: 变压器非标准变比 */
NameType name2;
int I2;//行
int J2;//列
int type2;
BDataType R;
BDataType X;
BDataType B;
BDataType K;
//BranchNode<NameType,DataType>*next;
};
template <typename NameType,typename BDataType, typename DataType>struct SBusNode//节点结点链表
{
DataType data;//节点编号
BusNode<NameType,BDataType>*next;
};
template <typename NameType,typename BDataType,typename DataType>struct SBranchNode//支路结点链表
{
DataType data;//支路编号
BranchNode<NameType,BDataType>*next;
};
template<typename T>struct YYNode{
T C;
int I3;
int J3;
// YYNode<T> *next;
//YYNode(){J3=0;next=NULL;}
};
template<typename T,typename DataType>struct YNode{
DataType data;
YYNode<T> *next;
};
template<typename T>struct Twice{//稀疏矩阵三元组类
T data;
int row,col;//行号列号
};
template<typename T>struct BNode{
T data;
};
template <typename NameType,typename BDataType,typename DataType>class Matrix//稀疏矩阵
{
private:
Complex cc[14][14];
SBranchNode< NameType,BDataType,DataType>*branch;//支路结点链表头指针
SBusNode<NameType,BDataType, DataType>*bus;//节点结点链表头指针
YNode<Complex,DataType> *y;//稀疏矩阵邻接表头结点
Twice<Complex> *aa;//压缩稀疏矩阵三元组
BNode<double> **B1;
BNode<double> **B2;
// Twice<Complex> *cc;;//稀疏矩阵三元组
int nn;//节点个数
bool SearchBranch(int i,int j,SBranchNode<NameType,BDataType,DataType>*BS);//支路信息查询函数
void SearchBus(int i,SBusNode<NameType,BDataType,DataType>*BS); //节点信息查询函数
Complex CaculateY(int,int);//导纳Yij的计算函数
public:
Matrix(){}
~Matrix(){
delete[]bus;
delete[]branch;//动态建立,要有自己的析构函数
}
//BusNode<string,double> SearchBus(int);
// void SearchBranch(int,int);
void CreatBusM(int n,int d[],char*filename);//创建节点信息矩阵
void CreatBranchM(int n,int d[],char*filename);//创建支路信息矩阵
void PrintBus();//输出接点信息
void PrintBranch();//输出支路信息
void PrintY();//输出Yij的值
void PrintSparseMatrix();//打印稀疏矩阵
void Search();//查询函数
void MatrixY(int d[]);//打印非零值
void PrintSMatrix();//打印矩阵
void PrintMatrix();//打印矩阵
void Caculate();//计算导纳的接口函数
void CreatSparseMatrix(int d[]);//创建导纳稀疏矩阵
int SBalance();
int SPQ(int);
void CreatB1();
void PrintB1();
void PrintB2();
};
template <typename NameType,typename BDataType,typename DataType>int Matrix<NameType,BDataType,DataType>::SBalance(){
int bal=0;
BusNode<NameType,BDataType>*bb;
int b;
for(b=0;b<nn;b++){
bb=(bus+b)->next;
if(bb->type1==3)bal=bb->I1;
}
return bal;
}
template <typename NameType,typename BDataType,typename DataType>int Matrix<NameType,BDataType,DataType>::SPQ(int i){
int pq=0;
BusNode<NameType,BDataType>*bb;
int b;
for(b=0;b<nn;b++){
bb=(bus+b)->next;
if(bb->I1==i)pq=bb->type1;
}
return pq;
}
template <typename NameType,typename BDataType,typename DataType>void Matrix<NameType,BDataType,DataType>::Search(){
///查询节点、支路信息(根据节点名或支路名)
cout<<"Search BUS (A/a) OR BRANCH (B/b) .Also this process can be ignored by entering @."<<endl;
char c;
cin>>c;
if(c=='A' ||c=='a'){
SBusNode<NameType,BDataType,DataType>*BS;
BS=bus;
int s;
cout<<"Enter the number of the bus"<<endl;
cin>>s;
SearchBus(s,BS);
Search();
return;
}
if(c=='b'||c=='B'){
SBranchNode<NameType,BDataType,DataType>*BS;
BS=branch;
int i,j;
cout<<"Enter the number of the branch"<<endl;
cin>>i>>j;
SearchBranch(i,j,BS);
Search();
return;
}
else return;
return;
}
template <typename NameType,typename BDataType,typename DataType>void Matrix<NameType,BDataType,DataType>::CreatBusM(int n,int d[],char*filename){
BusNode<NameType,BDataType>*b;
int k;
NameType name;
int i;
int type;
BDataType v;
BDataType cita;
BDataType lp;
BDataType lq;
ifstream infile(filename,ios::in);
nn=n;
bus=new SBusNode<NameType,BDataType,DataType>[nn];
for(k=0;k<nn;k++){
(bus+k)->data=d[k];
//cout<<"infile bus"<<'\t'<<k<<'\t'<<d[k]<<endl;
(bus+k)->next=NULL;
infile>>name>>i>>type>>v>>cita>>lp>>lq;
b=new BusNode<NameType,BDataType>;
b->name1=name;
// cout<<"name"<<'\t'<<name<<endl;
b->I1=i;
// cout<<"i"<<'\t'<<i<<endl;
b->type1=type;
// cout<<"type"<<'\t'<<type<<endl;
b->V=v;
// cout<<"v"<<'\t'<<v<<endl;
b->cita1=cita;
// cout<<"cita"<<'\t'<<cita<<endl;
b->LP=lp;
// cout<<"lp"<<'\t'<<lp<<endl;
b->LQ=lq;
// cout<<"lq"<<'\t'<<lq<<endl;
(bus+k)->next=b;
/*b=new BusNode<NameType,BDataType>;
b->name1=name;
b->I1=i;
b->type1=type;
b->cita1=cita;
b-LP=lp;
b->LQ=lq;
bus->next=b;*/
}
return;
}
template <typename NameType,typename BDataType,typename DataType>void Matrix<NameType,BDataType,DataType>::SearchBus(int i,SBusNode<NameType,BDataType,DataType>*bs){
BusNode<NameType,BDataType> *BS;
if(i<0||i>nn) {
cout<<"OUT OF RANGE"<<endl;
}
else {
for(int k=0;k<nn;k++){
BS=(bs+k)->next;
if((bs+k)->data==i){
cout<<"i"<<'\t'<<"name"<<'\t'<<"type"<<'\t'<<"V"<<'\t'<<"cita"<<'\t'<<"LP"<<'\t'<<"LQ"<<endl;
cout<<endl;
cout<<BS->I1<<'\t'<<"bus_"<<BS->name1<<'\t'<<BS->type1<<'\t'<<BS->V<<'\t'<<BS->cita1<<'\t'<<BS->LP<<'\t'<<BS->LQ<<endl;
cout<<endl;
}
}
}
return ;
//cout<<
}
template <typename NameType,typename BDataType,typename DataType>void Matrix<NameType,BDataType,DataType>::PrintBus(){
BusNode<NameType,BDataType>*BS;
int k;
cout<<"i"<<'\t'<<"name"<<'\t'<<"type"<<'\t'<<"V"<<'\t'<<"cita"<<'\t'<<"LP"<<'\t'<<"LQ"<<endl;
cout<<endl;
for(k=0;k<nn;k++){
//cout<<"k"<<'\t'<<k<<endl;
BS=(bus+k)->next;
cout<<BS->I1<<'\t'<<"bus_"<<BS->name1<<'\t'<<BS->type1<<'\t'<<BS->V<<'\t'<<BS->cita1<<'\t'<<BS->LP<<'\t'<<BS->LQ<<endl;
cout<<endl;
}
cout<<endl;
return;
}
template <typename NameType,typename BDataType,typename DataType>void Matrix<NameType,BDataType,DataType>::CreatBranchM(int n,int d[],char*filename){
BranchNode<NameType,BDataType>*b;
Complex c,a(0,0);
//Complex cc[14][14];
int k;
NameType name;
int i,j;
int type;
BDataType r;
BDataType x;
BDataType bb;
BDataType kk;
ifstream infile(filename,ios::in);
nn=n;
branch=new SBranchNode<NameType,BDataType,DataType>[nn];
// cc=new Twice<Complex>[*nn];
//for(int r=0;r<nn;r++)a[r]=new Complex[nn];
for(k=0;k<nn;k++){
(branch+k)->data=d[k];
// cout<<"infile bus"<<'\t'<<k<<'\t'<<d[k]<<endl;
(branch+k)->next=NULL;
infile>>i>>j>>name>>type>>r>>x>>bb>>kk;
b=new BranchNode<NameType,BDataType>;
b->I2=i;
// cout<<"i"<<'\t'<<i<<endl;
b->J2=j;
// cout<<"j"<<'\t'<<j<<endl;
b->name2=name;
// cout<<"name"
展开阅读全文