What is the error message?
I suggest that you look at toggle_reserves.m and toggle_iflms.m as mentioned in
Chapt 6 of the manual for examples of how to implement and use the callback
mechanisms. While it is possible to extend the OPF using a structure similar to
what you are attempting, with ...
om = opf_setup(...)
... add_vars(...)
... add_constraints(...)
... add_costs(...)
opf_execute(...)
... I would still recommend implementing each "extension" as it's own set of
callbacks, similar to toggle_reserves or toggle_iflims. This allows you to
ensure that any input data is getting filtered and reordered properly when the
data is converted from external to internal indexing and back, and it allows
you to add any post-processing of results, printing of results, etc. in a very
clean way.
In any case, adding A, l and u as fields to mpc is only for the very simplest
cases where you have a single set of user constraints, but they must be in
place before opf_setup is called. In your case, I think you want to use
add_constraints to add your power factor constraints. And since they only
affect the Pg and Qg columns, you can construct it something like ...
Apf = sparse([2:ng 2:ng]', [2:ng ng+(2:ng)]', [QPratio*ones(ng-1,1);
-ones(ng-1,1)], ng-1, 2*ng);
bpf = zeros(ng-1, 1);
om = add_constraints(om, 'PF', Apf, bpf, bpf, {'Pg', 'Qg'});
Hope this helps,
--
Ray Zimmerman
Senior Research Associate
211 Warren Hall, Cornell University, Ithaca, NY 14853
phone: (607) 255-9645
On Jun 20, 2011, at 7:14 PM, Dailan Xu wrote:
> Dear Prof. Zimmerman
>
> Thank you very much for your guidance. I have written a code as follow(also I
> have attached in a m.file) that I need for both power factor constraint and
> variable constraints.
>
> But when I run runopf I encounter with an error. Could you please let me know
> what is the error?
>
> +++++++++++++++++++++++++++++++++++++++++++++++++++
> define_constants;
> mpc = loadcase( 't_case30_userfcns');
>
> om=opf_setup(mpc,mpopt);
> r = mpc.reserves;
> ng = size(mpc.gen, 1); %% number of on-line gens
>
> Rmin = zeros(ng, 1); %% bound below by 0
> Rmax = r.qty; %% bound above by stated max reserve qty ...
> k = find(mpc.gen(:, RAMP_10) > 0 & mpc.gen(:, RAMP_10) < Rmax);
> Rmax(k) = mpc.gen(k, RAMP_10); %% ... and ramp rate
> Rmax = Rmax / mpc.baseMVA;
>
> I = speye(ng); %% identity matrix
> Ar = [I I];
> Pmax = mpc.gen(:, PMAX) / mpc.baseMVA;
> lreq = r.req / mpc.baseMVA;
>
> Cw = r.cost * mpc.baseMVA; %% per unit cost coefficients
>
> om = add_vars(om, 'R', ng, [], Rmin, Rmax);
> om = add_constraints(om, 'Pg_plus_R', Ar, [], Pmax, {'Pg', 'R'});
> om = add_constraints(om, 'Rreq', r.zones, lreq, [], {'R'});
> om = add_costs(om, 'Rcost', struct('N', I, 'Cw', Cw), {'R'});
>
> nb = size(mpc.bus, 1);
> ng = size(mpc.gen, 1);
> pf = 0.95;
> QPratio = sqrt(1/pf^2 -1);
> %% add constraint that QPratio * Pg(i) - Qg(i) = 0, for i = 2 .. ng
> mpc.A = sparse([1:ng 1:ng]', [2*nb+(1:ng) 2*nb+ng+(1:ng)]',
> [QPratio*ones(ng,1); -ones(ng,1)], ng, 2*nb+2*ng);
> mpc.A = mpc.A(2:end, :);
> mpc.l = zeros(ng-1, 1);
> mpc.u = mpc.l;
> opf_execute(om,mpopt);
>
> +++++++++++++++++++++++++++++++++++++++++++++
>
> Best Regards
>
> D. Xu
>
>
>
> On Mon, Jun 20, 2011 at 21:47, Ray Zimmerman <[email protected]> wrote:
> You simply need to build an A matrix that has all of your constraints in it.
> In other words, in addition to the rows for the power factor constraints, you
> will be adding additional rows for the constraints that include your new
> variables. But new variables mean new columns in A as well. These must be
> added to all rows, including those for the power factor constraints.
>
> When you have multiple sets of constraints like this that you are adding, it
> is often best to use the callback mechanism described in Chapter 6. You can
> then treat them separately, using the add_vars and add_constraints functions
> and MATPOWER will then form the overall matrix at runtime. It allows you to
> implement and then enable/disable multiple OPF extensions independently.
>
> --
> Ray Zimmerman
> Senior Research Associate
> 211 Warren Hall, Cornell University, Ithaca, NY 14853
> phone: (607) 255-9645
>
>
>
> On Jun 20, 2011, at 10:21 AM, Dailan Xu wrote:
>
>> I have used the following code to impose power factor constraint for
>> generators (as you have written for one of the users). How can I
>> differenciate these two problems, i.e. adding a variable z and specified
>> power factor as follows: because we will have 2 matix of A
>> mpc = loadcase('t_auction_case');
>> nb = size(mpc.bus, 1);
>> ng = size(mpc.gen, 1);
>> pf = 0.95;
>> QPratio = sqrt(1/pf^2 -1);
>> %% add constraint that QPratio * Pg(i) - Qg(i) = 0, for i = 2 .. ng
>> mpc.A = sparse([1:ng 1:ng]', [2*nb+(1:ng) 2*nb+ng+(1:ng)]',
>> [QPratio*ones(ng,1); -ones(ng,1)], ng, 2*nb+2*ng);
>> mpc.A = mpc.A(2:end, :);
>> mpc.l = zeros(ng-1, 1);
>> mpc.u = mpc.l;
>> Best Regards
>>
>> D. Xu
>>
>>
>>
>> On Mon, Jun 20, 2011 at 16:08, Ray Zimmerman <[email protected]> wrote:
>> Section 6.4 references two examples included in MATPOWER. These both use the
>> callback mechanism. There is another very basic example at about line 184 of
>> t/t_opf_mips.m that defines the A, l, u and N, fparm, H and Cw parameters
>> to be passed directly to opf. As described in the first paragraph of chapter
>> 6, these parameters can also be specified as additional fields in the case
>> struct, which is how you would need to do it when calling runmarket.
>>
>> --
>> Ray Zimmerman
>> Senior Research Associate
>> 211 Warren Hall, Cornell University, Ithaca, NY 14853
>> phone: (607) 255-9645
>>
>>
>>
>> On Jun 20, 2011, at 9:41 AM, Dailan Xu wrote:
>>
>>> Thank U. Where can I find an example? or could you please give me an
>>> example?
>>>
>>> Best Regards
>>>
>>> D. Xu
>>>
>>>
>>> On Mon, Jun 20, 2011 at 15:28, Ray Zimmerman <[email protected]> wrote:
>>> The runmarket code is simply a wrapper around the OPF solver, so it's the
>>> same as adding variables to extend the OPF. The bus voltages are already
>>> control variables, but please see section 5.3 and chapter 6 of the manual
>>> for details on how to extend the OPF with other variables, constraints and
>>> costs.
>>>
>>> --
>>> Ray Zimmerman
>>> Senior Research Associate
>>> 211 Warren Hall, Cornell University, Ithaca, NY 14853
>>> phone: (607) 255-9645
>>>
>>>
>>>
>>> On Jun 20, 2011, at 9:15 AM, Dailan Xu wrote:
>>>
>>> > Dear Prof. Zimmerman
>>> >
>>> > How can I add an optimization variable to runmarket, for example, adding
>>> > voltage of buses as control variable? Is it possible?
>>> >
>>> > Best Regards
>>> >
>>> > D. Xu
>>> >
>>> >
>>>
>>>
>>>
>>>
>>>
>>
>>
>
>
> <userfcn_reserves_formulation.m>