Dear Ray,
As promised I am coming back with the feedback.
I added the mpc.l matrix (as apparently was required) , zeroed the mpc.gencost
matrix and tested the code on ‘case9’ test system.
The code seems to be giving the desired results in terms of generation in
res.gen matrix (res=runopf(mpc)). However, I do not understand the values of
res.x variables – please see below:
Plower=[10;10;sum(mpc.bus(:,PD))]; % preferably let the third unit cover the
demand completely
Pupper=[10;10;sum(mpc.bus(:,PD))];
And the results are
* Res.gen:
PG QG
1 18,8686331862694 46,3306849578324
2 37,4758584872943 9,01478391826475
3 269,999995145612 32,3104904279087
Whereas the res.x matrix last rows give:
157,648217200393
157,649905532785
312,300153184647
156,150153162622
156,150153162622
156,150153162622
312,300306325243
Frankly, I do not understand where the “X” variables values come from. They
seem not to be reflecting the soft limit violations. Yet, the generation
results look good – as we might be expecting.
Do you have an idea on the “x” variables values?
I am attaching the code.
With best regards,
Mariusz Drabecki,
Operations and Systems Research Division
Institute of Control and Computation Engineering
Warsaw University of Technology
PS: the complete code:
clear all
define_constants;
mpc1=loadcase('case9');
mpc=loadcase('case9');
nb = size(mpc.bus, 1);
ng = size(mpc.gen, 1);
Plower=[10;10;sum(mpc.bus(:,PD))];
Pupper=[10;10;sum(mpc.bus(:,PD))];
I = speye(ng,ng); % ng x ng identity matrix
Zb = sparse(ng, nb); % ng x nb zero matrix
Zg = sparse(ng, ng); % ng x ng zero matrix
m_0=sparse(ng,1);
% -Pg - sm <= -Plower
A1 = [Zb Zb -I Zg -I Zg m_0];
u1 = -Plower;
% Pg - sp >= Pupper
A2 = [Zb Zb I Zg -I Zg m_0];
u2 = Pupper;
% sm - T <= 0
A3 = [Zb Zb Zg Zg I Zg -ones(ng,1)];
u3 = zeros(ng, 1);
% sp - T <= 0
A4 = [Zb Zb Zg Zg Zg I -ones(ng,1)];
u4 = zeros(ng, 1);
%
% sp>=0 <=> -sp <=0
A5 = [Zb Zb Zg Zg Zg -I m_0];
u5 = zeros(ng, 1);
% sm>=0 <=> -sm <=0
A6 = [Zb Zb Zg Zg -I Zg m_0];
u6 = zeros(ng, 1);
%
u_added=[u1; u2; u3; u4;u5;u6];
mpc.A = [A1; A2; A3; A4;A5;A6];
size_dif=size(mpc.A,1)-length(u_added);
mpc.u = [1e10.*ones(size_dif,1);u_added];
mpc.l=[-1e10.*ones(length(u_added),1)];
mpc.N = [sparse(1, 2*nb+4*ng) 1]; % select T
mpc.Cw = 1;
mpc.gencost(:,5:7)=0;
res=runopf(mpc)
res2=runopf(mpc1);
From: [email protected]
<[email protected]> On Behalf Of [email protected]
Sent: Wednesday, June 24, 2020 6:30 PM
To: 'MATPOWER discussion forum' <[email protected]>
Subject: RE: Extension to AC OPF - soft limits
Thanks Ray very much for your support! I greatly appreciate it
I will it give the code a go and come back to you with feedback
Thanks and regards
Mariusz
From: [email protected]
<mailto:[email protected]>
<[email protected]
<mailto:[email protected]> > On Behalf Of Ray Daniel
Zimmerman
Sent: Wednesday, June 24, 2020 4:10 PM
To: MATPOWER-L <[email protected]
<mailto:[email protected]> >
Subject: Re: Extension to AC OPF - soft limits
I don’t think there is a way to do this using the existing soft limits
functionality in MATPOWER. However, it should be fairly straightforward to
implement using user-defined linear constraints and costs, since all of your
constraints and costs are linear. The simplest approach would probably be to
use Direct Specification as described in Section 7.1 of the User’s Manual.
Simply add A, l and u as extra fields in mpc to defined the constraints, with
extra columns in A to define the s and T variables. Then add N and Cw as extras
fields to define the cost on the new T variable (using the legacy cost format).
I suppose you will also want to set the generator costs to zero in the gencost
matrix.
For example, A and N can be defined with 2*nb + 4*ng + 1 columns, corresponding
to Va, Vm, Pg, Qg, sm, sp, T. The following (untested) code, should at least be
close to what you want …
nb = size(mpc.bus, 1);
ng = size(mpc.gen, 1);
I = speye(ng,ng); % ng x ng identity matrix
Zb = sparse(ng, nb); % ng x nb zero matrix
Zg = sparse(ng, ng); % ng x ng zero matrix
% -Pg - sm <= -Plower
A1 = [Zb Zb -I Zg -I Zg 0];
u1 = -Plower;
% Pg - sp >= Pupper
A2 = [Zb Zb I Zg -I Zg 0];
u2 = Pupper;
% sm - T <= 0
A3 = [Zb Zb Zg Zg I Zg -1];
u3 = zeros(ng, 1);
% sp - T <= 0
A4 = [Zb Zb Zg Zg Zg I -1];
u4 = zeros(ng, 1);
mpc.A = [A1; A2; A3; A4];
mpc.u = [u1; u2; u3; u4];
mpc.N = [sparse(1, 2*nb+4*ng) 1]; % select T
mpc.Cw = 1;
Let me know how it works,
Ray
On Jun 23, 2020, at 2:58 PM, [email protected] <mailto:[email protected]>
wrote:
Dear community,,
I am now working with soft limits on generation in AC-OPF. I know that these
are natively supported by Matpower.
However, I would like to change the formulation so to minimize the maximum
value of limit violation on P_G , i.e. as in the model below:
<image001.jpg>
I would like to ask you all if this is anyhow supported by Matpower ? If yes,
what would be the easiest way to do that?
Thanks in advance and regards,
Mariusz Drabecki,
Operations and Systems Research Division
Institute of Control and Computation Engineering
Warsaw University of Technology