0
votes

I trying to minimize function handle with respect to vector of parameters beta0. My function uses built-in mvncdf function which uses positive definite covariance matrix. This matrix is counted from part of vector of parameters. Also there is constraint for absolute value of some parameters to be less than one.

I set constraints to fmincon in two ways: upper and lower bounds to required values and use following nonlinear constraint:

function [c,ceq] = pos_def(beta0)

rho_12 = beta0(end-2,1);
rho_13 = beta0(end-1,1);
rho_23 = beta0(end,1);

sigma111=[1 rho_12 rho_13; rho_12 1 rho_23; rho_13 rho_23 1];
sigma110=[1 rho_12 -rho_13; rho_12 1 -rho_23; -rho_13 -rho_23 1];
sigma101=[1 -rho_12 rho_13; -rho_12 1 -rho_23; rho_13 -rho_23 1];
sigma100=[1 -rho_12 -rho_13; -rho_12 1 rho_23; -rho_13 rho_23 1];

eig111 = eig(sigma111);
eig110 = eig(sigma110);
eig101 = eig(sigma101);
eig100 = eig(sigma100);

c = vertcat(-eig111,-eig110,-eig101,-eig100);

As all matrices are square and symmentric by constraction, as proxy to positive difiniteness I use signs of eigenvalues.

The optimization problem looks like:

 opts = optimset ('Display','iter','TolX',1e-15,'TolFun',1e-15,...
'Algorithm','interior-point','MaxIter',100000,'MaxFunEvals',1000000);
 xc3_3=fmincon(model, beta,[],[],[],[],lb,ub,@pos_def, opts)

But during estimation fmincon aborts with error

Error using mvncdf (line 193) SIGMA must be a square, symmetric, positive definite matrix.

Under debuging mode I can see that after two iterations of evaluation Matlab tries to estimate beta0 which does not sutisfy my nonlinear constraints,

beta0 =

  -46.9208
   33.2916
   -2.1797
  -46.4251
    3.8337
   -0.3066
    6.1213
  -20.9480
   -1.7760
   -0.1807
    1.3950
    4.5348
   -0.9838
    0.2600
   -6.9887
  -24.6157
   -0.0112
   -0.9923
   -0.9284
    0.7664
    0.3062    

And constraint c < 0 does not satisfied:

c =
    0.3646
   -1.2998
   -2.0648
    0.3646
   -1.2998
   -2.0648
    0.3646
   -1.2998
   -2.0648
    0.3646
   -1.2998
   -2.0648

I do not understand why this optimization tool trying to find solution in the prohibited area and how to avoid this problem. Or how to set constrains on positive definiteness in the linear way.

1

1 Answers

0
votes

The optimizer is just evaluating points to see if they are feasible directions to move in or not. Within your model you should tell it that a particular direction is not a good one. The pseudo-code would look something like

GetEigvalues
if (positive definite) then
   Do what you really want to happen
else
   Return a large number
end

or alternatively

try
   Do what you really want to happen
catch
   Return a large number
end