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

📄 smartmkt.m

📁 MATPOWER 一款基于MATLAB的电力系统潮流计算及优化的程序
💻 M
字号:
function [co, cb, bus, gen, branch, f, dispatch, success] = ...            smartmkt(mpc, offers, bids, mkt, mpopt)%SMARTMKT  Runs the PowerWeb smart market.%   [co, cb, bus, gen, branch, f, dispatch, success] = smartmkt(mpc, ...%		offers, bids, mkt, mpopt) runs the ISO smart market.%   MATPOWER%   $Id: smartmkt.m,v 1.19 2006/03/08 15:16:24 ray Exp $%   by Ray Zimmerman, PSERC Cornell%   Copyright (c) 1996-2006 by Power System Engineering Research Center (PSERC)%   See http://www.pserc.cornell.edu/matpower/ for more info.%%-----  initialization  -----%% default argumentsif nargin < 5    mpopt = mpoption;       %% use default optionsend%% optionsverbose = mpopt(31);%% initialize some stuffG = find( ~isload(mpc.gen) );       %% real generatorsL = find(  isload(mpc.gen) );       %% dispatchable loadsif isfield(offers, 'Q') | isfield(bids, 'Q')    haveQ = 1;else    haveQ = 0;endif haveQ & ~isempty(L) & mkt.auction_type ~= 0 & ...        mkt.auction_type ~= 1 & mkt.auction_type ~= 5    error(['Combined active/reactive power markets with constant power factor ', ...            'dispatchable loads are only implemented for auction types 0, 1 & 5']);end%% set power flow formulation based on marketmpopt = mpoption(mpopt, 'PF_DC', strcmp(mkt.OPF, 'DC'));%% define named indices into data 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;[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;[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;[AREA_I, PRICE_REF_BUS] = idx_area;[PW_LINEAR, POLYNOMIAL, MODEL, STARTUP, SHUTDOWN, NCOST, COST] = idx_cost;[QUANTITY, PRICE, FCOST, VCOST, SCOST, PENALTY] = idx_disp;%% set up cost info & generator limitsmkt.lim = pricelimits(mkt.lim, isfield(offers, 'Q') | isfield(bids, 'Q'));[gen, genoffer] = off2case(mpc.gen, mpc.gencost, offers, bids, mkt.lim);%% move Pmin and Pmax limits out slightly to avoid problems%% with lambdas caused by rounding errors when corner point%% of cost function lies at exactly Pmin or Pmaxif any(find(genoffer(:, MODEL) == PW_LINEAR))    gg = find( ~isload(gen) );      %% skip dispatchable loads    gen(gg, PMIN) = gen(gg, PMIN) - 100 * mpopt(16) * ones(size(gg));    gen(gg, PMAX) = gen(gg, PMAX) + 100 * mpopt(16) * ones(size(gg));end%%-----  solve the optimization problem  -----%% attempt OPF[bus, gen, branch, f, success, et] =  uopf(mpc.baseMVA, mpc.bus, gen, ...            genoffer, mpc.branch, mpc.areas, mpopt);if verbose & ~success    fprintf('\nSMARTMARKET: non-convergent UOPF');end%%-----  compute quantities, prices & costs  -----%% compute quantities & pricesng = size(gen, 1);if success      %% OPF solved case fine    %% get nodal marginal prices from OPF    gbus    = gen(:, GEN_BUS);                     %% indices of buses w/gens    npP 	= max([ size(offers.P.qty, 2) size(bids.P.qty, 2) ]);    lamP    = diag(bus(gbus, LAM_P)) * ones(ng, npP);    %% real power prices    lamQ    = diag(bus(gbus, LAM_Q)) * ones(ng, npP);    %% reactive power prices        %% compute fudge factor for lamP to include price of bundled reactive power    pf   = zeros(ng, npP);                        %% for loads Q = pf * P    Qlim =  (gen(L, QMIN) == 0) .* gen(L, QMAX) + ...            (gen(L, QMAX) == 0) .* gen(L, QMIN);    pf(L) = Qlim ./ gen(L, PMIN);    gtee_prc.offer = 1;         %% guarantee that cleared offers are >= offers    Poffer = offers.P;    Poffer.lam = lamP(G,:);    Poffer.total_qty = gen(G, PG);        Pbid = bids.P;    Pbid.total_qty = -gen(L, PG);    if haveQ        Pbid.lam = lamP(L,:);   %% use unbundled lambdas        gtee_prc.bid = 0;       %% allow cleared bids to be above bid price    else        Pbid.lam = lamP(L,:) + diag(pf(L)) * lamQ(L,:); %% used bundled lambdas        gtee_prc.bid = 1;       %% guarantee that cleared bids are <= bids    end    [co.P, cb.P] = auction(Poffer, Pbid, mkt.auction_type, mkt.lim.P, gtee_prc);    if haveQ        npQ = max([ size(offers.Q.qty, 2) size(bids.Q.qty, 2) ]);                %% get nodal marginal prices from OPF        lamP    = diag(bus(gbus, LAM_P)) * ones(ng, npQ);    %% real power prices        lamQ    = diag(bus(gbus, LAM_Q)) * ones(ng, npQ);    %% reactive power prices%         %% compute fudge factor for lamP to include price of bundled reactive power%         pf   = zeros(ng, npQ);                        %% for loads P = pf * Q%         Qlim =  (gen(L, QMIN) == 0) .* gen(L, QMAX) + ...%                 (gen(L, QMAX) == 0) .* gen(L, QMIN);%         kk = find(Qlim);%         pf(L(kk)) = gen(L(kk), PMIN) ./ Qlim(kk);            Qoffer = offers.Q;        Qoffer.lam = lamQ;      %% use unbundled lambdas%         Qoffer.lam(L,:) = lamQ(L,:) + diag(pf(L)) * lamP(L,:);        Qoffer.total_qty = (gen(:, QG) > 0) .* gen(:, QG);                Qbid = bids.Q;        Qbid.lam = lamQ;        %% use unbundled lambdas%         Qbid.lam(L,:) = lamQ(L,:) + diag(pf(L)) * lamP(L,:);        Qbid.total_qty = (gen(:, QG) < 0) .* -gen(:, QG);        [co.Q, cb.Q] = auction(Qoffer, Qbid, mkt.auction_type, mkt.lim.Q, gtee_prc);    end    quantity    = gen(:, PG);    price       = zeros(ng, 1);    price(G)    = offers.P.prc(:, 1);   %% need these for prices for    price(L)    = bids.P.prc(:, 1);     %% gens that are shut down    if npP == 1        k = find( co.P.qty );        price(G(k)) = co.P.prc(k, :);        k = find( cb.P.qty );        price(L(k)) = cb.P.prc(k, :);    else        k = find( sum( co.P.qty' )' );        price(G(k)) = sum( co.P.qty(k, :)' .* co.P.prc(k, :)' )' ./ sum( co.P.qty(k, :)' )';        k = find( sum( cb.P.qty' )' );        price(L(k)) = sum( cb.P.qty(k, :)' .* cb.P.prc(k, :)' )' ./ sum( cb.P.qty(k, :)' )';    endelse        %% did not converge even with imports    quantity    = zeros(ng, 1);    price       = mkt.lim.P.max_offer * ones(ng, 1);    co.P.qty = zeros(size(offers.P.qty));    co.P.prc = zeros(size(offers.P.prc));    cb.P.qty = zeros(size(bids.P.qty));    cb.P.prc = zeros(size(bids.P.prc));    if haveQ        co.Q.qty = zeros(size(offers.Q.qty));        co.Q.prc = zeros(size(offers.Q.prc));        cb.Q.qty = zeros(size(bids.Q.qty));        cb.Q.prc = zeros(size(bids.Q.prc));    endend%% compute costs in $ (note, NOT $/hr)fcost   = mkt.t * totcost(mpc.gencost, zeros(ng, 1) );      %% fixed costsvcost   = mkt.t * totcost(mpc.gencost, quantity     ) - fcost;  %% variable costsscost   =   (~mkt.u0 & gen(:, GEN_STATUS) >  0) .* ...                mpc.gencost(:, STARTUP) + ...               %% startup costs            ( mkt.u0 & gen(:, GEN_STATUS) <= 0) .* ...                mpc.gencost(:, SHUTDOWN);                   %% shutdown costs%% store in dispatchdispatch = zeros(ng, PENALTY);dispatch(:, [QUANTITY PRICE FCOST VCOST SCOST]) = [quantity price fcost vcost scost];return;

⌨️ 快捷键说明

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