In an OPF there is no slack bus, only a reference bus to serve as a reference for the voltage angles. The voltages at all buses are already optimization variables. You don't need to add it. And you can constrain it as you like, either with fixed limits using the VMIN and VMAX columns in the bus matrix, or by adding linear constraints that tie it to any of your other optimization variables, (Pg, Qg, Vm, Va or any user-specified variables).
-- Ray Zimmerman Senior Research Associate 211 Warren Hall, Cornell University, Ithaca, NY 14853 phone: (607) 255-9645 On Jun 21, 2011, at 6:52 AM, Dailan Xu wrote: > Dear Prof. Zimmerman > > Another question: I want to use an OLTC (on load tap changer) to control the > voltage of slack bus. Is it possible to do it in MATPOWER by adding an > optimization variable(voltage of slack bus)? > > > Best Regards > > D. Xu > > > > On Tue, Jun 21, 2011 at 01:14, Dailan Xu <[email protected]> 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 >>> > >>> > >>> >>> >>> >>> >>> >> >> > > >
