山东大学硕士学位论文
struct Node { }
double v; double sita; double pg; double qg; double pl; double ql;
其中, v为节点电压幅值,sita为/节点电压角度。另外还定义了节点的功率参数: pg;-发电有功,qg-发电无功,pl-负荷有功,ql-负荷无功。 ? 线路参数结构定义
struct Line { }
int l; int from; int to; double r; double x; double bk; int type;
char from_name[12]; char to_name[12];
其中,from和to代表线路两端节点号:from—左节点号;to—右节点号。type代表线路类型标志:1—普通支路;2—变压器支路,变比K:1;3—变压器支路, 变比1:K;4—对接地支路,左右节点号相同。r、x、bk代表线路阻抗或变比等参数:r—电阻R;x—电抗;bk—线路充电容纳的一半BC/2 或变压器的非标准变比K。 ? 发电机参数结构定义
struct Generator {
int double double }
double double double double double double double
node; PG; QG; PG0; PN; V; Tj; KG; Kg; TG;
其中,node 代表发电机节点号。PG为机组有功出力, QG为机组无功出力,PN为
33
山东大学硕士学位论文
机组额定有功,V为发电机节点电压。另外还定义了了用于发电机一次调频的一些参数: Tj-机组惯性时间常数; KG-单位调节功率有名值; Kg-单位调节功率标么值;TG-机组调速器时间常数。 ? 负荷参数结构定义
struct Load {
int
double
node; PL;
double QL;
}其中,node代表负荷节点号。double PL为负荷有功,QL为负荷无功。
为了计算的方便,程序还定义了一个全网参数结构体SubSys记录运算中电网的信息,定义如下:
struct SubSys int node; //系统节点数 int branch;//系统支路数 int IQ;//发电机个数 int IP;//负荷数 int N1;//PV节点数 int IPV[NODE+1];//PV节点的节点号 int N0;//平衡节点号 double PV[NODE+1];//PV节点的电压幅值 double U0,UP;//平衡节点电压值、PQ节点电压初值 double Pacc;//系统不平衡功率 double D; double sumTj; double freq; int sum;//非零非对角元的总个数 double dp,dq;//系统的线路功率损耗 double pgtotal,qgtotal;//全网发电有功、无功 double pltotal,qltotal;//全网负荷有功、无功 double qctotal;//全网充电无功 5.3 类的处理和实现
本程序是采用面向对象架构的,程序定义了两大类一个是CFlow类,用于潮流计算,一个是稀疏矩阵类CSparseM。 5.3.1稀疏矩阵类:
电力系统分析涉及大量的稀疏矩阵运算,稀疏矩阵运算能力高低直接影响系统的整
34
山东大学硕士学位论文
体性能。稀疏矩阵运算需要解决两个问题:一是稀疏矩阵的存储问题。二是针对稀疏矩阵的特定处理,如进行稀疏矩阵的插入、查找、删除等操作,以及对稀疏矩阵的因子化等特定处理。
稀疏矩阵表示数学上的一类特殊矩阵,这类矩阵的处理具有许多共性,因此可以对稀疏矩阵进行抽象和封装,定义单独的稀疏矩阵类。有关稀疏矩阵的一些特定运算,如矩阵元的插入、查找、删除以及因子化等可以作为方法封装在稀疏矩阵类中。有了稀疏矩阵类,稀疏矩阵的使用就比较方便了,可以像定义普通变量一样定义稀疏矩阵。
本文对稀疏矩阵的存储采用一种简单直观的存储方案——按坐标的存储方案。在这种存储方案中,采用了将矩阵对角元和非对角元分开存储的办法。矩阵的对角元自左上至右下按顺序存储在一个一维数组中。至于非对角元,将其存储在一个定义的结构体中,只存储非零元。
struct fdjy{
int row;//非对角元行号 int col;//非对角元列号 double yij;//非对角元};
CSparseM稀疏矩阵类 double dii[NODE+1];//对角元 struct fdjy YIJ[N*BRANCH+1];//非零非对角元 int index[NODE+1];// struct SpmSys spm; public: CSparseM(void); ~CSparseM(void){}; double GetValue(int r,int c); void SetValue(int r,int c,double value); void AddValue(int r,int c,double value); void SetZero(); CSparseM& operator=(const CSparseM &C); void DelArray(int rc); int Fjyz(CSparseM& son); 结合如下一个矩阵简单说明存储方法:
?15?8??5??????1011209712213322164???14???17??18??
对角元:
顺序号 1 2 3 4 5 6 对角元 15 11 20 12 22 18 35
山东大学硕士学位论文
非零非对角元:
顺序号 1 2 3 4 5 6 7 8 9 10 11 12 非零非对角元 10 4 8 5 7 14 9 3 2 17 13 16 行号 1 1 2 3 3 3 4 4 5 5 6 6 列号 2 3 1 1 4 6 3 5 4 6 3 5 这种存储方案需占用(n+3N)个存储单元,其中n为对角元数即矩阵阶数,N为非对角元数,常规存储方案需占用n2存储个单元,显然当n很大时在稀疏矩阵中n+3N会远远小于n2。
成员函数说明:
查找矩阵元函数 double GetValue(int r,int c):该函数是矩阵操作函数,功能用于实现设置矩阵元函数void SetValue(int r,int c,double value):该函数为矩阵操作函数,功能矩阵元加函数void AddValue(int r,int c,double value) :该函数为矩阵操作函数,功能用矩阵清零函数void SetZero():该函数为矩阵操作函数,功能用于实现矩阵清零,将矩阵赋值函数CSparseM& operator=(const CSparseM &C):该函数为矩阵操作函数,矩阵删除函数void DelArray(int rc) :该函数为矩阵操作函数,功能用于实现删除矩阵
查找行号为r、列号为c的元素,返回该元的值。
用于实现设置行号为r、列号为c的元素为value 于实现对行号为r、列号为c的元素增加value
对角元数组dii[],和非对角元结构体数组yij[]全部清零。
功能用于实现矩阵之间的赋值,让矩阵能像int型一样自由的赋值。
matrix中的第rc行和rc列,形成新的矩阵。比如由导纳矩阵的虚部要形成B’需要去掉平衡节点所对应的一行一列。
形成因子表函数int Fjyz(CSparseM& son) :矩阵操作函数,功能实现矩阵三角分解,形成因子表。 5.3.2潮流计算类
潮流计算类:这个类是该软件的核心对象,它完成潮流计算功能,形成潮流计算类。潮流计算类的成员变量(属性)包括潮流计算所需的各种参数如节点导纳矩阵以及形成这些参数的已知量如支路参数、发电机参数、负荷参数等。潮流计算类的成员函数包括原始数据输入函数、形成节点导纳矩阵函数、PQ迭代函数、支路功率计算函数、结果输出函数等。随着程序的扩展,还将频率计算等相关函数作为了该类的成员函数。潮流计算类框图如下定义:
36
山东大学硕士学位论文
CFlow CSparseM Gm,Bm;//导纳矩阵的实部和虚部 CSparseM B1,B2;//B'和B\矩阵 CSparseM Y1,Y2;//B'和B\对应的因子表 char datafile[20];//原始数据文件名 struct SubSys SysInfo[5];//用于网罗拓扑后形成的子网(见Topo()) struct SubSys island;//计算系统的信息 struct Node NodeInfo[600];//节点信息 struct Branch BranchInfo[600];//支路信息 struct Generator Generator[100]; struct Load Load[200]; struct FreqLoad FreqInfo[20]; struct NameToNode n2n[700]; double deltaP[NODE+1]; double deltaQ[NODE+1]; double EndCondition;//迭代收敛精度 int Iteration;//总迭代次数 int FreqLoadNum;//低频减载轮数 list
原始数据输入函数void CFlow::Input():
目前计算机的速度和计算方法已经使我们能很快地得到计算结果,但是上机以前的准备工作却非常耗费时间,而且也容易出错。因此在作程序设计时,必须尽可能减少上
37