Dear Prof Ray Zimmerman

I have run thisprogram. This program has been successful and result below:

 

define_constants;

mpc = loadcase('case14');

results = runpf(mpc);

total_losses =sum(get_losses(results))

sum_of_V_deviations =sum(abs(results.bus(:, VM) - 1.0))

 

result...

total_losses =

 13.3933 +54.5383i

 sum_of_V_deviations =

 0.6786  

 
But after I calculate the amount of voltage deviation, the output of 0.6786 is 
the voltage deviation for all buses. If I just want to calculate for the load 
bus only. How does channge the script ? 

Thanks.




   Pada Jumat, 31 Agustus 2018 04.51.06 WIB, Ray Zimmerman <[email protected]> 
menulis:  
 
 Sorry for the late response. Just catching up on e-mails after being away for 
a while.
To minimize power losses simply run an OPF with equal linear generator costs 
for all generators, as described in FAQ #1. To minimize voltage deviations from 
some voltage set points, the best way is probably to use an OPF with the 
generator costs set to zero and some extensions to the standard OPF to put a 
cost on the voltage deviations. See Section 6.3 and chapter 7 for details on 
extending the OPF. There is also a relevant example starting at line 177 in 
t_opf_mips.m.
Now, it is also possible to simply evaluate a power flow using a call to an 
unmodified runpf(), followed by some additional code to compute the losses 
(e.g. using get_losses()) or voltage deviations from the result. For example …
define_constants;mpc = loadcase('mycase');results = runpf(mpc);total_losses = 
sum(get_losses(results));sum_of_V_deviations = sum(abs(results.bus(:, VM) - 
1.0));
Hope this helps,
    Ray 

On Jul 28, 2018, at 12:03 AM, Sabhan Kanata <[email protected]> wrote:
Dear Mr. Ray Zimmerman,
I am Sabhan Kanata,  a Doctoral Student of Bandung Institute of Technology, 
Indonesia.  I am taking a reseach on Optimazation of Power System to 
investigate the way to minimalize the power losses and voltage deviation.
I have a big problem when dealing with the calculation of voltage deviation 
using MAT-POWER.  Through this email, there is an attachment of runpf.m coding 
to calculate the losses.   I need your assistance in oder to calculate the 
voltage deviation by employing the following formula.:
min VD = min (Vi - 1.0)   to minimize the deviations in voltage magnitud at 
load bus.

I want to change objective function of  losses to deviations in voltage.  
======================================
function [PLOSS] =runpf(casename,AA)

%RUNPF  Runs a power flow.

%   MATPOWER

%   $Id: runpf.m,v 1.14 2006/09/29 19:23:07 rayExp $

%   by Ray Zimmerman, PSERC Cornell

%   Enforcing of generator Q limits inspired bycontributions

%   from Mu Lin, Lincoln University, New Zealand(1/14/05).

%   Copyright (c) 1996-2005 by Power SystemEngineering Research Center (PSERC)

%   See http://www.pserc.cornell.edu/matpower/for more info.
 

%%-----  initialize -----

%% define named indicesinto bus, gen, branch matrices

[PQ, PV, REF, NONE, BUS_I,BUS_TYPE, PD, QD, GS, BS, BUS_AREA, VM, ...

    VA, BASE_KV, ZONE, VMAX, VMIN, LAM_P,LAM_Q, MU_VMAX, MU_VMIN] = idx_bus;

[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;

[GEN_BUS, PG, QG, QMAX, QMIN, VG,MBASE, GEN_STATUS, PMAX, PMIN, ...

    MU_PMAX, MU_PMIN, MU_QMAX, MU_QMIN, PC1,PC2, QC1MIN, QC1MAX, ...

    QC2MIN, QC2MAX, RAMP_AGC, RAMP_10, RAMP_30,RAMP_Q, APF] = idx_gen;
 

%% default arguments

solvedcase = '';                %% don't save solved case

fname = '';                 %% don't print results to afile

mpopt = mpoption;       %% use default options
 
 

%% options

verbose = mpopt(31);

qlim = mpopt(6);                    %% enforceQ limits on gens?

dc = mpopt(10);                     %% use DCformulation?
 

%% read data & convertto internal bus numbering

[baseMVA, bus, gen, branch] =loadcase(casename);
 

%Untuk sistem tenaga ieee14 bus

gen(1,6)=AA(1);

gen(2,6)=AA(2);

gen(3,6)=AA(3);

gen(4,6)=AA(4);

gen(5,6)=AA(5);

bus(9,6)=2*AA(6);

bus(14,6)=2*AA(7);

branch(8,9)=1+0.025*AA(8);

branch(9,9)=1+0.025*AA(9);

branch(10,9)=1+0.025*AA(10);
 

[i2e, bus, gen, branch] =ext2int(bus, gen, branch);
 

%% get bus index lists ofeach type of bus

[ref, pv, pq] = bustypes(bus,gen);
 

%% generator info

on = find(gen(:, GEN_STATUS) >0);      %% which generators are on?

gbus = gen(on, GEN_BUS);                %% what buses are they at?
 

%%-----  run the power flow  -----

t0 = clock;

if dc                               %% DCformulation

    %% initial state

    Va0 = bus(:, VA) * (pi/180);
    

    %% build B matrices and phase shiftinjections

    [B, Bf, Pbusinj, Pfinj] = makeBdc(baseMVA,bus, branch);
    

    %% compute complex bus power injections(generation - load)

    %% adjusted for phase shifters and realshunts

    Pbus = real(makeSbus(baseMVA, bus, gen)) -Pbusinj - bus(:, GS) / baseMVA;
    

    %% "run" the power flow

    Va = dcpf(B, Pbus, Va0, ref, pv, pq);
    

    %% update data matrices with solution

    branch(:, [QF, QT]) = zeros(size(branch,1), 2);

    branch(:, PF) = (Bf * Va + Pfinj) *baseMVA;

    branch(:, PT) = -branch(:, PF);

    bus(:, VM) = ones(size(bus, 1), 1);

    bus(:, VA) = Va * (180/pi);

    %% update Pg for swing generator (note:other gens at ref bus are accounted 
for in Pbus)

    %%     Pg = Pinj + Pload + Gs

    %%     newPg = oldPg + newPinj - oldPinj

    refgen = find(gbus == ref);             %% which is(are) thereference 
gen(s)?

    gen(on(refgen(1)), PG) = gen(on(refgen(1)),PG) + (B(ref, :) * Va - 
Pbus(ref)) * baseMVA;
    

    success = 1;

else                                %% ACformulation

    %%initial state

    % V0    = ones(size(bus, 1), 1);            %% flat start

    V0  =bus(:, VM) .* exp(sqrt(-1) * pi/180 * bus(:, VA));

    V0(gbus) = gen(on, VG) ./ abs(V0(gbus)).*V0(gbus);
    

    if qlim

        ref0 = ref;                         %% save index and angle of

        Varef0 = bus(ref0, VA);             %%   original reference bus

        limited = [];                       %% list ofindices of gens @ Q lims

        fixedQg = zeros(size(gen, 1), 1);   %% Qg of gens at Q limits

    end

    repeat = 1;

    while (repeat)

        %% build admittance matrices

        [Ybus, Yf, Yt] = makeYbus(baseMVA, bus,branch);
        

        %% compute complex bus power injections(generation - load)

        Sbus = makeSbus(baseMVA, bus, gen);
        

        %% run the power flow

        alg = mpopt(1);

        if alg == 1

            [V, success, iterations] =newtonpf(Ybus, Sbus, V0, ref, pv, pq, 
mpopt);

        elseif alg == 2 | alg == 3

            [Bp, Bpp] = makeB(baseMVA, bus,branch, alg);

            [V, success, iterations] =fdpf(Ybus, Sbus, V0, Bp, Bpp, ref, pv, 
pq, mpopt);

        elseif alg == 4

            [V, success, iterations] =gausspf(Ybus, Sbus, V0, ref, pv, pq, 
mpopt);

        else

            error('OnlyNewton''s method, fast-decoupled, and Gauss-Seidel power 
flow algorithmscurrently implemented.');

        end
        

        %% update data matrices with solution

        [bus, gen, branch] = pfsoln(baseMVA,bus, gen, branch, Ybus, Yf, Yt, V, 
ref, pv, pq);
        

        if qlim             %% enforce generator Qlimits

            %% find gens with violated Qconstraints

            mx = find( gen(:, GEN_STATUS) >0 & gen(:, QG) > gen(:, QMAX) );

            mn = find( gen(:, GEN_STATUS) >0 & gen(:, QG) < gen(:, QMIN) );
            

            if ~isempty(mx) | ~isempty(mn)  %% we have some Q limit violations

                if isempty(pv)

                    if verbose

                        if ~isempty(mx) 

                            fprintf('Gen %d (onlyone left) exceeds upper Q 
limit : INFEASIBLE PROBLEM\n', mx);

                        else

                            fprintf('Gen %d (onlyone left) exceeds lower Q 
limit : INFEASIBLE PROBLEM\n', mn);

                        end

                    end

                    success = 0;

                    break;

                end

                if verbose & ~isempty(mx)

                    fprintf('Gen %d atupper Q limit, converting to PQ bus\n', 
mx);

                end

                if verbose & ~isempty(mn)

                    fprintf('Gen %d atlower Q limit, converting to PQ bus\n', 
mn);

                end
                

                %% save corresponding limitvalues

                fixedQg(mx) = gen(mx, QMAX);

                fixedQg(mn) = gen(mn, QMIN);

                mx = [mx;mn];
                

                %% convert to PQ bus

                gen(mx, QG) = fixedQg(mx);      %% set Qg to binding limit

                gen(mx, GEN_STATUS) = 0;        %% temporarily turn off gen,

                for i = 1:length(mx)            %% (one at a time, since

                    bi = gen(mx(i),GEN_BUS);   %%  they may be at same bus)

                    bus(bi, [PD,QD]) = ...      %% adjust load accordingly,

                        bus(bi, [PD,QD]) -gen(mx(i), [PG,QG]);

                end

                bus(gen(mx, GEN_BUS), BUS_TYPE)= PQ;   %% & set bus type to PQ
                

                %% update bus index lists ofeach type of bus

                ref_temp = ref;

                [ref, pv, pq] = bustypes(bus,gen);

                if verbose & ref ~= ref_temp

                    fprintf('Bus %d is newslack bus\n', ref);

                end

               limited = [limited; mx];

            else

                repeat = 0; %% no moregenerator Q limits violated

            end

        else

            repeat = 0;     %% don't enforce generator Qlimits, once is enough

        end

    end

   if qlim & ~isempty(limited)

        %% restore injections from limited gens(those at Q limits)

        gen(limited, QG) =fixedQg(limited);    %% restoreQg value,

        for i = 1:length(limited)               %% (one at a time, since

            bi = gen(limited(i), GEN_BUS);      %% they may be at same bus)

            bus(bi, [PD,QD]) = ...              %% re-adjust load,

                bus(bi, [PD,QD]) +gen(limited(i), [PG,QG]);

        end

        gen(limited, GEN_STATUS) = 1;               %% and turn gen back on

        if ref ~= ref0

            %% adjust voltage angles to makeoriginal ref bus correct

            bus(:, VA) = bus(:, VA) - bus(ref0,VA) + Varef0;

        end

    end

end

et = etime(clock, t0);
 

%%-----  output results  -----

%% convert back to originalbus numbering & print results

[bus, gen, branch] = int2ext(i2e,bus, gen, branch);

if fname

    [fd, msg] = fopen(fname, 'at');

    if fd == -1

        error(msg);

    else

        printpf(baseMVA, bus, gen, branch, [],success, et, fd, mpopt);

        fclose(fd);

    end

end

[PLOSS]=printpf(baseMVA, bus,gen, branch, [], success, et, 1, mpopt);
 

% % save solved case

% if solvedcase

%     savecase(solvedcase, baseMVA, bus, gen,branch);

% end
 

%% this is just to preventit from printing baseMVA

%% when called with nooutput arguments

if nargout, MVAbase = baseMVA; end
 

return;
 

==============================================================


Hopefully I can get your answer to cope with the problem i am now facing.I 
would like to thank you in advance for the help at your convenience.

Yours Faithfully,

Sabhan Kanata
Thanks for your helping





  

Reply via email to