Main Content

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

| |

Related Topics