📄 fm_gams.gms
字号:
$title GAMS/PSAT interface for solving the electricty market problem
$onempty
$offlisting
$offupper
$if exist psatglobs.gms $include psatglobs.gms
set B /1*%nBus%/,
L /1*%nLine%/,
G /1*%nPs%/,
C /1*%nPd%/,
W /1*%nSW%/,
U /1*%nPV%/,
busref(B) /%nBusref%/;
set supply /Ps0, Psmax, Psmin, Csa, Csb, Csc, Dsa, Dsb, Dsc, ksu/,
demand /Pd0, Pdmax, Pdmin, tgphi, Cda, Cdb, Cdc, Dda, Ddb, Ddc/,
data /V0, t0, Pg0, Qg0, Pl0, Ql0, Qgmax, Qgmin, Vmax, Vmin, ksw, kpv/,
lines /g, b, g0, b0, Pijmax, Pjimax/,
vsc /lmin, lmax, omega, line/;
alias (BB,B);
parameter S(G,supply) //,
D(C,demand) //,
X(B,data) //,
N(L,lines) //,
lambda(vsc) //,
Ps_idx(B,G) //,
Pd_idx(B,C) //,
SW_idx(B,W) //,
PV_idx(B,U) //,
Li(L,B) //,
Lj(L,B) //,
Gh(B,BB) //,
Bh(B,BB) //,
Ghc(B,BB) //,
Bhc(B,BB) //;
scalar MLC /0/,
pi /3.1416/;
$if exist psatdata.gms $include psatdata.gms
* =========================================================================
* ==================== C O M M O N V A R I A B L E S ===================
* =========================================================================
variables obj,
Pij(L),
Pji(L),
V(B),
a(B),
Ps(G),
Pd(C),
Qg(B);
* -------------------------------------------------------------------------
* initial values
* -------------------------------------------------------------------------
Qg.l(B) = X(B,'Qg0');
V.l(B) = X(B,'V0');
a.l(B) = X(B,'t0');
Ps.l(G) = S(G,'Psmin');
Pd.l(C) = D(C,'Pdmin');
* -------------------------------------------------------------------------
* limits
* -------------------------------------------------------------------------
* Bid Blocks
Ps.up(G) = S(G,'Psmax');
Pd.up(C) = D(C,'Pdmax');
Ps.lo(G) = S(G,'Psmin');
Pd.lo(C) = D(C,'Pdmin');
* Voltages & Voltage Limits
V.up(B) = X(B,'Vmax');
V.lo(B) = X(B,'Vmin');
a.up(B) = pi;
a.lo(B) = -pi;
* Generator Reactive Power Limits
Qg.up(B) = X(B,'Qgmax');
Qg.lo(B) = X(B,'Qgmin');
* Flow limits on transmission lines
Pij.up(L) = N(L,'Pijmax');
Pij.lo(L) = -N(L,'Pijmax');
Pji.up(L) = N(L,'Pijmax');
Pji.lo(L) = -N(L,'Pijmax');
* -------------------------------------------------------------------------
* define equations
* -------------------------------------------------------------------------
equation cost;
$if %control% == 1 $goto jfloweq
equation Peq(B);
$if %control% == 2 $goto jfloweq
equations Qeq(B),
Thetaref(B);
$if %flow% == 0 $goto jfloweq
equations Pijeq(L),
Pjieq(L);
$label jfloweq
* =========================================================================
* -------------------------------------------------------------------------
* ============================ M E T H O D S ==============================
* -------------------------------------------------------------------------
* =========================================================================
* check method
$if %control% == 1 $goto auction
$if %control% == 2 $goto mcm
$if %control% == 3 $goto opf
$if %control% == 4 $goto vscopf
$if %control% == 5 $goto mlcopf
$if %control% == 6 $goto vscopf
* =========================================================================
* ====================== S I M P L E A U C T I O N ====================
* =========================================================================
$label auction
* -------------------------------------------------------------------------
* objective function
cost.. obj =e= sum(G,Ps(G)*S(G,'Csb')) - sum(C,Pd(C)*D(C,'Cdb'));
* -------------------------------------------------------------------------
equation Pbalance;
Pbalance.. sum(G,Ps(G)) + sum(B,X(B,'Pg0')) -
sum(C,Pd(C)) - sum(B,X(B,'Pl0')) =e= 0;
$goto solvestat
* =========================================================================
* =========== M A R K E T C L E A R I N G M E C H A N I S M ===========
* =========================================================================
$label mcm
* -------------------------------------------------------------------------
* objective function
cost.. obj =e= sum(G,Ps(G)*S(G,'Csb')) - sum(C,Pd(C)*D(C,'Cdb'));
* -------------------------------------------------------------------------
equations Thetaref(B);
Thetaref(B)$busref(B).. a(B) =e= 0;
Peq(B).. sum(G,Ps_idx(B,G)*Ps(G)) + X(B,'Pg0') -
sum(C,Pd_idx(B,C)*Pd(C)) - X(B,'Pl0') -
sum(BB,Bh(B,BB)*a(BB)) =e= 0;
equation Pijeq(L);
Pijeq(L).. Pij(L) =e= sum(B,Li(L,B)*a(B))-sum(B,Lj(L,B)*a(B));
$goto solvestat
* =========================================================================
* ================== O P T I M A L P O W E R F L O W =================
* =========================================================================
$label opf
* -------------------------------------------------------------------------
* objective function
cost.. obj =e= sum(G,S(G,'Csa')) + sum(G,Ps(G)*S(G,'Csb'))
+ sum(G,sqr(Ps(G))*S(G,'Csc'))
+ sum(G,S(G,'Dsa'))
+ sum(B,Qg(B)*sum(G,Ps_idx(B,G)*S(G,'Dsb')))
+ sum(B,sqr(Qg(B))*sum(G,Ps_idx(B,G)*S(G,'Dsc')))
- sum(C,D(C,'Cda')) - sum(C,Pd(C)*D(C,'Cdb'))
- sum(C,sqr(Pd(C))*D(C,'Cdc'))
- sum(C,D(C,'Dda'))
- sum(C,(D(C,'tgphi')*Pd(C))*D(C,'Ddb'))
- sum(C,sqr(D(C,'tgphi')*Pd(C))*D(C,'Ddc'));
* -------------------------------------------------------------------------
Peq(B).. sum(G,Ps_idx(B,G)*Ps(G)) -
sum(C,Pd_idx(B,C)*Pd(C)) + X(B,'Pg0') - X(B,'Pl0') -
V(B)*sum(BB,V(BB)*(Gh(B,BB)*cos(a(B)-a(BB)) +
Bh(B,BB)*sin(a(B)-a(BB)))) =e= 0;
Qeq(B).. Qg(B) - X(B,'Ql0') - sum(C,Pd_idx(B,C)*(D(C,'tgphi')*Pd(C))) -
V(B)*sum(BB,V(BB)*(Gh(B,BB)*sin(a(B)-a(BB)) -
Bh(B,BB)*cos(a(B)-a(BB)))) =e= 0;
Thetaref(B)$busref(B).. a(B) =e= 0;
$goto floweq
* =========================================================================
* ====== V O L T A G E S T A B I L I T Y C O N S T R A I N E D ======
* ================== O P T I M A L P O W E R F L O W =================
* =========================================================================
$label vscopf
* -------------------------------------------------------------------------
* local variables
* -------------------------------------------------------------------------
variables Pijc(L),
Pjic(L),
Vc(B),
ac(B),
Qgc(B),
kg,
lambdac;
* -------------------------------------------------------------------------
* initial values
* -------------------------------------------------------------------------
Qgc.l(B) = X(B,'Qg0');
Vc.l(B) = X(B,'V0');
ac.l(B) = X(B,'t0');
kg.l = 0;
* -------------------------------------------------------------------------
* limits
* -------------------------------------------------------------------------
* Voltages & Voltage Limits
Vc.up(B) = X(B,'Vmax');
Vc.lo(B) = X(B,'Vmin');
ac.up(B) = pi;
ac.lo(B) = -pi;
kg.lo = -1;
kg.up = 1;
* Generator Reactive Power Limits
Qgc.up(B) = X(B,'Qgmax');
Qgc.lo(B) = X(B,'Qgmin');
* Flow limits on transmission lines
Pijc.up(L) = N(L,'Pijmax');
Pijc.lo(L) = -N(L,'Pijmax');
Pjic.up(L) = N(L,'Pijmax');
Pjic.lo(L) = -N(L,'Pijmax');
lambdac.up = lambda('lmax');
lambdac.lo = lambda('lmin');
* -------------------------------------------------------------------------
* objective function
cost.. obj =e= (1-lambda('omega'))*
(sum(G,S(G,'Csa')) + sum(G,Ps(G)*S(G,'Csb'))
+ sum(G,sqr(Ps(G))*S(G,'Csc'))
+ sum(G,S(G,'Dsa'))
+ sum(B,Qg(B)*sum(G,Ps_idx(B,G)*S(G,'Dsb')))
+ sum(B,sqr(Qg(B))*sum(G,Ps_idx(B,G)*S(G,'Dsc')))
- sum(C,D(C,'Cda')) - sum(C,Pd(C)*D(C,'Cdb'))
- sum(C,sqr(Pd(C))*D(C,'Cdc'))
- sum(C,D(C,'Dda'))
- sum(C,(D(C,'tgphi')*Pd(C))*D(C,'Ddb'))
- sum(C,sqr(D(C,'tgphi')*Pd(C))*D(C,'Ddc')))
- lambda('omega')*lambdac;
* -------------------------------------------------------------------------
equations Pceq(B),
Qceq(B),
Thetacref(B);
* ------------------------------------
* equation lambdaeq;
* lambdaeq.. lambdac-lambda('lmin') =e= 0;
* ------------------------------------
$if %flow% == 0 $goto jfloweqc
equations Pijceq(L),
Pjiceq(L);
$label jfloweqc
Peq(B).. sum(G,Ps_idx(B,G)*Ps(G)) -
sum(C,Pd_idx(B,C)*Pd(C)) + X(B,'Pg0') - X(B,'Pl0') -
V(B)*sum(BB,V(BB)*(Gh(B,BB)*cos(a(B)-a(BB)) +
Bh(B,BB)*sin(a(B)-a(BB)))) =e= 0;
Qeq(B).. Qg(B) - X(B,'Ql0') - sum(C,Pd_idx(B,C)*(D(C,'tgphi')*Pd(C))) -
V(B)*sum(BB,V(BB)*(Gh(B,BB)*sin(a(B)-a(BB)) -
Bh(B,BB)*cos(a(B)-a(BB)))) =e= 0;
Thetaref(B)$busref(B).. a(B) =e= 0;
*sum(G,Ps_idx(B,G)*(S(G,'ksu')*Ps(G))) +
* sum(W,SW_idx(B,W)*(X(B,'ksw')*X(B,'Pg0'))) +
* sum(U,PV_idx(B,U)*(X(B,'kpv')*X(B,'Pg0')))
Pceq(B).. (1+lambdac+kg)*(sum(G,Ps_idx(B,G)*Ps(G)) + X(B,'Pg0')) -
(1+lambdac)*(sum(C,Pd_idx(B,C)*Pd(C)) + X(B,'Pl0')) -
Vc(B)*sum(BB,Vc(BB)*(Ghc(B,BB)*cos(ac(B)-ac(BB)) +
Bhc(B,BB)*sin(ac(B)-ac(BB)))) =e= 0;
Qceq(B).. Qgc(B) - (1+lambdac)*(X(B,'Ql0') +
sum(C,Pd_idx(B,C)*(D(C,'tgphi')*Pd(C)))) -
Vc(B)*sum(BB,Vc(BB)*(Ghc(B,BB)*sin(ac(B)-ac(BB)) -
Bhc(B,BB)*cos(ac(B)-ac(BB)))) =e= 0;
Thetacref(B)$busref(B).. ac(B) =e= 0;
$goto floweq
* =========================================================================
* =========== M A X I M U M L O A D I N G C O N D I T I O N ===========
* =========================================================================
$label mlcopf
* -------------------------------------------------------------------------
* local variables
* -------------------------------------------------------------------------
variables kg,
lambdac;
* -------------------------------------------------------------------------
* initial values
* -------------------------------------------------------------------------
kg.l = 0;
lambdac.l = 1;
* -------------------------------------------------------------------------
* limits
* -------------------------------------------------------------------------
* Bid Blocks
Ps.up(G) = S(G,'Ps0');
Pd.up(C) = D(C,'Pd0');
Ps.lo(G) = S(G,'Ps0');
Pd.lo(C) = D(C,'Pd0');
* Loading Parameter
kg.lo = -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -