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

📄 state_est.m

📁 电力系统计算软件
💻 M
字号:
function [V, converged, i] = state_est(branch, Ybus, Yf, Yt, Sbus, V0, ref, pv, pq, mpopt)%STATE_EST  Solves a state estimation problem.%   [V, converged, i] = state_est(branch, Ybus, Yf, Yt, Sbus, V0, ref, pv, pq, mpopt)%   State estimator (under construction) based on code from James S. Thorp.%   MATPOWER%   $Id: state_est.m,v 1.4 2005/07/08 18:58:34 ray Exp $%   by Ray Zimmerman, PSERC Cornell%   based on code by James S. Thorp, June 2004%   Copyright (c) 1996-2004 by Power System Engineering Research Center (PSERC)%   See http://www.pserc.cornell.edu/matpower/ for more info.[F_BUS, T_BUS, BR_R, BR_X, BR_B, RATE_A, RATE_B, RATE_C, ...    TAP, SHIFT, BR_STATUS, PF, QF, PT, QT, MU_SF, MU_ST, ...    ANGMIN, ANGMAX, MU_ANGMIN, MU_ANGMAX] = idx_brch;%% default argumentsif nargin < 10    mpopt = mpoption;end%% optionstol     = mpopt(2);max_it  = mpopt(3);verbose = mpopt(31);%% initializej = sqrt(-1);converged = 0;i = 0;nb = length(V0);nbr = size(Yf, 1);nref = [pv;pq];             %% indices of all non-reference busesf = branch(:, F_BUS);       %% list of "from" busest = branch(:, T_BUS);       %% list of "to" buses%%-----  evaluate Hessian  -----[dSbus_dVm, dSbus_dVa] = dSbus_dV(Ybus, V0);[dSf_dVa, dSf_dVm, dSt_dVa, dSt_dVm, Sf, St] = dSbr_dV(branch, Yf, Yt, V0);H = [    real(dSf_dVa)   real(dSf_dVm);    real(dSt_dVa)   real(dSt_dVm);    real(dSbus_dVa) real(dSbus_dVm);    speye(nb)       sparse(nb,nb);    imag(dSf_dVa)   imag(dSf_dVm);    imag(dSt_dVa)   imag(dSt_dVm);    imag(dSbus_dVa) imag(dSbus_dVm);    sparse(nb,nb)   speye(nb);];%% true measurementz = [    real(Sf);    real(St);    real(Sbus);    angle(V0);    imag(Sf);    imag(St);    imag(Sbus);    abs(V0);];%% create inverse of covariance matrix with all measurementsfullscale = 30;sigma = [    0.02 * abs(Sf)      + 0.0052 * fullscale * ones(nbr,1);    0.02 * abs(St)      + 0.0052 * fullscale * ones(nbr,1);    0.02 * abs(Sbus)    + 0.0052 * fullscale * ones(nb,1);    0.2 * pi/180 * 3*ones(nb,1);    0.02 * abs(Sf)      + 0.0052 * fullscale * ones(nbr,1);    0.02 * abs(St)      + 0.0052 * fullscale * ones(nbr,1);    0.02 * abs(Sbus)    + 0.0052 * fullscale * ones(nb,1);    0.02 * abs(V0)      + 0.0052 * 1.1 * ones(nb,1);] ./ 3;ns = length(sigma);W = spdiags( sigma .^ 2, 0, ns, ns );WInv = spdiags( 1 ./ sigma .^ 2, 0, ns, ns );%% covariance of measurement residual%R = H * inv( H' * WInv * H ) * H';%% measurement with errorerr = normrnd( zeros(size(sigma)), sigma );% err = zeros(size(z));% save err err % load err% err(10) = 900 * W(10,10);     %% create a bad measurementz = z + err;    %% use flat start for intial estimateV = ones(nb,1);%% compute estimated measurementSfe = V(f) .* conj(Yf * V);Ste = V(t) .* conj(Yt * V);Sbuse = V .* conj(Ybus * V);z_est = [    real(Sfe);    real(Ste);    real(Sbuse);    angle(V);    imag(Sfe);    imag(Ste);    imag(Sbuse);    abs(V);];%% measurement residual       delz = z - z_est;normF = delz' * WInv * delz;  chusqu = err' * WInv * err;       %% check toleranceif verbose > 1    fprintf('\n it     norm( F )       step size');    fprintf('\n----  --------------  --------------');    fprintf('\n%3d    %10.3e      %10.3e', i, normF, 0);endif normF < tol    converged = 1;    if verbose > 1        fprintf('\nConverged!\n');    endend%% index vector for measurements that are to be used%%%%%% NOTE: This is specific to the 30-bus system   %%%%%%%%%%%%       where bus 1 is the reference bus which  %%%%%%%%%%%%       is connected to branches 1 and 2        %%%%%%vv=[[3:nbr], ...                    %% all but 1st two Pf    [nbr+1:2*nbr], ...              %% all Pt    [2*nbr+2:2*nbr+nb], ...         %% all but 1st Pbus    [2*nbr+nb+2:2*nbr+2*nb], ...    %% all but 1st Va    [2*nbr+2*nb+3:3*nbr+2*nb], ...  %% all but 1st two Qf    [3*nbr+2*nb+1:4*nbr+2*nb], ...  %% all Qt    [4*nbr+2*nb+2:4*nbr+3*nb], ...  %% all but 1st Qbus    [4*nbr+3*nb+2:4*nbr+4*nb]]';    %% all but 1st Vm%% index vector for state variables to be updatedww = [ nref; nb+nref ];%% bad data loopone_at_a_time = 1; max_it_bad_data = 50;% one_at_a_time = 0; max_it_bad_data = 5;ibd = 1;while (~converged & ibd <= max_it_bad_data)    nm = length(vv);    baddata = 0;    %% find reduced Hessian, covariance matrix, measurements    HH = H(vv,ww);    WWInv = WInv(vv,vv);    ddelz = delz(vv);    VVa = angle(V(nref));    VVm = abs(V(nref));    %   B0 = WWInv * (err(vv) .^ 2);%   B00 = WWInv * (ddelz .^ 2);%   [maxB0,i_maxB0] = max(B0)%   [maxB00,i_maxB00] = max(B00)        %%-----  do Newton iterations  -----    max_it = 100;    i = 0;    while (~converged & i < max_it)        %% update iteration counter        i = i + 1;                %% compute update step        F = HH' * WWInv * ddelz;        J = HH' * WWInv * HH;        dx = (J \ F);                %% update voltage        VVa = VVa + dx(1:nb-1);        VVm = VVm + dx(nb:2*nb-2);        V(nref) = VVm .* exp(j * VVa);        %% compute estimated measurement        Sfe = V(f) .* conj(Yf * V);        Ste = V(t) .* conj(Yt * V);        Sbuse = V .* conj(Ybus * V);        z_est = [            real(Sfe);            real(Ste);            real(Sbuse);            angle(V);            imag(Sfe);            imag(Ste);            imag(Sbuse);            abs(V);        ];                %% measurement residual               delz = z - z_est;        ddelz = delz(vv);        normF = ddelz' * WWInv * ddelz;          %% check for convergence        step = dx' * dx;        if verbose > 1            fprintf('\n%3d    %10.3e      %10.3e', i, normF, step);        end        if (step < tol)             converged = 1;            if verbose                fprintf('\nState estimator converged in %d iterations.\n', i);            end        end    end    if verbose        if ~converged            fprintf('\nState estimator did not converge in %d iterations.\n', i);        end    end        %%-----  Chi squared test for bad data and bad data rejection  -----    B = zeros(nm,1);    bad_threshold = 6.25;       %% the threshold for bad data = sigma squared    RR = inv(WWInv) - 0.95 * HH * inv(HH' * WWInv * HH) * HH';%   RI = inv( inv(WWInv) - HH * inv(HH' * WWInv * HH) * HH' );%   find(eig(full(inv(WWInv) - HH * inv(HH' * WWInv * HH) * HH')) < 0)%   chi = ddelz' * RR * ddelz    rr = diag(RR);    B = ddelz .^ 2 ./ rr;    [maxB,i_maxB] = max(B);    if one_at_a_time        if maxB >= bad_threshold            rejected = i_maxB;        else            rejected = [];        end    else        rejected = find( B >= bad_threshold );    end    if length(rejected)        baddata = 1;        converged = 0;        if verbose            fprintf('\nRejecting %d measurement(s) as bad data:\n', length(rejected));            fprintf('\tindex\t      B\n');            fprintf('\t-----\t-------------\n');            fprintf('\t%4d\t%10.2f\n', [ vv(rejected), B(rejected) ]' );        end                %% update measurement index vector        k = find( B < bad_threshold );        vv = vv(k);        nm = length(vv);    end    if (baddata == 0)         converged = 1;        if verbose            fprintf('\nNo remaining bad data, after discarding data %d time(s).\n', ibd-1);            fprintf('Largest value of B = %.2f\n', maxB);        end    end    ibd = ibd + 1;end

⌨️ 快捷键说明

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