程序设计所涉及二叉树解释
任意一棵树或一个森林都能唯一地对应一棵二叉树,由此而编写本程序。
本程序采用类二叉树为整体结构,二叉树类下定义节点类,每一条支路均为树的一个节
点,支路所有的参数均作为节点的属性,并给节点加入属性“支路编号”,并以支路编号为
依据构建二叉树,这就要求提前根据二叉树结构给每一个支路编号。
支路编号原则:左子树上所有编号均小于其双亲的编号,右子树上所有编号均大于其双
亲的编号,为了便于查看,本程序在节点较少时编号从 1 开始,逐个递加至支路数;当支路
较多时,可不必拘泥于逐个递加,只要满足支路编号原则即可。
例如习题 3-4:
程序二叉树结构示意图:
本二叉树中节点 1 即支路 1 为题目中节点 1 与节点 2 之间的部分;
本二叉树中节点 2 即支路 2 为题目中节点 2 与节点 3 之间的部分;
对于习题 3-3:
程序二叉树结构示意图:
本二叉树中节点 2 即支路 2 为题目中节点 1 与节点 2 之间的部分;
本二叉树中节点 1 即支路 1 为题目中节点 2 与节点 3 之间的部分;
本二叉树中节点 3 即支路 3 为题目中节点 2 与节点 4 之间的部分.
拓展:
如下多支路网络:
对于三节点网络需先进行以下网络处理转化为标准二叉树,而后进行计算;
图中三角形表明该项阻抗为零,为纯导线,并进行相应参数补充进行计算。
程序说明文档
*******************************************************************************
************************************************************************
本程序测试使用方法:在 E 盘根目录下建立输入文件:
输入文件名:input.txt;
将所附算例对应输入文件内容复制粘贴至上述文件中,在 VC++6.0 环
境下运行 cpp 文件得出结果。
输出文件在 E 盘根目录下
输出文件名为:data.txt;
*******************************************************************************
************************************************************************
程序功能说明:本程序可以计算任意长度线型开始网络潮流;
支持多电压等级下的计算;
可在除供电节点外任意节点引出负载;
*******************************************************************************
************************************************************************
输入格式说明:以支路为基本单位,按潮流方向输入数据:
以下例示意:
2
1,110,118,8.5,20.5,0.000564,0,0,1,0,0
2,11,110,1.22,20.2,0,40,30,10,0.17,1.7
//支路个数
//线路等效的支路
//变压器等效的支路
.
.
.
//按此方式知道输入所有的支
//输入从上到下的顺序为潮流
//线型开式网络中的流动方向
路
在
/*
第一行输入支路个数,回车
第二行至后输入各个支路参数,回车分隔不同支路;
各行输入的支路参数顺序是:
支路编号,末端电压,始端电压,线路等效电阻,线路等效感抗,线路等效
容纳,末端输入有功,末端输入无功,变比,变压器有功励磁损耗,变压器无功励磁损耗
对于线路等效电路:变压器有功/无功损耗输入零,变比输入 1;
对于变压器等效电路:所有的参数均归算至高压侧,Rt,Xt 对应输入线路等效电阻
/感抗的位置,线路等效容抗为零;
对于个节点的引出负荷:输入至以此节点为末节点的支路的末端输入有功/无功部
分;
*/
*******************************************************************************
*************************************************************************
输出文件格式说明:输出的内容包括
(1)支路信息:每个支路元件的始端有功、无功和末端有功、无功;有
功损耗无功损耗;电压损耗;
(2)全网信息:全网的总电源有功、总负荷有功、有功损耗、网损率;
(3)迭代信息:每次完整迭代后的所有内容;
具体在输出文件中都明确标出。
*******************************************************************************
**************************************************************************
程序中变量定义说明:
类中定义的变量
class line_part{
double U[2];
横分量,U[1]电压降落纵分量
double k;
double val;
double U_end;
double U_begin;
double X[3];
感抗,X[2]容纳
double S_end[2];
S_end[1]无功
double S_begin[2];
S_begin[1]无功
double S0[2];
S0[1]无功
double S_org[2];
S_org[1]无功
line_part *lchild,*rchild;
}
class BinTree{
//定义支路类
//支路电压降落:U[0]电压降落
//变压器变比
//支路排序
//支路末端电压
//支路首段电压
//支路等效阻抗: X[0]电阻,X[1]
//支路末端功率:S_end[0]有功,
//支路首段功率:S_begin[0]有功,
//变压器励磁损耗:S0[0]有功,
//支路末端负载:S_org[0]有功,
//支路的后继两个支路
//定义树类
void PreOrder(){PreOrder(root);};
//树的先序遍历修改电压
void PostOrder(){PostOrder(root);};
//树的后序遍历修改潮流
void display(){display(root);};
//树的先序遍历显示数据
line_part *root;
};
//树的根,是一个支路类
主函数中定义的数据
ofstream outfile;
ifstream infile;
const int M(a);
//输出数据流定
//输入数据流定
//支路个数常量
主程序(复制粘贴到 C++就能用)
*******************************************************************************
*******************************************************************************
#include
#include
#include
double p_cost_all=0;
double sqr(double x){
return x*x;};
class line_part{
private:
double val;
double U_end;
double U_begin;
double X[3];
感抗,X[2]容纳
double S_end[2];
S_end[1]无功
double S_begin[2];
S_begin[1]无功
double S0[2];
S0[1]无功
double S_org[2];
S_org[1]无功
line_part *lchild,*rchild;
public:
double U[2];
横分量,U[1]电压降落纵分量
double k;
public:
//平方计算函数
//定义支路类
//支路排序
//支路末端电压
//支路首段电压
//支路等效阻抗: X[0]电阻,X[1]
//支路末端功率:S_end[0]有功,
//支路首段功率:S_begin[0]有功,
//变压器励磁损耗:S0[0]有功,
//支路末端负载:S_org[0]有功,
//支路电压降落:U[0]电压降落
//变压器变比
line_part(){
val=0;
U_end=0;U_begin=0;X[0]=0;X[1]=0;
[1]=S_org[1]=0;
X[2]=0;S_end[0]=S_org[0]=0;S_end
S_begin[0]=0;S_begin[1]=0;k=1;
S0[0]=0;S0[1]=0;U[0]=0;U[1]=0;
lchild = rchild= NULL;
}
line_part(double vall,double u_end=0,double u_begin=0,double r=0,
double x=0,double b=0,double
Pe=0,double Xe=0,double K=0,double P0=0,double Q0=0){
U_end=u_end;
U_begin=u_begin;
val=vall;
X[0]=r;
X[1]=x;
X[2]=b;
S_end[0]=S_org[0]=Pe;
S_end[1]=S_org[1]=Xe;
S_begin[0]=0;
S_begin[1]=0;
k=K;
S0[0]=P0;
U[0]=0;
U[1]=0;
lchild
=
S0[1]=Q0;
rchild= NULL;
};
friend class BinTree;
friend void pass_U(line_part*a,line_part*b,line_part*c);
//电压传递函数
friend void pass_w(line_part*a,line_part*b,line_part*c);
//功率传递函数
friend void pass_U2(line_part*a,line_part*b);
//电压传递函数
friend void pass_w2(line_part*a,line_part*b);
//功率传递函数
void Sbegin(){
(U_end)*X[2]/2))/sqr(Uend);
;
-sqr(U_begin)*X[2]/2-sqr(U_end)*X[2]/2;
};
void Uend(){
double U_heng(0),U_zong(0);
//U_heng 即是△u2
//U_zong 即是δu2
X[2]/2-S0[1];
1])/U_begin;
0])/U_begin;
sqr(U_zong))/k;
double get_val(){
};
//支路首段功率计算函数
double Uend,I2;
Uend=k*U_end;
I2=(sqr(S_end[0])+sqr(S_end[1]-sqr
S_begin[0]=S_end[0]+I2*X[0]+S0[0]
S_begin[1]=S_end[1]+I2*X[1]+S0[1]
//支路末端电压计算函数
double p_begin,q_begin;
p_begin=S_begin[0]-S0[0];
q_begin=S_begin[1]+sqr(U_begin)*
U_heng=(p_begin*X[0]+q_begin*X[
U_zong=(p_begin*X[1]-q_begin*X[
U_end=sqrt(sqr(U_begin-U_heng)+
U[0]=U_heng;
U[1]=U_zong;
};
//返回支路编号
if(this==0){return -1;}else{
if(val>0&&val<100) {return val;}
else return -1;
}
//返回支路末端电压
//返回支路首段电压
return U_begin;};
//返回支路首段有功
return S_begin[0];};
//返回支路末端有功
//返回支路首段无功
return S_begin[1];};
//返回支路末端无功
//返回支路有功损耗
//返回支路无功损耗
//返回支路无功损耗
//返回支路无功损耗
double get_Uend(){
return U_end;
};
double get_Ubegin(){
double get_Pbegin(){
double get_Pend(){
return S_end[0];};
double get_Qbegin(){
double get_Qend(){
return S_end[1];};
double get_Pcost(){
return S_begin[0]-S_end[0];};
double get_Qcost(){
return S_begin[1]-S_end[1];};
line_part *get_lchild(){
return lchild;};
line_part *get_rchild(){
return rchild;};
};
void pass_U(line_part *a,line_part *b,line_part *c){
(*c).U_begin=(*a).U_end;
(*b).U_begin=(*a).U_end;
};
void pass_w(line_part *a,line_part *b,line_part *c){
(*a).S_end[0]=(*b).S_begin[0]+(*c).S_begin[0]+(*a).S_org[0];
(*a).S_end[1]=(*b).S_begin[1]+(*c).S_begin[1]+(*a).S_org[1];
};
void pass_U2(line_part *a,line_part *b){
(*b).U_begin=(*a).U_end;
};
void pass_w2(line_part *a,line_part *b){
(*a).S_end[0]=(*b).S_begin[0]+(*a).S_org[0];