1、 数据结构与数据库实验 仅供参考 实验三 电力网络信息存储及导纳矩阵处理 实验名称: 电力网络信息存储及导纳矩阵处理 专 业: 电气工程 姓 名: 学 号: 电力网络信息存储及导纳矩阵处理 一、 实验要求 (1) 网络数据输入的内容包括节点信息和支路信息 (2) 可适合任意规模的网络 (3) 可查询节点、支路信息(根据节点名或支路名)
2、
(4) 形成导纳矩阵及输出
(5) 导纳矩阵稀疏处理
(6) 基于导纳矩阵的稀疏表示,获取 Yij
(7) 测试数据
IEEE 5 节点网络
(8)选作内容
IEEE 14 节点网络。
二、 概要设计
1.采用的数据结构的定义及主要功能模块的功能:
Ø 在本实验中,导纳矩阵数据的输入采用文件流方式的读方式建立,输出采用文件流写方式输出,导纳矩阵数据的存储采用邻接表存储方式。为了适合任意规模的网络,导纳矩阵的建立采用动态创建方式,存储的物理结构为非连续存储,稀疏矩阵的压缩处理采用邻接表和三元组。对于矩阵的存储节点类以及支路信息节点类采用结构体template 3、me NameType,typename BDataType>struct BusNode和template 4、类template 5、等。
Ø 矩阵的建立分为节点信息矩阵的建立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&o 6、perator<<(ostream& out,Complex&c) ,输出的形式分为两种,一种是矩阵形式输出,一种是只打印非零值的输出。
Ø 为了更好地体现类的封装性,在本实验中采用调用函数和执行函数分离的方式,可以使相关类的数据更加安全。如节点及支路信息的查询函数Search(),执行函数为支路查询函数void SearchBranch(int,int)和节点查询函数void SearchBus(int i,SBusNode 7、id Caculate()是用来调用它的接口函数。避免类的内容被篡改,使类的内容更加安全。
2、各个结构体及类的声明及其功能如下:
1、节点模板:
template 8、
BDataType V;
BDataType cita1;
BDataType LP;
BDataType LQ;
//BusNode 9、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; 10、
//BranchNode 11、T> *next;
//YYNode(){J3=0;next=NULL;}
};
template 12、pe>class Matrix//稀疏矩阵
{
private:
Complex cc[14][14];
SBranchNode< NameType,BDataType,DataType>*branch;//支路结点链表头指针
SBusNode 13、 int nn;//节点个数
bool SearchBranch(int i,int j,SBranchNode 14、]branch;//动态建立,要有自己的析构函数
}
//BusNode 15、ntY();//输出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;
d 16、ouble 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 17、operator<<(ostream& out,Complex&c);
};
三、 详细设计
1、各主要模块的流程图:
(1)文件流的读入:
Ø 从文件中依次读入节点或支路信息,每读入一组数据,建立一个邻接表节点,读入的数据和节点的数据域一一对应,最终生成存储了所有从文件读入的电力网的节点和支路信息的邻接表。
文件流读入数据是否已读完
否
是
动态创建邻接表头结点
动态创建信息存储节点
以编号的节点为头节点创建链表
结束
2、创建导纳稀疏矩阵:
建立二维数组
18、
初始化为零
遍历支路信息的邻接表
计算相应支路的导纳值存入数组
3、稀疏矩阵的压缩处理:
建立节点编号的头结点链表
遍历支路信息的邻接表
为相应的支路建立存储节点
以相应的编号节点为头结点建立邻接表
3、导纳计算:
自导纳 i=j
从支路信息邻接表获取数据数据
将所有与i有关的互导纳相加,然后求其相反数,即为自导纳
互导纳 i!=j
根据数据域的电阻、电抗,将阻抗求倒数转换为导纳
判 19、断支路数据域的变比K是否为零
否
将转换后的导纳值除以变比获得相应支路的导纳值
四、 调试分析
测试数据的输出结果:
(1) 下图初始选择界面,可根据需要选择005或者014,或者终止。
(2) 若输入除“a”、”b”、”$”以外的字符,系统提示错误,要求重新输入选择符。下图为输入“w”时的系统界面:
(3) 输入a,选择005bus.txt 以及005branch.Txt
打印005bus信息以及005branch信息
打印导纳稀疏矩阵,并提示是否输出矩阵的非零值
(4) 打印非零数据
非零数据,包 20、括自导纳和互导纳
(5) 查询:查询节点信息或者支路信息
输入节点超出范围,提示
打印支路导纳值
若支路不存在,提示
打印支路信息
输入支路两端节点号
打印节点信息
输入节点编号
(6) 可以以“@“结束对005的查询,进入下一轮的选择,进入014
打印014bus信息
打印014branch的信息
(7)打印导纳矩阵
互导纳
自导纳
(9)查询节点和支路信息
源程序:
主程序
#include 21、include 22、Please choose the Matrix you want to check . 005 (a) OR 014 (b) "< 23、 24、t<<"B1:"< 25、cout<<"005bus.txt"< 26、ntSparseMatrix();
cout<<"Print the non_zero value of the SparseMatrix. YES (y/Y) OR NOT (n/N)."< 27、m>
#include 28、
NameType name1;
int I1;
int type1;
BDataType V;
BDataType cita1;
BDataType LP;
BDataType LQ;
//BusNode 29、 电抗
B: 线路总电纳(pai型等值电路)
K: 变压器非标准变比 */
NameType name2;
int I2;//行
int J2;//列
int type2;
BDataType R;
BDataType X;
BDataType B;
BDataType K;
//BranchNode 30、 DataType data;//节点编号
BusNode 31、e 32、ename BDataType,typename DataType>class Matrix//稀疏矩阵
{
private:
Complex cc[14][14];
SBranchNode< NameType,BDataType,DataType>*branch;//支路结点链表头指针
SBusNode 33、 BNode 34、Yij的计算函数
public:
Matrix(){}
~Matrix(){
delete[]bus;
delete[]branch;//动态建立,要有自己的析构函数
}
//BusNode 35、);//创建支路信息矩阵
void PrintBus();//输出接点信息
void PrintBranch();//输出支路信息
void PrintY();//输出Yij的值
void PrintSparseMatrix();//打印稀疏矩阵
void Search();//查询函数
void MatrixY(int d[]);//打印非零值
void PrintSMatrix();//打印矩阵
void PrintMatrix();//打印矩阵
void Caculate();//计算导纳的接口函数
void CreatS 36、parseMatrix(int d[]);//创建导纳稀疏矩阵
int SBalance();
int SPQ(int);
void CreatB1();
void PrintB1();
void PrintB2();
};
template 37、 b;
for(b=0;b 38、bus+b)->next;
if(bb->I1==i)pq=bb->type1;
}
return pq;
}
template 39、"< 40、
int i,j;
cout<<"Enter the number of the branch"< 41、){
BusNode 42、
//cout<<"infile bus"<<'\t'< 43、'< 44、
b->type1=type;
b->cita1=cita;
b-LP=lp;
b->LQ=lq;
bus->next=b;*/
}
return;
}
template 45、
if(i<0||i>nn) {
cout<<"OUT OF RANGE"< 46、e1<<'\t'< 47、<"name"<<'\t'<<"type"<<'\t'<<"V"<<'\t'<<"cita"<<'\t'<<"LP"<<'\t'<<"LQ"< 48、
}
cout< 49、j;
int type;
BDataType r;
BDataType x;
BDataType bb;
BDataType kk;
ifstream infile(filename,ios::in);
nn=n;
branch=new SBranchNode 50、h+k)->data=d[k];
// cout<<"infile bus"<<'\t'<
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818