关于牛顿法计算潮流问题bug解决

关于牛顿法计算潮流问题bug解决

  • 1.数据输入和导纳矩阵计算
    • 新的改变
    • 求节点注入功率的不平衡量
    • 求雅可比矩阵,解修正方程
    • 修正节点电压
    • 求支路功率

研究中做仿真准备自己跑一下潮流计算做状态估计,但是发现大佬写的总线修正量未作排序,导致结果出现问题,现在手动修改出问题的地方。( 原文地址),精髓就在于更改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积分,解题不易)

你可能感兴趣的:(matlab,数学,bug,matlab,潮流计算,牛顿法,PQ分解法)