📄 fm_gams.m
字号:
if isempty(CPF.lambda) fm_disp([' * CPF solution: <empty>']) elseif isnan(CPF.lambda) fm_disp([' * CPF solution: <NaN>']) else fm_disp([' * CPF solution: ',num2str(CPF.lambda-1)]) end if isnan(CPF.lambda) stop_opf = 1; break end if isempty(CPF.lambda) stop_opf = 1; break end if CPF.lambda ~= lambdaci CPF.lambda = CPF.lambda - 0.995; end if CPF.lambda < lambdaci & abs(ml) <= 1e-5 ml = 0; CPF.lambda = lmin+1e-5; end if CPF.lambda < lmin & abs(ml) > 1e-5 fm_disp([' * Decrease Delta Ps and Delta Pd']) delta = 0.5*delta; if delta < 5e-8 fm_disp([' * CPF method cannot find a higher lambda']) stop_opf = 1; break end repeat_cpf = 1; else repeat_cpf = 0; end % maximum lambda increment if (CPF.lambda - lmin) > 0.025 % & (abs(ml) > 1e-5 | CPF.lambda > 0.6) fm_disp(['lambda critical = ',num2str(CPF.lambda)]) fm_disp(['Limit lambda increment to threshold (0.025)']) CPF.lambda = lmin + 0.025; end % stopping criterion % ------------------------------------------------------ if last_point fm_disp('Reached maximum lambda.') if CPF.lambda > lmin fm_disp('Desired maximum lambda is not critical.') end stop_opf = 1; break end if i >= CPF.nump fm_disp('Reached maximum # of continuation steps.') stop_opf = 1; break end if CPF.lambda >= GAMS.lmax CPF.lambda = GAMS.lmax; last_point = 1; end if CPF.lambda == 0 fm_disp('Base case solution is likely unfeasible.') stop_opf = 1; break end if abs(lmin-CPF.lambda) < 1e-5 %fm_disp(['|lambda(i+1) - lambda(i)| = ', ... % num2str(abs(lmin-CPF.lambda))]) fm_disp('Lambda increment is lower than the desired tolerance.') stop_opf = 1; break elseif ~repeat_cpf if abs(ml) < 1e-5 lmin = CPF.lambda+0.001; lmax = CPF.lambda+0.001; else lmin = CPF.lambda; lmax = CPF.lambda; end break end end %end if stop_opf, break, end end % restore original data and settings % -------------------------------------------------------- DAE.V = Snapshot(1).V; DAE.a = Snapshot(1).ang; Snapshot(1).Pg = snappg; Bus.Pg = Bus_old.Pg; Bus.Qg = Bus_old.Qg; Bus.Pl = Bus_old.Pl; Bus.Ql = Bus_old.Ql; DAE.J11 = J11old; DAE.J12 = J12old; DAE.J21 = J21old; DAE.J22 = J22old; PV = restore(PV); SW = restore(SW); PQ = pqreset(PQ,'all'); CPF = CPF_old; CPF.init = 4; Varout.t = []; Varout.vars = []; fm_disp % uncomment to plot [dP/d lambda] instead of [P] %Ps = DPs; %Pd = DPd; else fm_disp('Continuation OPF not implemented yet...') cd(currentpath) return endend% -------------------------------------------------------------------% Output% -------------------------------------------------------------------MVA = Settings.mva;TPQ = MVA*totp(PQ);% character for backslashbslash = char(92);if GAMS.method == 6, type = 3; endif type == 2 | type == 3 switch GAMS.flow case 0, flow = 'I_'; case 1, flow = 'I_'; case 2, flow = 'P_'; case 3, flow = 'S_'; end Lf = cellstr(num2str(Line.from)); Lt = cellstr(num2str(Line.to)); TD = MVA*sum(Pd')'; if type == 2 TD = MVA*sum(Pd,2); TTL = TD + TPQ*Ch.val'; TL = MVA*sum(Ps')' + MVA*sum(Bus.Pg)*Ch.val' - TTL; TBL = TL - MVA*Snapshot(1).Ploss*Ch.val'; for i = 1:size(Ps,1) PG(i,:) = full(sparse(1,iBPs,Ps(i,:),1,Bus.n)+Ch.val(i)*Bus.Pg')*MVA; end for i = 1:size(Pd,1) PL(i,:) = full(sparse(1,iBPd,Pd(i,:),1,Bus.n)+Ch.val(i)*Bus.Pl')*MVA; end elseif type == 3 TTL = TD + TPQ; TL = MVA*sum(Ps')' + MVA*sum(Bus.Pg) - TTL; TBL = TL - MVA*Snapshot(1).Ploss; for i = 1:size(Ps,1) PG(i,:) = full(sparse(1,iBPs,Ps(i,:),1,Bus.n)+Bus.Pg')*MVA; end for i = 1:size(Pd,1) PL(i,:) = full(sparse(1,iBPd,Pd(i,:),1,Bus.n)+Bus.Pl')*MVA; end end PayS = -PG.*ro; PayD = PL.*ro; ISO = sum(PayS')'+sum(PayD')'; if GAMS.method == 4 | GAMS.method == 6 MLC = TTL.*(1+lambdac); elseif GAMS.method == 5 MLC = TTL.*lambdac; end Varname.uvars = strcat('PS_',{Varname.bus{Supply.bus}}'); Varname.uvars = [Varname.uvars;strcat('PD_',{Varname.bus{Demand.bus}}')]; Varname.uvars = [Varname.uvars;strcat('PG_',{Varname.bus{:}}')]; Varname.uvars = [Varname.uvars;strcat('PL_',{Varname.bus{:}}')]; Varname.uvars = [Varname.uvars;strcat('Pay_S_',{Varname.bus{:}}')]; Varname.uvars = [Varname.uvars;strcat('Pay_D_',{Varname.bus{:}}')]; Varname.uvars = [Varname.uvars;strcat('theta_',{Varname.bus{:}}')]; Varname.uvars = [Varname.uvars;strcat('V_',{Varname.bus{:}}')]; Varname.uvars = [Varname.uvars;strcat('Qg_',{Varname.bus{iBQg}}')]; if GAMS.method > 2 & GAMS.method ~= 5 Varname.uvars = [Varname.uvars;strcat('LMP_',{Varname.bus{:}}')]; Varname.uvars = [Varname.uvars;strcat('NCP_',{Varname.bus{:}}')]; elseif GAMS.method == 2 Varname.uvars = [Varname.uvars;strcat('LMP_',{Varname.bus{:}}')]; elseif GAMS.method == 5 Varname.uvars = [Varname.uvars;strcat(bslash,'rho_',{Varname.bus{:}}')]; else Varname.uvars = [Varname.uvars;{'MCP'}]; end Varname.uvars = [Varname.uvars;strcat(flow,Lf,'-',Lt)]; Varname.uvars = [Varname.uvars;strcat(flow,Lt,'-',Lf)]; Varname.uvars = [Varname.uvars;{'Total Demand';'TTL';'Total Losses'; ... 'Total Bid Losses';'IMO Pay'}]; if GAMS.method >= 4 Varname.uvars = [Varname.uvars;{'MLC'}]; Varname.uvars = [Varname.uvars;{'ALC'}]; end Varname.fvars = strcat('P_{S',{Varname.bus{Supply.bus}}','}'); Varname.fvars = [Varname.fvars;strcat('P_{D',{Varname.bus{Demand.bus}}','}')]; Varname.fvars = [Varname.fvars;strcat('P_{G',{Varname.bus{:}}','}')]; Varname.fvars = [Varname.fvars;strcat('P_{L',{Varname.bus{:}}','}')]; Varname.fvars = [Varname.fvars;strcat('Pay_{S',{Varname.bus{:}}','}')]; Varname.fvars = [Varname.fvars;strcat('Pay_{D',{Varname.bus{:}}','}')]; Varname.fvars = [Varname.fvars;strcat(bslash,'theta_{',{Varname.bus{:}}','}')]; Varname.fvars = [Varname.fvars;strcat('V_{',{Varname.bus{:}}','}')]; Varname.fvars = [Varname.fvars;strcat('Q_{g',{Varname.bus{iBQg}}','}')]; if GAMS.method > 2 & GAMS.method ~= 5 Varname.fvars = [Varname.fvars;strcat('LMP_{',{Varname.bus{:}}','}')]; Varname.fvars = [Varname.fvars;strcat('NCP_{',{Varname.bus{:}}','}')]; elseif GAMS.method == 2 Varname.fvars = [Varname.fvars;strcat('LMP_{',{Varname.bus{:}}','}')]; elseif GAMS.method == 5 Varname.fvars = [Varname.fvars;strcat(bslash,'rho_',{Varname.bus{:}}')]; else Varname.fvars = [Varname.fvars;{'MCP'}]; end Varname.fvars = [Varname.fvars;strcat(flow,'{',Lf,'-',Lt,'}')]; Varname.fvars = [Varname.fvars;strcat(flow,'{',Lt,'-',Lf,'}')]; Varname.fvars = [Varname.fvars;{'Total Demand';'TTL';'Total Losses'; ... 'Total Bid Losses';'IMO Pay'}]; if GAMS.method >= 4 Varname.fvars = [Varname.fvars;{'MLC'}]; Varname.fvars = [Varname.fvars;{'ALC'}]; end switch GAMS.method case 3 % OPF Varout.vars = [Ps*MVA,Pd*MVA,PG,PL,PayS,PayD,a,V,Qg(:,iBQg)*MVA, ... ro,NCP,Pij,Pji,TD,TTL,TL,TBL,ISO]; case {4,6} % VSC-OPF Varname.uvars = [Varname.uvars;{'lambda_c';'kg_c'}]; Varname.uvars = [Varname.uvars;strcat('thetac_',{Varname.bus{:}}')]; Varname.uvars = [Varname.uvars;strcat('Vc_',{Varname.bus{:}}')]; Varname.uvars = [Varname.uvars;strcat('Qgc_',{Varname.bus{iBQg}}')]; Varname.uvars = [Varname.uvars;strcat(flow,'c',Lf,'-',Lt)]; Varname.uvars = [Varname.uvars;strcat(flow,'c',Lt,'-',Lf)]; Varname.fvars = [Varname.fvars;{[bslash,'lambda_c'];'k_g_c'}]; Varname.fvars = [Varname.fvars;strcat(bslash,'theta_{c',{Varname.bus{:}}','}')]; Varname.fvars = [Varname.fvars;strcat('V_{c',{Varname.bus{:}}','}')]; Varname.fvars = [Varname.fvars;strcat('Q_{gc',{Varname.bus{iBQg}}','}')]; Varname.fvars = [Varname.fvars;strcat(flow,'{c',Lf,'-',Lt,'}')]; Varname.fvars = [Varname.fvars;strcat(flow,'{c',Lt,'-',Lf,'}')]; Varout.vars = [Ps*MVA,Pd*MVA,PG,PL,PayS,PayD,a,V,Qg(:,iBQg)*MVA, ... ro,NCP,Pij,Pji,TD,TTL,TL,TBL,ISO,MLC,MLC-TTL,lambdac,kg, ... ac,Vc,Qgc(:,iBQg)*MVA,Pijc,Pjic]; case 5 % MLC Varname.uvars = [Varname.uvars;{'lambda_c';'kg_c'}]; Varname.fvars = [Varname.fvars;{bslash,'lambda_c';'k_g_c'}]; Varout.vars = [Ps*MVA,Pd*MVA,PG,PL,PayS,PayD,a,V,Qg(:,iBQg)*MVA, ... ro,Pij,Pji,TD,TTL,TL,TBL,ISO,MLC,lambdac,kg]; otherwise % SA and MCM Varout.vars = [Ps*MVA,Pd*MVA,PG,PL,PayS,PayD,a,V,Qg(:,iBQg)*MVA, ... MCP,Pij,Pji,TD,TTL,TL,TBL,ISO]; end if GAMS.method == 6 % Continuation OPF Settings.xlabel = [bslash,'lambda (loading parameter)']; Varout.t = Lambda'; elseif type == 2 % Multi Period Auction Varout.vars = Varout.vars([2:end],:); Settings.xlabel = 'hour [h]'; Varout.t = [1:Ypdp.len]'; elseif type == 3 % Pareto Set Single Period Auction Settings.xlabel = [bslash,'omega (weighting factor)']; Varout.t = GAMS.omega'; end Varout.idx = [1:length(Varout.vars(1,:))]; fm_disp(' ---------------------------------------------------------------') fm_disp([' Check file ',Path.psat,'fm_gams.lst for GAMS report.']) if strcmp(control,'6') fm_disp([' PSAT-GAMS Optimization Routine completed in ', ... num2str(etime(clock,initial_time)),' s']) else fm_disp([' PSAT-GAMS Optimization Routine completed in ',num2str(toc),' s']) end Demand = restore(Demand); if ~GAMS.basepl Bus.Pl = buspl; Bus.Ql = busql; PQ = pqreset(PQ,'all'); end if ~GAMS.basepg Snapshot(1).Ploss = ploss; Bus.Pg = buspg; Bus.Qg = busqg; PV = pvreset(PV,'all'); end % restore original bus power injections Bus.Pg = Snapshot(1).Pg; Bus.Qg = Snapshot(1).Qg; Bus.Pl = Snapshot(1).Pl; Bus.Ql = Snapshot(1).Ql; returnendif type == 4 Ps = Ps(2,:)'; Pd = Pd(2,:)'; V = V(2,:)'; a = a(2,:)'; Qg = Qg(2,iBQg)'; Pij = Pij(2,:)'; Pji = Pji(2,:)'; if GAMS.method <= 2 MCP = MCP(2,:); end if GAMS.method >= 3 ro = ro(2,:)'; if GAMS.method ~= 5 NCP = NCP(2,:)'; end end if GAMS.method == 4 | GAMS.method == 6 Vc = Vc(2,:)'; ac = ac(2,:)'; Qgc = Qgc(2,iBQg)'; Pijc = Pijc(2,:)'; Pjic = Pjic(2,:)'; end if GAMS.method >= 4 lambdac = lambdac(2); kg = kg(2); endendDemand = pset(Demand,Pd);Supply = pset(Supply,Ps);if GAMS.method == 4 | GAMS.method == 6 DAE.V = Vc; DAE.a = ac; fm_lf(1) glfpc = DAE.glfp; glfqc = DAE.glfq;endif GAMS.method >= 3 DAE.V = V; DAE.a = a; fm_lf(1) Qg = Qg(iBQg);endif GAMS.method == 1 ro = MCP*ones(Bus.n,1);endif GAMS.method == 2 [rows,cols] = size(MCP); if rows == 1, ro = MCP'; else ro = MCP; endendQgmin = Qgmin(iBQg);Qgmax = Qgmax(iBQg);if GAMS.basepl PG = full((sparse(iBPs,1,Ps,Bus.n,1)+Bus.Pg)*MVA); PL = full((sparse(iBPd,1,Pd,Bus.n,1)+Bus.Pl)*MVA);else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -