I think you are doing something wrong. The most recent version of quadprog
has this argument set:
quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
If you're using the most recent version of Matlab, then your function call has $e$, $ub$, and $lb$ being stuffed into the $Aeq$, $beq$, and $lb$ parameters, respectively. I don't think that's what you want, as (for example) $beq$ is supposed to be the right-hand side of an equality constraint, while $ub$ is your upper bound.
You're getting the warning message because you didn't specify a particular algorithm for the quadprog
function to use, and so quadprog
is trying the default algorithm, which is the trust-region-reflective algorithm. That algorithm apparently doesn't work on your problem. This is probably because of the parameter passing issue I mentioned above, as the trust-region-reflective algorithm works when the problem has "only bounds, or only linear equality constraints (but not both)." (For more information, see "Choosing a solver" in the Matlab documentation.)
Since the trust-region-reflective algorithm doesn't work, quadprog
is trying the next algorithm in line, which is apparently the active-set algorithm. Then it's telling you that you might get better results with the interior-point-convex algorithm.
So, which algorithm should you use?
Matlab's general recommendations for the algorithm for the quadprog
function are
- If you have a convex problem, or if you don't know whether your problem is convex, use interior-point-convex.
- If you have only bounds, or only linear equalities, use trust-region-reflective.
- If you have a nonconvex problem that does not satisfy the restrictions of trust-region-reflective, use active-set.
Since you're passing quadprog
a covariance matrix (which must be positive semidefinite) your problem is convex. So it sounds like the interior-point-convex method is the way to go.
For more information, see "Using Quadratic Programming on Portfolio Optimization Problems" in the Matlab documentation.