📄 fm_opfsdr.m
字号:
% Hessian Matrix [D2xLms] % -------------------------------------------------------------------- H3 = sparse(n_a,n_y); Hx = -ro(n2+Supply.bus); Sidx = 1:Supply.n; H3(n_gen+Sidx,n_d) = Hx; H3(n_gen+Sidx,n4+1+n_a) = Hx.*ksu; H5(n_gen+1,n2+n_gen+Sidx) = Hx'; H41(end,n2+n_gen+Sidx) = Hx'.*ksu'; Didx = 1:Demand.n; Hx = ro(n2+Demand.bus) + qonp.*ro(n3+Demand.bus); H3(n_gen+Supply.n+Didx,n_d) = Hx; H5(n_gen+1,n2+n_gen+Supply.n+Didx) = Hx'; H3 = H3 - sparse(n_gen+nS,n2+n_gen+nS,(1-w)*(2*Csc+2*KTBS),n_a,n_y); H3 = H3 - sparse(busS,n2+busS,(1-w)*2*Dsc,n_a,n_y); H3 = H3 + sparse(n_gen+Supply.n+nD,n_gen+Supply.n+n2+nD, ... (1-w)*(2*Cdc+2*KTBD+2*Ddc.*qonp.*qonp),n_a,n_y); V_snap = DAE.V; ang_snap = DAE.a; DAE.V = Vc; DAE.a = angc; if OPF.line, Line.Y = Y_cont; end Hess_c = -fm_hessian(ro(n2+1:n4))+Hijc+Hjic; DAE.V = V_snap; DAE.a = ang_snap; if OPF.line, Line.Y = Y_orig; end Hess = -fm_hessian(ro(1:n2))+Hij+Hji; D2xLms = [Hess, H31; -H3; -H41, [Hess_c, Hcolk; Hrowk], H42; -H5]; switch OPF.method case 1 % Newton Directions % reduced system if Settings.octave H_m = diag(mu./s); H_s = diag(1./s); else 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); end Jh(:,SW.bus+n2+n_a) = 0; Jh(:,SW.bus) = 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.bus,:) = 0; Jd(:,SW.bus) = 0; if Settings.octave Jd(SW.bus,SW.bus) = eye(SW.n); else Jd(SW.bus,SW.bus) = speye(SW.n); end gy(SW.bus) = 0; % reference angle for the critical system Jd(:,SW.bus+n2+n_a) = 0; Jd(SW.bus+n2+n_a,:) = 0; if Settings.octave Jd(SW.bus+n2+n_a,SW.bus+n2+n_a) = eye(SW.n); else Jd(SW.bus+n2+n_a,SW.bus+n2+n_a) = speye(SW.n); end gy(SW.bus+n2+n_a) = 0; % variable increments Dx = -Jd\[gy; -DAE.gp; -DAE.gq; -gc1p; -gc1q]; Ds = -(gmu+Jh*Dx([1:n_y])); Dm = -H_s*gs-H_m*Ds; case 2 % Mehrotra's Predictor-Corrector % ------------------- % Predictor step % ------------------- % reduced system if Settings.octave H_m = diag(mu./s); else H_m = sparse(1:n_s,1:n_s,mu./s,n_s,n_s); end Jh(:,SW.bus+n2+n_a) = 0; Jh(:,SW.bus) = 0; gx = gy+(Jh.')*(H_m*gmu-mu); Jd = [D2xLms+(Jh.')*(H_m*Jh),-Jg.';-Jg,Z3]; % reference angle for the actual system Jd(SW.bus,:) = 0; Jd(:,SW.bus) = 0; if Settings.octave Jd(SW.bus,SW.bus) = eye(SW.n); else Jd(SW.bus,SW.bus) = speye(SW.n); end gx(SW.bus) = 0; % reference angle for the critical system Jd(:,SW.bus+n2+n_a) = 0; Jd(SW.bus+n2+n_a,:) = 0; if Settings.octave Jd(SW.bus+n2+n_a,SW.bus+n2+n_a) = eye(SW.n); else Jd(SW.bus+n2+n_a,SW.bus+n2+n_a) = speye(SW.n); end gx(SW.bus+n2+n_a) = 0; % LU factorization [L,U,P] = lu(Jd); % variable increments Dx = -U\(L\(P*[gx; -DAE.gp; -DAE.gq; -gc1p; -gc1q])); 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.bus) = 0; gx(SW.bus+n2+n_a) = 0; % variable increments Dx = -U\(L\(P*[gx; -DAE.gp; -DAE.gq; -gc1p; -gc1q])); Ds = -(gmu+Jh*Dx([1:n_y])); Dm = -gs-H_m*Ds; end % ======================================================================= % Variable Increments % ======================================================================= Dtheta = Dx(nB); idx = Bus.n; % curr. sys. DV = Dx(idx+nB); idx = idx + Bus.n; DQg = Dx(idx+nG); idx = idx + n_gen; DPs = Dx(idx+nS); idx = idx + Supply.n; DPd = Dx(idx+nD); idx = idx + Demand.n; Dthetac = Dx(idx+nB); idx = idx + Bus.n; % crit. sys. DVc = Dx(idx+nB); idx = idx + Bus.n; Dkg = Dx(1+idx); idx = idx + 1; DQgc = Dx(idx+nG); idx = idx + n_gen; Dlc = Dx(1+idx); idx = idx + 1; if Rsrv.n, DPr = Dx(idx+nR); idx = idx + Rsrv.n; end Dro = Dx(1+idx:end); % Lag. mult. % ======================================================================= % Updating the Variables % ======================================================================= % Step Lenght 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.a = DAE.a + alpha_P * Dtheta; DAE.V = DAE.V + alpha_P * DV; Ps = Ps + alpha_P * DPs; Pd = Pd + alpha_P * DPd; Qg = Qg + alpha_P * DQg; if Rsrv.n, Pr = Pr + alpha_P * DPr; end angc = angc + alpha_P * Dthetac; Vc = Vc + alpha_P * DVc; kg = kg + alpha_P * Dkg; Qgc = Qgc + alpha_P * DQgc; lc = lc + alpha_P * Dlc; 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(busS) - 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(busS).*Qg(busS)); if Rsrv.n, Reserve = Cr'*Pr; else, Reserve = 0; end G_obj = (1-w)*(Fixd_c + Prop_c + Quad_c + Quad_q + TieBreaking + Reserve) - ... ms*sum(log(s)) - w*lc; % ======================================================================= % 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.gp; DAE.gq; gc1p; gc1q],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; 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 fm_status('opf','update',[iteration, ms, norma2, norma3, norma4], ... iteration) if iteration > iter_max, break, endend% Some settings ...%____________________________________________________________________________Demand.con(:,7) = Pd;Supply.con(:,6) = Ps;if Rsrv.n, Rsrv.con(:,10) = Pr; endIij = sqrt(Iij);Iji = sqrt(Iji);Iijc = sqrt(Iijc);Ijic = sqrt(Ijic);Iijmax = sqrt(Iijmax);Iijcmax = sqrt(Iijcmax);MVA = Settings.mva;Pay = ro(1:Bus.n).*DAE.glfp*MVA;ISOPay = sum(Pay);% Nodal Congestion Prices (NCPs)%____________________________________________________________________________Jlfv(SW.bus,:) = [];Jlfv(:,SW.bus) = [];dH_dtV(SW.bus,:) = [];NCP = -Jlfv'\dH_dtV;OPF.NCP = [NCP(1:SW.bus-1);0;NCP(SW.bus:end)];OPF.obj = G_obj;OPF.ms = ms;OPF.dy = norma2;OPF.dF = norma3;OPF.dG = norma4;OPF.iter = iteration;OPF.gpc = gc2p;OPF.gqc = gc2q;SNB.init = 0;LIB.init = 0;CPF.init = 0;OPF.init = 2;% set Pg, Qg, Pl and Qlfor i = 1:Demand.n, k = Demand.bus(i); Bus.Pl(k) = Snapshot(1).Pl(k)+Pd(i); Bus.Ql(k) = Snapshot(1).Ql(k)+Pd(i)*qonp(i);endfor i = 1:Supply.n k = Supply.bus(i); Bus.Pg(k) = Snapshot(1).Pg(k)+Ps(i);endfor i = 1:n_gen Bus.Qg(nG(i)) = Qg(i);end% Display Results%____________________________________________________________________________if (Settings.showlf | OPF.show) & clpsat.showopf OPF.report = cell(1,1); OPF.report{1,1} = ['Weighting Factor = ',fvar(w,8)]; OPF.report{2,1} = ['Lambda = ',fvar(lc,8)]; OPF.report{3,1} = ['Kg = ',fvar(kg,8)]; OPF.report{4,1} = ['Total Losses = ',fvar(sum(DAE.glfp),8),' [p.u.]']; OPF.report{5,1} = ['Bid Losses = ',fvar(sum(DAE.glfp)-Snapshot(1).Ploss,8),' [p.u.]']; if ~noDem OPF.report{6,1} = ['Total demand = ', ... fvar(sum(Pd),8),' [p.u.]']; end OPF.report{6+(~noDem),1} = ['TTL = ', ... fvar(sum(Pd)+sum(PQ.con(:,4)),8),' [p.u.]']; fm_disp fm_disp('----------------------------------------------------------------') Settings.lftime = toc; 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.a; DAE.V; Qg; Ps; Pd; ... angc; Vc; kg; Qgc; lc; Pr; ro];else OPF.guess = [s; mu; DAE.a; DAE.V; Qg; Ps; Pd; ... angc; Vc; kg; Qgc; lc; ro];endOPF.atc = (1+lc)*(sum(Pd)+sum(PQ.con(:,4)))*MVA;OPF.Vc = Vc;OPF.ac = angc;if noDem, Demand.con = []; Demand.n = 0; Demand.bus = [];endif ~OPF.basepl Bus.Pl = buspl; Bus.Ql = busql; PQ.con(:,[4 5]) = pqcon;endif ~OPF.basepg Snapshot(1).Ploss = ploss; Bus.Pg = buspg; Bus.Qg = busqg; PV.con(:,4) = pvcon;end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -