📄 fm_opfm.m
字号:
mu_Qgmin = mu(idx+nG); idx = idx + n_gen; mu_Qgmax = mu(idx+nG); idx = idx + n_gen; mu_Vmin = mu(idx+nB); idx = idx + n1; mu_Vmax = mu(idx+nB); idx = idx + n1; mu_Iijmax = mu(idx+nL); idx = idx + Line.n; mu_Ijimax = mu(idx+nL); idx = idx + Line.n; if Rsrv.n mu_Prmin = mu(idx+nR); idx = idx + Rsrv.n; mu_Prmax = mu(idx+nR); idx = idx + Rsrv.n; mu_sumPrd = mu(idx+1); end % Computations for the System: f(theta,V,Qg,Ps,Pd) = 0 %________________________________________________________________________ Line = gcall(Line); gcall(PQ); gcall(Shunt) glambda(SW,1,0); glambda(PV,1,0); % Demand & Supply DAE.g = DAE.g + sparse(Demand.bus,1,Pd,DAE.m,1) ... + sparse(Demand.vbus,1,Pd.*qonp,DAE.m,1); DAE.g = DAE.g - sparse(Supply.bus,1,Ps,DAE.m,1) ... - sparse(busG+n1,1,Qg,DAE.m,1); Gycall(Line) Gycall(Shunt) [Iij,Jij,Hij,Iji,Jji,Hji] = fjh2(Line,flow,mu_Iijmax,mu_Ijimax); % Gradient of [s] variables %________________________________________________________________________ gs = s.*mu - ms; % Gradient of [mu] variables %________________________________________________________________________ Vbus = DAE.y(Bus.v); gmu = [Psmin-Ps;Ps-Psmax;Pdmin-Pd;Pd-Pdmax;Qgmin-Qg;Qg-Qgmax; ... Vmin-Vbus;Vbus-Vmax;Iij-Iijmax;Iji-Iijmax]; if Rsrv.n, gmu(Supply.n+supR) = gmu(Supply.n+supR) + Pr; gmu = [gmu; Prmin-Pr;Pr-Prmax;sum(Pr)-sum(Pd)]; end gmu = gmu + s; % Gradient of [y] = [theta; V; Qg; Ps; Pd] variables %________________________________________________________________________ Jg = [DAE.Gy, g_Qg, g_Ps, g_Pd]; if Rsrv.n, Jg = [Jg, g_Pr]; end dF_dy = (Jg.')*ro; dG_dy(n2+n_gen+nS) = (Csb + 2*Csc.*Ps + 2*KTBS.*Ps); dG_dy(n2+n_gen+Supply.n+nD) = -(Cdb+2*Cdc.*Pd+2*KTBD.* ... Pd+qonp.*(Ddb+2*qonp.*Ddc.*Pd)); dG_dy(n2+nS) = (Dsb + 2*Dsc.*Qg(nS)); dH_dtV = (Jij.')*mu_Iijmax + (Jji.')*mu_Ijimax + [mu_t; mu_Vmax-mu_Vmin]; if Rsrv.n, dH_dy = [dH_dtV; mu_Qgmax-mu_Qgmin; mu_Psmax-mu_Psmin; ... mu_Pdmax-mu_Pdmin-mu_sumPrd; ... mu_Psmax(idxR)+mu_Prmax-mu_Prmin+mu_sumPrd]; else dH_dy = [dH_dtV; mu_Qgmax-mu_Qgmin; mu_Psmax-mu_Psmin; mu_Pdmax-mu_Pdmin]; end gy = dG_dy - dF_dy + dH_dy; Jh(n_b+nL,1:n2) = Jij; Jh(n_b+Line.n+nL,1:n2) = Jji; % Hessian Matrix [D2xLms] %________________________________________________________________________ H3 = sparse(n_a+Rsrv.n,n_y); H3 = H3 - sparse(n_gen+nS,n2+n_gen+nS,(2*Csc+2*KTBS),n_a+Rsrv.n,n_y); H3 = H3 - sparse(nS,n2+nS,2*Dsc,n_a+Rsrv.n,n_y); H3 = H3 + sparse(n_gen+Supply.n+nD,n_gen+Supply.n+n2+nD, ... (2*Cdc+2*KTBD+2*Ddc.*qonp.*qonp),n_a+Rsrv.n,n_y); Hess = -hessian(Line,ro(1:n2))+Hij+Hji-hessian(Shunt,ro(1:n2)); D2xLms = [Hess, H31; -H3]; % Complete System Matrix [D2yLms] %________________________________________________________________________ %I_smu = speye(n_s); %Z1 = sparse(n_s,n_y); %Z2 = sparse(n_s,n_s); %Z3 = sparse(n2,n2); %Z4 = sparse(n2,n_s); %H_s = diag(s); %H_mu = diag(mu); %D2yLms = [H_mu, H_s, Z1, Z4'; ... % I_smu, Z2, Jh, Z4'; ... % Z1', Jh', D2xLms, -Jg'; ... % Z4, Z4, -Jg, Z3]; % Compute variable increment %________________________________________________________________________ switch method case 1 % Newton Directions % reduced system H_m = sparse(1:n_s,1:n_s,mu./s,n_s,n_s); H_s = sparse(1:n_s,1:n_s,1./s,n_s,n_s); Jh(:,SW.refbus) = 0; gy = gy+(Jh.')*(H_m*gmu-H_s*gs); Jd = [D2xLms+(Jh.')*(H_m*Jh),-Jg.';-Jg,Z3]; % reference angle for the actual system Jd(SW.refbus,:) = 0; Jd(:,SW.refbus) = 0; %Jd = Jd + sparse(SW.refbus,SW.refbus,1,n_y+DAE.m,n_y+DAE.m); Jd(SW.refbus,SW.refbus) = speye(length(SW.refbus)); gy(SW.refbus) = 0; % variable increments Dx = -Jd\[gy; -DAE.g]; Ds = -(gmu+Jh*Dx([1:n_y])); Dm = -H_s*gs-H_m*Ds; case 2 % Mehrotra's Predictor-Corrector % ------------------- % Predictor step % ------------------- % reduced system H_m = sparse(1:n_s,1:n_s,mu./s,n_s,n_s); Jh(:,SW.refbus) = 0; gx = gy+(Jh.')*(H_m*gmu-mu); Jd = [D2xLms+(Jh.')*(H_m*Jh),-Jg.';-Jg,Z3]; % reference angle for the actual system gx(SW.refbus) = 0; Jd(SW.refbus,:) = 0; Jd(:,SW.refbus) = 0; %Jd = Jd + sparse(SW.refbus,SW.refbus,1,n_y+DAE.m,n_y+DAE.m); Jd(SW.refbus,SW.refbus) = speye(length(SW.refbus)); % LU factorization [L,U,P] = lu(Jd); % variable increments Dx = -U\(L\(P*[gx; -DAE.g])); Ds = -(gmu+Jh*Dx([1:n_y])); Dm = -mu-H_m*Ds; % centering correction a1 = find(Ds < 0); a2 = find(Dm < 0); if isempty(a1), ratio1 = 1; else, ratio1 = -s(a1)./Ds(a1); end if isempty(a2), ratio2 = 1; else, ratio2 = -mu(a2)./Dm(a2); end alpha_P = min(1,gamma*min(ratio1)); alpha_D = min(1,gamma*min(ratio2)); c_gap_af = [s + alpha_P*Ds]'*[mu + alpha_D*Dm]; c_gap = s'*mu; ms = min((c_gap_af/c_gap)^2,0.2)*c_gap_af/n_s; gs = mu+(Ds.*Dm-ms)./s; % ------------------- % Corrector Step % ------------------- % new increment for variable y gx = gy +(Jh.')*(H_m*gmu-gs); gx(SW.refbus) = 0; % variable increments Dx = -U\(L\(P*[gx; -DAE.g])); Ds = -(gmu+Jh*Dx([1:n_y])); Dm = -gs-H_m*Ds; end % ======================================================================= % Variable Increments % ======================================================================= Dy = Dx(nY); idx = DAE.m; % curr. sys. DQg = Dx(idx+nG); idx = idx + n_gen; DPs = Dx(idx+nS); idx = idx + Supply.n; DPd = Dx(idx+nD); idx = idx + Demand.n; if Rsrv.n, DPr = Dx(idx+nR); idx = idx + Rsrv.n; end Dro = Dx(1+idx:end); % Lag. mult. % ======================================================================= % Updating the Variables % ======================================================================= % Step Length Parameters [alpha_P & alpha_D] %________________________________________________________________________ a1 = find(Ds < 0); a2 = find(Dm < 0); if isempty(a1), ratio1 = 1; else, ratio1 = (-s(a1)./Ds(a1)); end if isempty(a2), ratio2 = 1; else, ratio2 = (-mu(a2)./Dm(a2)); end alpha_P = min(1,gamma*min(ratio1)); alpha_D = min(1,gamma*min(ratio2)); % New primal variables %________________________________________________________________________ DAE.y = DAE.y + alpha_P*Dy; Ps = Ps + alpha_P*DPs; Pd = Pd + alpha_P*DPd; Qg = Qg + alpha_P*DQg; if Rsrv.n, Pr = Pr + alpha_P*DPr; end s = s + alpha_P*Ds; % New dual variables %________________________________________________________________________ ro = ro + alpha_D*Dro; mu = mu + alpha_D*Dm; % Objective Function %________________________________________________________________________ s(find(s == 0)) = epsilon_mu; Fixd_c = sum(Csa) - sum(Cda) + sum(Dsa) - sum(Dda); Prop_c = Csb'*Ps - Cdb'*Pd + Dsb'*Qg(nS) - Ddb'*(qonp.*Pd); TieBreaking = (sum(KTBS.*Ps.*Ps) - sum(KTBD.*Pd.*Pd)); Quad_c = Csc'*(Ps.*Ps) - Cdc'*(Pd.*Pd) - Ddc'*(qonp.*qonp.*Pd.*Pd); Quad_q = Dsc'*(Qg(nS).*Qg(nS)); if Rsrv.n, Reserve = Cr'*Pr; else, Reserve = 0; end G_obj = (Fixd_c+Prop_c+Quad_c+Quad_q+TieBreaking+Reserve)-ms*sum(log(s)); % ======================================================================= % Reducing the Barrier Parameter % ======================================================================= sigma = max(0.99*sigma, 0.1); % Centering Parameter c_gap = s'*mu; % Complementarity Gap ms = min(abs(sigma*c_gap/n_s),1); % Evaluation of the Barrier Parameter % ======================================================================= % Testing for Convergence % ======================================================================= test1 = ms <= epsilon_mu; norma2 = norm(Dx,inf); test2 = norma2 <= epsilon_2; norma3 = norm(DAE.g,inf); test3 = norma3 <= epsilon_1; norma4 = abs(G_obj-G_obj_k_1)/(1+abs(G_obj)); test4 = norma4 <= epsilon_2; if test1 & test2 & test3 & test4, break, end % Displaying Convergence Tests %________________________________________________________________________ iteration = iteration + 1; fm_status('opf','update',[iteration, ms, norma2, norma3, norma4], ... iteration) if OPF.show fm_disp(['Iter. =',fvar(iteration,5),' mu =', fvar(ms,8), ... ' |dy| =', fvar(norma2,8), ' |f(y)| =', ... fvar(norma3,8),' |dG(y)| =' fvar(norma4,8)]) end if iteration > iter_max, break, endend% Updating Demand.con & Supply.con%____________________________________________________________________________if Settings.matlab, warning('on'); endDemand = pset(Demand,Pd);Supply = pset(Supply,Ps);Rsrv = pset(Rsrv,Pr);MVA = Settings.mva;Pay = ro(Bus.a).*Line.p*MVA;ISOPay = sum(Pay);Iij = sqrt(Iij);Iji = sqrt(Iji);Iijmax = sqrt(Iijmax);% Computation of Nodal Congestion Prices (NCPs)%____________________________________________________________________________fm_setgy(SW.refbus)dH_dtV(SW.refbus,:) = 0;OPF.NCP = -DAE.Gy'\dH_dtV;OPF.obj = G_obj;OPF.ms = ms;OPF.dy = norma2;OPF.dF = norma3;OPF.dG = norma4;OPF.iter = iteration;SNB.init = 0;LIB.init = 0;CPF.init = 0;OPF.init = 1;% set Pg, Qg, Pl and QlBus.Pl = OPF.basepl*Snapshot(1).Pl + sparse(Demand.bus,1,Pd,n1,1);Bus.Ql = OPF.basepl*Snapshot(1).Ql + sparse(Demand.bus,1,Pd.*qonp,n1,1);Bus.Pg = OPF.basepg*Snapshot(1).Pg + sparse(Supply.bus,1,Ps,n1,1);Bus.Qg = OPF.basepg*Snapshot(1).Qg + sparse(busG,1,Qg,n1,1);% Display Results%____________________________________________________________________________if (Settings.showlf | OPF.show) & clpsat.showopf OPF.report = cell(1,1); OPF.report{1,1} = ['TTL = ', ... fvar(sum(Pd)+totp(PQ),8), ' [p.u.]']; if ~noDem OPF.report{2,1} = ['Total demand = ',fvar(sum(Pd),8), ' [p.u.]']; end OPF.report{2+(~noDem),1} = ['Bid Losses = ', ... fvar(sum(Line.p)-Snapshot(1).Ploss,8), ' [p.u.]']; OPF.report{3+(~noDem),1} = ['Total Losses = ', ... fvar(sum(Line.p),8), ' [p.u.]']; fm_disp fm_disp('----------------------------------------------------------------') Settings.lftime = toc; Settings.forcepq = forcepq; if Fig.stat, fm_stat; end if iteration > iter_max fm_disp('IPM-OPF: Method did not converge',2) elseif Fig.main if ~get(Fig.main,'UserData') fm_disp('IPM-OPF: Interrupted',2) else fm_disp(['IPM-OPF completed in ',num2str(toc),' s'],1) end else fm_disp(['IPM-OPF completed in ',num2str(toc),' s'],1) if Settings.showlf == 1 fm_stat(OPF.report); else if Settings.beep, beep, end, end end fm_status('opf','close')else if iteration > iter_max fm_disp('IPM-OPF: Method did not converge',2) elseif Fig.main if ~get(Fig.main,'UserData') fm_disp('IPM-OPF: Interrupted',2) else fm_disp(['IPM-OPF completed in ',num2str(toc),' s'],1) end else fm_disp(['IPM-OPF completed in ',num2str(toc),' s'],1) endendif iteration > iter_max, OPF.conv = 0; else, OPF.conv = 1; endif Rsrv.n, OPF.guess = [s; mu; DAE.y; Qg; Ps; Pd; Pr; ro];else OPF.guess = [s; mu; DAE.y; Qg; Ps; Pd; ro];endOPF.LMP = -ro(1:n1);if noDem, Demand = restore(Demand); endif ~OPF.basepl PQ = pqreset(PQ,'all');endif ~OPF.basepg SW = swreset(SW,'all'); PV = pvreset(PV,'all');end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -