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