关于牛顿法计算潮流问题bug解决
研究中做仿真准备自己跑一下潮流计算做状态估计,但是发现大佬写的总线修正量未作排序,导致结果出现问题,现在手动修改出问题的地方。( 原文地址),精髓就在于更改creat_Y函数,作用是系统自带函数求取感抗矩阵要按顺序读取,现修改见下文。关于总线及发电机矩阵mpc.bus/branch排序见主函数 (牛顿潮流计算main函数),有背景知识的直接取用,其他用户可以移步牛顿潮流计算main函数(在文章顶部展示)。
1.数据输入和导纳矩阵计算
输入电力系统节点、支路、发电机的基本参数,形成导纳矩阵;本文选用IEEE30节点进行测试,matlab代码如下:
新的改变
IEEE30.m:
function mpc = IEEE30
mpc_version = '2';
%% system MVA base
mpc_baseMVA = 100;
%% bus data
% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin
mpc_bus = [
1 3 0 0 0 0 1 1 0 135 1 1.05 0.95;
2 2 21.7 12.7 0 0 1 1 0 135 1 1.1 0.95;
3 1 2.4 1.2 0 0 1 1 0 135 1 1.05 0.95;
4 1 7.6 1.6 0 0 1 1 0 135 1 1.05 0.95;
5 1 0 0 0 0.19 1 1 0 135 1 1.05 0.95;
6 1 0 0 0 0 1 1 0 135 1 1.05 0.95;
7 1 22.8 10.9 0 0 1 1 0 135 1 1.05 0.95;
8 1 30 30 0 0 1 1 0 135 1 1.05 0.95;
9 1 0 0 0 0 1 1 0 135 1 1.05 0.95;
10 1 5.8 2 0 0 3 1 0 135 1 1.05 0.95;
11 1 0 0 0 0 1 1 0 135 1 1.05 0.95;
12 1 11.2 7.5 0 0 2 1 0 135 1 1.05 0.95;
13 2 0 0 0 0 2 1 0 135 1 1.1 0.95;
14 1 6.2 1.6 0 0 2 1 0 135 1 1.05 0.95;
15 1 8.2 2.5 0 0 2 1 0 135 1 1.05 0.95;
16 1 3.5 1.8 0 0 2 1 0 135 1 1.05 0.95;
17 1 9 5.8 0 0 2 1 0 135 1 1.05 0.95;
18 1 3.2 0.9 0 0 2 1 0 135 1 1.05 0.95;
19 1 9.5 3.4 0 0 2 1 0 135 1 1.05 0.95;
20 1 2.2 0.7 0 0 2 1 0 135 1 1.05 0.95;
21 1 17.5 11.2 0 0 3 1 0 135 1 1.05 0.95;
22 2 0 0 0 0 3 1 0 135 1 1.1 0.95;
23 2 3.2 1.6 0 0 2 1 0 135 1 1.1 0.95;
24 1 8.7 6.7 0 0.04 3 1 0 135 1 1.05 0.95;
25 1 0 0 0 0 3 1 0 135 1 1.05 0.95;
26 1 3.5 2.3 0 0 3 1 0 135 1 1.05 0.95;
27 2 0 0 0 0 3 1 0 135 1 1.1 0.95;
28 1 0 0 0 0 1 1 0 135 1 1.05 0.95;
29 1 2.4 0.9 0 0 3 1 0 135 1 1.05 0.95;
30 1 10.6 1.9 0 0 3 1 0 135 1 1.05 0.95;
];
%% generator data
% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf
mpc.gen = [
1 23.54 0 150 -20 1 100 1 80 0 0 0 0 0 0 0 0 0 0 0 0;
2 60.97 0 60 -20 1 100 1 80 0 0 0 0 0 0 0 0 0 0 0 0;
22 21.59 0 62.5 -15 1 100 1 50 0 0 0 0 0 0 0 0 0 0 0 0;
27 26.91 0 48.7 -15 1 100 1 55 0 0 0 0 0 0 0 0 0 0 0 0;
23 19.2 0 40 -10 1 100 1 30 0 0 0 0 0 0 0 0 0 0 0 0;
13 37 0 44.7 -15 1 100 1 40 0 0 0 0 0 0 0 0 0 0 0 0;
];
%% branch data
% fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax
mpc.branch = [
1 2 0.02 0.06 0.03 130 130 130 0 0 1 -360 360;
1 3 0.05 0.19 0.02 130 130 130 0 0 1 -360 360;
2 4 0.06 0.17 0.02 65 65 65 0 0 1 -360 360;
3 4 0.01 0.04 0 130 130 130 0 0 1 -360 360;
2 5 0.05 0.2 0.02 130 130 130 0 0 1 -360 360;
2 6 0.06 0.18 0.02 65 65 65 0 0 1 -360 360;
4 6 0.01 0.04 0 90 90 90 0 0 1 -360 360;
5 7 0.05 0.12 0.01 70 70 70 0 0 1 -360 360;
6 7 0.03 0.08 0.01 130 130 130 0 0 1 -360 360;
6 8 0.01 0.04 0 32 32 32 0 0 1 -360 360;
6 9 0 0.21 0 65 65 65 0 0 1 -360 360;
6 10 0 0.56 0 32 32 32 0 0 1 -360 360;
9 11 0 0.21 0 65 65 65 0 0 1 -360 360;
9 10 0 0.11 0 65 65 65 0 0 1 -360 360;
4 12 0 0.26 0 65 65 65 0 0 1 -360 360;
12 13 0 0.14 0 65 65 65 0 0 1 -360 360;
12 14 0.12 0.26 0 32 32 32 0 0 1 -360 360;
12 15 0.07 0.13 0 32 32 32 0 0 1 -360 360;
12 16 0.09 0.2 0 32 32 32 0 0 1 -360 360;
14 15 0.22 0.2 0 16 16 16 0 0 1 -360 360;
16 17 0.08 0.19 0 16 16 16 0 0 1 -360 360;
15 18 0.11 0.22 0 16 16 16 0 0 1 -360 360;
18 19 0.06 0.13 0 16 16 16 0 0 1 -360 360;
19 20 0.03 0.07 0 32 32 32 0 0 1 -360 360;
10 20 0.09 0.21 0 32 32 32 0 0 1 -360 360;
10 17 0.03 0.08 0 32 32 32 0 0 1 -360 360;
10 21 0.03 0.07 0 32 32 32 0 0 1 -360 360;
10 22 0.07 0.15 0 32 32 32 0 0 1 -360 360;
21 22 0.01 0.02 0 32 32 32 0 0 1 -360 360;
15 23 0.1 0.2 0 16 16 16 0 0 1 -360 360;
22 24 0.12 0.18 0 16 16 16 0 0 1 -360 360;
23 24 0.13 0.27 0 16 16 16 0 0 1 -360 360;
24 25 0.19 0.33 0 16 16 16 0 0 1 -360 360;
25 26 0.25 0.38 0 16 16 16 0 0 1 -360 360;
25 27 0.11 0.21 0 16 16 16 0 0 1 -360 360;
28 27 0 0.4 0 65 65 65 0 0 1 -360 360;
27 29 0.22 0.42 0 16 16 16 0 0 1 -360 360;
27 30 0.32 0.6 0 16 16 16 0 0 1 -360 360;
29 30 0.24 0.45 0 16 16 16 0 0 1 -360 360;
8 28 0.06 0.2 0.02 32 32 32 0 0 1 -360 360;
6 28 0.02 0.06 0.01 32 32 32 0 0 1 -360 360;
];
end
系统数据直接用matpower里的数据,方便进行结果的对比,计算导纳矩阵懒得写,直接用的matpower工具箱里的子函数:
function Y = creat_Y(branch)
zl=branch(:,1:4);
G=zeros(n,n);
B=zeros(n,n);
nzl=size(zl,1);
for k=1:nzl
i=zl(k,1);
j=zl(k,2);
h=zl(k,3)*zl(k,3)+zl(k,4)*zl(k,4);
f=zl(k,3)/h; % branch conductance支路电导率
g=-zl(k,4)/h; % branch susceptance
G(i,i)=G(i,i)+f;
G(j,j)=G(j,j)+f;
B(i,i)=B(i,i)+g;
B(j,j)=B(j,j)+g;
G(i,j)=G(i,j)-f;
G(j,i)=G(j,i)-f;
B(i,j)=B(i,j)-g;
B(j,i)=B(j,i)-g;
end
Y=full(complex(G,B));
end
求节点注入功率的不平衡量
对应的子函数如下:
function [ dP,dQ,Pi,Qi] = Unbalanced( n,m,P,Q,U,G,B,cita )
%计算ΔPi有功的不平衡量
for i=1:n
for j=1:n
Pn(j)=U(i)*U(j)*(G(i,j)*cos(cita(i)-cita(j))+B(i,j)*sin(cita(i)-cita(j)));
end
Pi(i)=sum(Pn);
end
dP=P(1:n-1)-Pi(1:n-1); %dP有n-1个
%计算ΔQi无功的不平衡量
for i=1:n
for j=1:n
Qn(j)=U(i)*U(j)*(G(i,j)*sin(cita(i)-cita(j))-B(i,j)*cos(cita(i)-cita(j)));
end
Qi(i)=sum(Qn);
end
dQ=Q(1:m)-Qi(1:m); %dQ有m个
end
求雅可比矩阵,解修正方程
解修正方程,就可以得到节点电压的修正量。这部分对应的matlab代码如下:
% Jacobi: 计算雅可比矩阵
function [ J ] = Jacobi( n,m,U,cita,B,G,Pi,Qi )
%雅可比矩阵的计算
%分块 H N K L
%i!=j时
for i=1:n-1
for j=1:n-1
H(i,j)=-U(i)*U(j)*(G(i,j)*sin(cita(i)-cita(j))-B(i,j)*cos(cita(i)-cita(j)));
end
end
for i=1:n-1
for j=1:m
N(i,j)=-U(i)*U(j)*(G(i,j)*cos(cita(i)-cita(j))+B(i,j)*sin(cita(i)-cita(j)));
end
end
for i=1:m
for j=1:n-1
K(i,j)=U(i)*U(j)*(G(i,j)*cos(cita(i)-cita(j))+B(i,j)*sin(cita(i)-cita(j)));
end
end
for i=1:m
for j=1:m
L(i,j)=-U(i)*U(j)*(G(i,j)*sin(cita(i)-cita(j))-B(i,j)*cos(cita(i)-cita(j)));
end
end
%i==j时
for i=1:n-1
H(i,i)=U(i).^2*B(i,i)+Qi(i);
end
for i=1:m
N(i,i)=-U(i).^2*G(i,i)-Pi(i);
end
for i=1:m
K(i,i)=U(i).^2*G(i,i)-Pi(i);
end
for i=1:m
L(i,i)=U(i).^2*B(i,i)-Qi(i);
end
%合成雅可比矩阵
J=[H N;K L];
end
修正节点电压
将各个节点的电压加上修正量,并返回第一步继续迭代。
% function:求节点电压修正量
function [ dU,dcita ] = Correct( n,m,U,dP,dQ,J )
%求解节点电压修正量
for i=1:m
Ud2(i,i)=U(i);
end
dPQ=[dP dQ]';
dUcita=(-inv(J)*dPQ)';
dcita=dUcita(1:n-1);
dcita=[dcita 0];
dU=(Ud2*dUcita(n:n+m-1)')';
dU=[dU zeros(1,n-m)];
end
求支路功率
迭代完成后,还需要求出支路功率,计算公式在上文中已经介绍过了。这部分的matlab代码如下:
% line_power函数:用于计算支路功率
function Sij = line_power( n,y,U,cita )
for i=1:n
U1(i)=complex(U(i)*cos(cita(i)),U(i)*sin(cita(i)));
for j=1:n
U1(j)=complex(U(j)*cos(cita(j)),U(j)*sin(cita(j)));
Sij(i,j)=U1(i)*conj((U1(i)-U1(j))*y(i,j));
end
end
end
主函数见顶部资源(5积分,解题不易)