电网潮流计算程序C++版本
看大家在人人上发了各种电力系统作业,刚编完我也来得瑟一下吧,基本上可以解决开式单直网络和树状网络的计算。树状网络计算时要自己先设定好支路的起始节点和终止节点标号以及计算顺序,本来想做一个树状图的的深度遍历来进行自动排序,不过从网上找到一个深度遍历代码太长,在此就偷个懒把顺序自己输进去了。测试后3-4,3-3, 以及例3-2答案基本正确。另外fun3是不加入横向电压分量计算的函数,在例3-2计算用的是这个函数。另外就是迭代终止条件的问题上我只是设定固定迭代次数为3,也可以用精度来限定,大致就是如此吧。请大家多多指教了。源代码: #include
#include
#include
#include
using namespace std;
struct node{//节点类
int i;//节点编号
double U,P,Q,delta;//额定电压 计算负荷 电压相角
};
struct line{//线路类 连接父节点子节点
node f_node,s_node;//父节点 子节点
double R,X,B;//线路参数R X B/2
double P_in,Q_in,P_out,Q_out,d_P,d_Q,D_U,d_U;//线路输入输出功率以及线路消耗功率
void Set_node(node nod1,node nod2){
f_node=nod1;
s_node=nod2;
}
};
void fun1(line &lin){//由后往前递推功率
double p=lin.P_out;
double q=lin.Q_out;
double u=lin.s_node.U;
lin.d_P=(p*p+q*q)/u/u*lin.R;
lin.d_Q=(p*p+q*q)/u/u*lin.X;
lin.P_in=lin.d_P+lin.P_out;
lin.Q_in=lin.d_Q+lin.Q_out;
};
void fun2(line &lin){//由前往后推电压
double p=lin.P_in;
double q=lin.Q_in;
double u=lin.f_node.U;
lin.D_U=(p*lin.R+q*lin.X)/u;
lin.d_U=(p*lin.X-q*lin.R)/u;
lin.s_node.U=sqrt(pow(lin.f_node.U-lin.D_U,2)+pow(lin.d_U,2));//子节点电压
lin.s_node.delta=lin.f_node.delta-atan(lin.d_U/(lin.f_node.U-lin.D_U));
};
void fun3(line &lin){//由前往后推电压不计横向分量
double p=lin.P_in;
double q=lin.Q_in;
double u=lin.f_node.U;
lin.D_U=(p*lin.R+q*lin.X)/u;
lin.d_U=(p*lin.X-q*lin.R)/u;
lin.s_node.U=lin.f_node.U-lin.D_U,2;//子节点电压
lin.s_node.delta=lin.f_node.delta-atan(lin.d_U/(lin.f_node.U-lin.D_U)); };
void main(){
int num_l;
int num_n;//支路数 节点数
ifstream fin;
fin.open("E:\\data.txt");
fin>>num_n>>num_l;//输入节点数支路数
ofstream fout;
fout.open("E:\\databak.txt");
node *nod;
nod=new node[num_n];//节点数目
line *lin;
lin=new line[num_l];//线路数目
nod[0].delta=0;
double *u;//节点额定电压
u=new double[num_n];
for(int i=0;i
fin>>u[i];
};
double *p;//节点有功功率
p=new double[num_n];
for(int i=0;i
fin>>p[i];
};
double *q;//节点无功功率
q=new double[num_n];
for(int i=0;i
fin>>q[i];
};
for(int i=0;i
nod[i].i=i;
nod[i].P=p[i];
nod[i].Q=q[i];
nod[i].U=u[i];
};
double *r;//线路电阻
r=new double[num_l];
for(int i=0;i
fin>>r[i];
};
double *x;//线路电抗
x=new double[num_l];
for(int i=0;i
fin>>x[i];
};
double *b;//线路电纳
b=new double[num_l];
for(int i=0;i
fin>>b[i];
};
for(int i=0;i
lin[i].R=r[i];
lin[i].X=x[i];
lin[i].B=b[i];
};
for(int i=0;i
fin>>lin[i].f_node.i;
fin>>lin[i].s_node.i;
};
for(int i=0;i
nod[lin[i].f_node.i].Q-=lin[i].B*nod[lin[i].f_node.i].U*nod[lin[i].f_node.i].U; nod[lin[i].s_node.i].Q-=lin[i].B*nod[lin[i].s_node.i].U*nod[lin[i].s_node.i].U; };
double *P_c,*Q_c;//保存运算负荷数据
P_c=new double[num_n];
Q_c=new double[num_n];
for(int tc=0;tc
P_c[tc]=nod[tc].P;
Q_c[tc]=nod[tc].Q;
};
for(int i=0;i
lin[i].Set_node(nod[lin[i].f_node.i],nod[lin[i].s_node.i]);
};
for(int re=0;re
fout
double to_P(0),to_dP(0);
for(int i=1;i
to_P+=nod[i].P;
};
for(int tc=0;tc
nod[tc].P=P_c[tc];
nod[tc].Q=Q_c[tc];
};
for(int ts=0;ts
lin[ts].Q_out=lin[ts].s_node.Q;
};
for(int i=0;i
lin[i].Set_node(nod[lin[i].f_node.i],nod[lin[i].s_node.i]);
};
int j=num_l-1;//反向求各支路功率损耗和功率分布
for(j=num_l-1;j>0;j--){
fun1(lin[j]);
nod[lin[j].f_node.i].P+=lin[j].P_in;
nod[lin[j].f_node.i].Q+=lin[j].Q_in;
for(int i=0;i
lin[i].Set_node(nod[lin[i].f_node.i],nod[lin[i].s_node.i]);
};
for(int ts=0;ts
lin[ts].P_out=lin[ts].s_node.P;
lin[ts].Q_out=lin[ts].s_node.Q;
};
};
fun1(lin[j]);
for(int i=0;i
lin[i].Set_node(nod[lin[i].f_node.i],nod[lin[i].s_node.i]);
};
int t=0;//求线路各点电压
for(t=0;t
fun2(lin[t]);
nod[lin[t].s_node.i].U=lin[t].s_node.U;
nod[lin[t].s_node.i].delta=lin[t].s_node.delta;
for(int i=0;i
lin[i].Set_node(nod[lin[i].f_node.i],nod[lin[i].s_node.i]);
};
};
fun2(lin[t]);
nod[lin[t].s_node.i].U=lin[t].s_node.U;
nod[lin[t].s_node.i].delta=lin[t].s_node.delta;
fout
for(int i=0;i
fout
fout
fout
fout
};
fout
for(int i=0;i
fout
fout
double *lu;//求最低电压及最低电压点
lu=new double[num_n];
int *lua;
lua=new int[num_n];
for(int i=0;i
lu[i]=nod[i].U;
lua[i]=i;
};
for(int i=0;i
if(lu[i]
double st;
int a;
st=lu[i];
a=lua[i];
lu[i]=lu[i+1];
lua[i]=lua[i+1];
lu[i+1]=st;
lua[i+1]=a;
};
};
for(int i=0;i
to_dP+=lin[i].d_P;
};
fout
fout
fout
fout
fout
fout
delete[]lua;
};
delete[]nod;
delete[]lin;
delete[]u;
delete[]p;
delete[]q;
delete[]r;
delete[]x;
delete[]b;
}
附:3-4的data 文件
3 2
113 110 100
0 0.17 20
0 1.7 15
8.5 1.22
20.5 20.2
0.000282 0
0 1
1 2输出为:第1次迭代
支路信息:
支路1-2:
始端功率:1.02165+j0.693296 末端功率:1.00434+j0.658675 功率损耗:0.0173106+j0.0346211 电压损耗0.274063
支路2-3:
始端功率:0.5034+j0.3068 末端功率:0.5+j0.3
功率损耗:0.0034+j0.0068 电压损耗0.109
支路2-4:
始端功率:0.200938+j0.151875 末端功率:0.2+j0.15
功率损耗:0.0009375+j0.001875 电压损耗0.0739643
节点信息:
节点1
电压:10.5相角:0
节点2
电压:10.2259相角:-0.864932 节点3
电压:10.1169相角:-1.25281 节点4
电压:10.152相角:-1.072
全网信息:
总电源有功:1.02165
总负荷有功:1
总有功损耗:0.0216481
网损率:0.0107081
最低电压:10.1169最低电压点:3 第2次迭代
支路信息:
支路1-2:
始端功率:1.02078+j0.69156 末端功率:1.00423+j0.658463 功率损耗:0.0165484+j0.0330969 电压损耗0.273567
支路2-3:
始端功率:0.503322+j0.306644 末端功率:0.5+j0.3
功率损耗:0.00332186+j0.00664371 电压损耗0.108957
支路2-4:
始端功率:0.20091+j0.151819 末端功率:0.2+j0.15
功率损耗:0.000909642+j0.00181928 电压损耗0.0739403
节点信息:
节点1
电压:10.5相角:0
节点2
电压:10.2264相角:-0.86489 节点3
电压:10.1175相角:-1.25273 节点4
电压:10.1525相角:-1.07194 全网信息:
总电源有功:1.02078
总负荷有功:1.70434
总有功损耗:0.0207799
网损率:0.00762533
最低电压:10.1175最低电压点:3 第3次迭代
支路信息:
支路1-2:
始端功率:1.02078+j0.691556 末端功率:1.00423+j0.658462 功率损耗:0.0165468+j0.0330936 电压损耗0.273566
支路2-3:
始端功率:0.503322+j0.306643 末端功率:0.5+j0.3
功率损耗:0.0033215+j0.00664301 电压损耗0.108957
支路2-4:
始端功率:0.20091+j0.151819 末端功率:0.2+j0.15
功率损耗:0.000909549+j0.0018191 电压损耗0.0739402
节点信息:
节点1
电压:10.5相角:0
节点2
电压:10.2264相角:-0.86489 节点3
电压:10.1175相角:-1.25273 节点4
电压:10.1525相角:-1.07194 全网信息:
总电源有功:1.02078
总负荷有功:1.70423
总有功损耗:0.0207778
网损率:0.00762487
最低电压:10.1175最低电压点:3 例3-2的data :
4 3
10.5 10 10 10
0 0.3 0.5 0.2
0 0.2 0.3 0.15
1.2 1 1.5
2.4 2 3
0 0 0
0 1
1 2
1 3
输出:
第1次迭代
支路信息:
支路1-2:
始端功率:1.02165+j0.693296
末端功率:1.00434+j0.658675 功率损耗:0.0173106+j0.0346211 电压损耗0.275227
支路2-3:
始端功率:0.5034+j0.3068 末端功率:0.5+j0.3
功率损耗:0.0034+j0.0068 电压损耗0.109244
支路2-4:
始端功率:0.200938+j0.151875 末端功率:0.2+j0.15
功率损耗:0.0009375+j0.001875 电压损耗0.0740389
节点信息:
节点1
电压:10.5相角:0
节点2
电压:10.2248相角:-0.864932 节点3
电压:10.1155相角:-1.2529 节点4
电压:10.1507相角:-1.07205 全网信息:
总电源有功:1.02165
总负荷有功:1
总有功损耗:0.0216481
网损率:0.0107081
最低电压:10.1155最低电压点:3 第2次迭代
支路信息:
支路1-2:
始端功率:1.02078+j0.69157 末端功率:1.00423+j0.658465 功率损耗:0.0165523+j0.0331045 电压损耗0.274734
支路2-3:
始端功率:0.503323+j0.306646 末端功率:0.5+j0.3
功率损耗:0.00332278+j0.00664556 电压损耗0.109201
支路2-4:
始端功率:0.20091+j0.15182 末端功率:0.2+j0.15
功率损耗:0.000909864+j0.00181973
电压损耗0.0740151
节点信息:
节点1
电压:10.5相角:0
节点2
电压:10.2253相角:-0.86489 节点3
电压:10.1161相角:-1.25282 节点4
电压:10.1513相角:-1.07199 全网信息:
总电源有功:1.02078
总负荷有功:1.70434
总有功损耗:0.0207849
网损率:0.00762714
最低电压:10.1161最低电压点:3 第3次迭代
支路信息:
支路1-2:
始端功率:1.02078+j0.691566 末端功率:1.00423+j0.658464 功率损耗:0.0165506+j0.0331013 电压损耗0.274733
支路2-3:
始端功率:0.503322+j0.306645 末端功率:0.5+j0.3
功率损耗:0.00332243+j0.00664486 电压损耗0.109201
支路2-4:
始端功率:0.20091+j0.15182 末端功率:0.2+j0.15
功率损耗:0.000909771+j0.00181954 电压损耗0.074015
节点信息:
节点1
电压:10.5相角:0
节点2
电压:10.2253相角:-0.86489 节点3
电压:10.1161相角:-1.25282 节点4
电压:10.1513相角:-1.07199 全网信息:
总电源有功:1.02078
总负荷有功:1.70423 总有功损耗:0.0207828 网损率:0.00762669
最低电压:10.1161最低电压点:3