%%----- do numerical check using (central) finite differences -----
if 1
nx = length(x);
step = 1e-5;
num_d2f = sparse(nx, nx);
num_d2G = sparse(nx, nx);
num_d2H = sparse(nx, nx);
for i = 1:nx
xp = x;
xm = x;
xp(i) = x(i) + step/2;
xm(i) = x(i) - step/2;
% evaluate cost & gradients
[fp, dfp] = opf_costfcn(xp, om);
[fm, dfm] = opf_costfcn(xm, om);
% evaluate constraints & gradients
[Hp, Gp, dHp, dGp] = opf_consfcn(xp, om, Ybus, Yf, Yt, mpopt, il);
[Hm, Gm, dHm, dGm] = opf_consfcn(xm, om, Ybus, Yf, Yt, mpopt, il);
num_d2f(:, i) = cost_mult * (dfp - dfm) / step;
num_d2G(:, i) = (dGp - dGm) * lambda.eqnonlin / step;
num_d2H(:, i) = (dHp - dHm) * lambda.ineqnonlin / step;
end
d2f_err = full(max(max(abs(d2f - num_d2f))));
d2G_err = full(max(max(abs(d2G - num_d2G))));
d2H_err = full(max(max(abs(d2H - num_d2H))));
if d2f_err > 1e-6
fprintf('Max difference in d2f: %g\n', d2f_err);
end
if d2G_err > 1e-5
fprintf('Max difference in d2G: %g\n', d2G_err);
end
if d2H_err > 1e-6
fprintf('Max difference in d2H: %g\n', d2H_err);
end
end