0001 function [f, df, d2f] = opf_costfcn(x, om, varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057 [GEN_BUS, PG, QG, QMAX, QMIN, VG, MBASE, GEN_STATUS, PMAX, PMIN, ...
0058 MU_PMAX, MU_PMIN, MU_QMAX, MU_QMIN, PC1, PC2, QC1MIN, QC1MAX, ...
0059 QC2MIN, QC2MAX, RAMP_AGC, RAMP_10, RAMP_30, RAMP_Q, APF] = idx_gen;
0060 [F_BUS, T_BUS, BR_R, BR_X, BR_B, RATE_A, RATE_B, RATE_C, ...
0061 TAP, SHIFT, BR_STATUS, PF, QF, PT, QT, MU_SF, MU_ST, ...
0062 ANGMIN, ANGMAX, MU_ANGMIN, MU_ANGMAX] = idx_brch;
0063 [PW_LINEAR, POLYNOMIAL, MODEL, STARTUP, SHUTDOWN, NCOST, COST] = idx_cost;
0064
0065
0066 mpc = get_mpc(om);
0067 [baseMVA, gen, gencost] = deal(mpc.baseMVA, mpc.gen, mpc.gencost);
0068 cp = get_cost_params(om);
0069 [N, Cw, H, dd, rh, kk, mm] = deal(cp.N, cp.Cw, cp.H, cp.dd, ...
0070 cp.rh, cp.kk, cp.mm);
0071 vv = get_idx(om);
0072
0073
0074 ng = size(gen, 1);
0075 ny = getN(om, 'var', 'y');
0076 nxyz = length(x);
0077
0078
0079 Pg = x(vv.i1.Pg:vv.iN.Pg);
0080 Qg = x(vv.i1.Qg:vv.iN.Qg);
0081
0082
0083
0084
0085
0086 ipol = find(gencost(:, MODEL) == POLYNOMIAL);
0087 xx = [ Pg; Qg ] * baseMVA;
0088 if ~isempty(ipol)
0089 f = sum( totcost(gencost(ipol, :), xx(ipol)) );
0090 else
0091 f = 0;
0092 end
0093
0094
0095 if ny > 0
0096 ccost = full(sparse(ones(1,ny), vv.i1.y:vv.iN.y, ones(1,ny), 1, nxyz));
0097 f = f + ccost * x;
0098 else
0099 ccost = zeros(1, nxyz);
0100 end
0101
0102
0103 if ~isempty(N)
0104 nw = size(N, 1);
0105 r = N * x - rh;
0106 iLT = find(r < -kk);
0107 iEQ = find(r == 0 & kk == 0);
0108 iGT = find(r > kk);
0109 iND = [iLT; iEQ; iGT];
0110 iL = find(dd == 1);
0111 iQ = find(dd == 2);
0112 LL = sparse(iL, iL, 1, nw, nw);
0113 QQ = sparse(iQ, iQ, 1, nw, nw);
0114 kbar = sparse(iND, iND, [ ones(length(iLT), 1);
0115 zeros(length(iEQ), 1);
0116 -ones(length(iGT), 1)], nw, nw) * kk;
0117 rr = r + kbar;
0118 M = sparse(iND, iND, mm(iND), nw, nw);
0119 diagrr = sparse(1:nw, 1:nw, rr, nw, nw);
0120
0121
0122 w = M * (LL + QQ * diagrr) * rr;
0123
0124 f = f + (w' * H * w) / 2 + Cw' * w;
0125 end
0126
0127
0128 if nargout > 1
0129
0130 iPg = vv.i1.Pg:vv.iN.Pg;
0131 iQg = vv.i1.Qg:vv.iN.Qg;
0132
0133
0134 df_dPgQg = zeros(2*ng, 1);
0135 df_dPgQg(ipol) = baseMVA * polycost(gencost(ipol, :), xx(ipol), 1);
0136 df = zeros(nxyz, 1);
0137 df(iPg) = df_dPgQg(1:ng);
0138 df(iQg) = df_dPgQg((1:ng) + ng);
0139
0140
0141 df = df + ccost';
0142
0143
0144
0145 if ~isempty(N)
0146 HwC = H * w + Cw;
0147 AA = N' * M * (LL + 2 * QQ * diagrr);
0148 df = df + AA * HwC;
0149
0150
0151 if 0
0152 ddff = zeros(size(df));
0153 step = 1e-7;
0154 tol = 1e-3;
0155 for k = 1:length(x)
0156 xx = x;
0157 xx(k) = xx(k) + step;
0158 ddff(k) = (opf_costfcn(xx, om) - f) / step;
0159 end
0160 if max(abs(ddff - df)) > tol
0161 idx = find(abs(ddff - df) == max(abs(ddff - df)));
0162 fprintf('\nMismatch in gradient\n');
0163 fprintf('idx df(num) df diff\n');
0164 fprintf('%4d%16g%16g%16g\n', [ 1:length(df); ddff'; df'; abs(ddff - df)' ]);
0165 fprintf('MAX\n');
0166 fprintf('%4d%16g%16g%16g\n', [ idx'; ddff(idx)'; df(idx)'; abs(ddff(idx) - df(idx))' ]);
0167 fprintf('\n');
0168 end
0169 end
0170 end
0171
0172
0173 if nargout > 2
0174 pcost = gencost(1:ng, :);
0175 if size(gencost, 1) > ng
0176 qcost = gencost(ng+1:2*ng, :);
0177 else
0178 qcost = [];
0179 end
0180
0181
0182 d2f_dPg2 = sparse(ng, 1);
0183 d2f_dQg2 = sparse(ng, 1);
0184 ipolp = find(pcost(:, MODEL) == POLYNOMIAL);
0185 d2f_dPg2(ipolp) = baseMVA^2 * polycost(pcost(ipolp, :), Pg(ipolp)*baseMVA, 2);
0186 if ~isempty(qcost)
0187 ipolq = find(qcost(:, MODEL) == POLYNOMIAL);
0188 d2f_dQg2(ipolq) = baseMVA^2 * polycost(qcost(ipolq, :), Qg(ipolq)*baseMVA, 2);
0189 end
0190 i = [iPg iQg]';
0191 d2f = sparse(i, i, [d2f_dPg2; d2f_dQg2], nxyz, nxyz);
0192
0193
0194 if ~isempty(N)
0195 d2f = d2f + AA * H * AA' + 2 * N' * M * QQ * sparse(1:nw, 1:nw, HwC, nw, nw) * N;
0196 end
0197 end
0198 end