Tune Solution for Analysis
When using the problem-based approach, you can try different options and methods to tune the solver and produce results more quickly.
Try Differentiation Options
The solve
function typically uses the most effective
automatic differentiation method. However, your problem might run faster using a
different method, or no automatic differentiation at all.
To obtain faster solutions, try different automatic differentiation options for
solve
. Set the ObjectiveDerivative
name-value argument to a nondefault value. For
example:
[sol,fval] = solve(prob,x0,ObjectiveDerivative="auto-forward")
Try Evaluation Methods
When applicable, try evaluating an optimization expression directly, without using
fcn2optimexpr
. Then evaluate the expression with
fcn2optimexpr
and compare the results. Similarly, try using
fcn2optimexpr
with the Analysis
argument
set to "off"
in addition to using it with the default setting
"on"
. Although the default settings can be the most
efficient, a nondefault setting might work best for your problem.
Break Up Expressions for fcn2optimexpr
Sometimes solve
runs more effectively when you break
expressions into smaller pieces and call fcn2optimexpr
on each
piece separately. With this approach, fcn2optimexpr
interprets
the type of each expression as the most general type in the included expressions.
For example, if an expression contains both quadratic and exponential terms,
fcn2optimexpr
labels the expression as a general nonlinear
expression. If the expression is split into a quadratic-only expression and an
exponential expression, then fcn2optimexpr
can correctly label
the first expression as quadratic and the second as general nonlinear.
For example:
expr1 = sum(x.^2 + y.^2,"all"); expr2 = sum(x.*exp(x).*(x.^2 + y.^2),"all"); express1 = fcn2optimexpr(expr1,x,y); express2 = fcn2optimexpr(expr2,x); prob.Objective = express1; prob.Constraints.expconstr = express2 >= 1/10;
In this example, having separate expressions for the objective and constraint allows the solver to recognize that the objective is a pure sum of squares. In contrast, the following formulation does not allow the solver to recognize that the objective is a sum of squares.
expr1 = x.^2 + y.^2; [express1,express2] = ... fcn2optimexpr([sum(expr1,"all),sum(x.*exp(x).*expr1,"all)],x,y); prob.Objective = express1; prob.Constraints.expconstr = express2 >= 1/10;
See Also
fcn2optimexpr
| solve
| prob2struct