⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tlf14.m

📁 电力系统潮流计算的MATLAB源码 。
💻 M
字号:
clear
clc
[baseMVA, bus, gen, branch, areas, gencost] = c14 ;
n=length(bus(:,1));
m=length(gen(:,1));
PQ      = 1;
PV      = 2;
REF     = 3;
NONE    = 4;
i2e = bus(:, 1);
e2i = zeros(max(i2e), 1);
e2i(i2e) = [1:size(bus, 1)]';
bus(:, 1)               = e2i( bus(:, 1)            );
gen(:, 1)             = e2i( gen(:, 1)          );
branch(:, 1)            = e2i( branch(:, 1)         );
branch(:, 2)            = e2i( branch(:, 2)         );
nb = size(bus, 1);
ng = size(gen, 1);
Cg = sparse(gen(:, 1), [1:ng]', gen(:, 8) > 0, nb, ng);  %% gen connection matrix
                                        % element i, j is 1 if, generator j at bus i is ON
bus_gen_status = Cg * ones(ng, 1);      %% number of generators at each bus that are ON

%% form index lists for slack, PV, and PQ buses
ref = find(bus(:, 2) == REF & bus_gen_status);   %% reference bus index
pv  = find(bus(:, 2) == PV  & bus_gen_status);   %% PV bus indices
pq  = find(bus(:, 2) == PQ | ~bus_gen_status);   %% PQ bus indices

%% pick a new reference bus if for some reason there is none (may have been shut down)
if isempty(ref)
    ref = pv(1);                %% use the first PV bus
    pv = pv(2:length(pv));      %% take it off PV list
end
on = find(gen(:, 8) > 0);      %% which generators are on?
gbus = gen(on, 1);                %% what buses are they at?

%% form net complex bus power injection vector
nb = size(bus, 1);
ngon = size(on, 1);
Cg = sparse(gbus, [1:ngon]', ones(ngon, 1), nb, ngon);  %% connection matrix
                                                        %% element i, j is 1 if
                                                        %% gen on(j) at bus i is ON
Sbus =  ( Cg * (gen(on, 2) + j * gen(on, 3)) ...  %% power injected by generators
            - (bus(:, 3) + j * bus(:, 4)) ) / ... %% plus power injected by loads
        baseMVA;                                    %% converted to p.u.
Sbus=Sbus.';
nb = size(bus, 1);          %% number of buses
nl = size(branch, 1);       %% number of lines

%% define named indices into bus, branch matrices

%% check that bus numbers are equal to indices to bus (one set of bus numbers)
if any(bus(:, 1) ~= [1:nb]')
    error('buses must appear in order by bus number')
end

%% for each branch, compute the elements of the branch admittance matrix where
%%
%%      | If |   | Yff  Yft |   | Vf |
%%      |    | = |          | * |    |
%%      | It |   | Ytf  Ytt |   | Vt |
%%
stat = branch(:, 11);                    %% ones at in-service branches
Ys = stat ./ (branch(:, 3) + j * branch(:, 4));   %% series admittance
Bc = stat .* branch(:, 5);                           %% line charging susceptance
tap = ones(nl, 1);                              %% default tap ratio = 1
i = find(branch(:, 9));                       %% indices of non-zero tap ratios
tap(i) = branch(i, 9);                        %% assign non-zero tap ratios
tap = tap .* exp(-j*pi/180 * branch(:, 10)); %% add phase shifters
Ytt = Ys + j*Bc/2;
Yff = Ytt ./ (tap .* conj(tap));
Yft = - Ys ./ conj(tap);
Ytf = - Ys ./ tap;

%% compute shunt admittance
%% if Psh is the real power consumed by the shunt at V = 1.0 p.u.
%% and Qsh is the reactive power injected by the shunt at V = 1.0 p.u.
%% then Psh - j Qsh = V * conj(Ysh * V) = conj(Ysh) = Gs - j Bs,
%% i.e. Ysh = Psh + j Qsh, so ...
Ysh = (bus(:, 5) + j * bus(:, 6)) / baseMVA;  %% vector of shunt admittances

%% build Ybus
f = branch(:, 1);                           %% list of "from" buses
t = branch(:, 2);                           %% list of "to" buses
Cf = sparse(f, 1:nl, ones(nl, 1), nb, nl);      %% connection matrix for line & from buses
Ct = sparse(t, 1:nl, ones(nl, 1), nb, nl);      %% connection matrix for line & to buses
Ybus = spdiags(Ysh, 0, nb, nb) + ...            %% shunt admittance
    Cf * spdiags(Yff, 0, nl, nl) * Cf' + ...    %% Yff term of branch admittance
    Cf * spdiags(Yft, 0, nl, nl) * Ct' + ...    %% Yft term of branch admittance
    Ct * spdiags(Ytf, 0, nl, nl) * Cf' + ...    %% Ytf term of branch admittance
    Ct * spdiags(Ytt, 0, nl, nl) * Ct';         %% Ytt term of branch admittance

%% Build Yf and Yt such that Yf * V is the vector of complex branch currents injected
%% at each branch's "from" bus, and Yt is the same for the "to" bus end
if nargout > 1
    i = [[1:nl]'; [1:nl]'];     %% double set of row indices    
    Yf = sparse(i, [f; t], [Yff; Yft], nl, nb);
    Yt = sparse(i, [f; t], [Ytf; Ytt], nl, nb);
end
P=real(Sbus);
 Q=imag(Sbus);
 Qmin=gen(:,5);
  Qmax=gen(:,4);

V=ones(1,n);
e1=real(V);
f1=imag(V);
G=real(Ybus);
B=imag(Ybus);
B1=B;
G1=G;
ce=zeros(1,n-1);
cf=zeros(1,n-1);
 for iter=1:5
    ce1=[1.06 ce];
    cf1=[0 cf];
    e=e1(2:n);
    f=f1(2:n);
    e1=[0 e]+ce1;
    f1=[0 f]+cf1;
   cP=diag(e1)*(G*e1'-B*f1')+diag(f1)*(B*e1'+G*f1');
      cQ=-diag(e1)*(G1*f1'+B1*e1')+diag(f1)*(-B1*f1'+G1*e1');
      cQ1=cQ;
      J11 =diag(e1)*G+diag(f1)*B-diag(B*f1');;
     J12 =-diag(e1)*B+diag(f1)*G+diag(B*e1');
     J21 =diag(f1)*G1-diag(e1)*B1-diag(G*f1');
     J22 =-diag(e1)*G1-diag(f1)*B1+diag(G*e1');
      for i=2:m
          x=gen(i,1);
          if cQ1(x)<Qmin(i)
              Q(x)=Qmin(i);
              elseif cQ1(x)>Qmax(i)
              Q(x)=Qmax(i);  
          else
               Q(x)=gen(i,6)^2;
       cQ(x)=e1(x)^2+f1(x)^2;
       J21(x,:)=0;
      J22(x,:)=0;
      J21(x,x)=2*e1(x);
       J22(x,x)=2*f1(x);
      end
      end
  PQ=[P Q]';
cPQ=[cP' cQ'];
   chPQ=PQ-cPQ';
    c1=chPQ(2:n);
     c2=chPQ(n+2:2*n);
    C=[c1;c2];
     J=[J11(2:n,2:n) J12(2:n,2:n) ;J21(2:n,2:n) J22(2:n,2:n)];
  chV=inv(J)*C;
    ce=(chV(1:n-1))';
    cf=(chV(n:2*(n-1)))';
 end
V=e1+j*f1;
for i=1:nl
    x=branch(i,1);
     y=branch(i,2);
     LF(i)=V(x)*conj(Ys(i)*(V(x)-V(y)));
        LF1(i)=V(y)*conj(Ys(i)*(V(x)-V(y)));
end
   
 [abs(V.') (180/pi)*angle(V.') baseMVA*cP baseMVA*cQ1]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -