Matlab Solve Optimization
MathWorksOfficialCreated by MathWorks
- Skill
- Tool integration
- Science and research
- BSD-2-Clause
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured workflow for the entire optimization lifecycle in MATLAB. It covers problem classification, formulation using both problem-based and solver-based approaches, solver selection, configuration, and result validation. It emphasizes best practices for using tools like optimproblem, fcn2optimexpr, and various solvers, while providing guidance on debugging convergence issues and ensuring numerical correctness.
What it does
- Classifies optimization problems to select the appropriate solver and guarantee level.
- Guides the formulation of problems using the problem-based framework (optimvar, optimproblem).
- Provides templates for solver-based approaches when specific API control is required.
- Offers strategies for solver configuration, including tuning and parallelization.
- Details methods for validating results, checking convergence, and verifying constraint satisfaction.
- Provides debugging checklists for failed optimizations and performance optimization techniques.
When to use it
- When defining decision variables, objectives, and constraints for a mathematical model.
- When selecting or configuring solvers like fmincon, linprog, or ga.
- When interpreting solver exitflags or debugging convergence failures.
- When deciding between problem-based and solver-based modeling approaches.
- When writing optimization code that requires robust validation and performance tuning.
Advantages
- Promotes a standardized, repeatable workflow for optimization tasks.
- Reduces common errors by providing clear templates and validation steps.
- Helps identify the most efficient solver for specific problem structures.
- Provides clear guidance on when to use advanced features like automatic differentiation.
- Includes practical debugging strategies for common numerical and formulation issues.
Usage examples
- “How do I define a constrained optimization problem in MATLAB using the problem-based approach?”
- The agent provides a template using optimvar to define variables, optimproblem to set the objective, and adding constraints to prob.Constraints, followed by the solve command.
- “My fmincon optimization is not converging. How should I debug it?”
- The agent suggests checking the exitflag, verifying the objective and constraints at the initial guess, checking gradient accuracy, and reviewing the scaling of variables.
- “Should I use fmincon or patternsearch for my nonlinear problem?”
- The agent guides the user to check if gradients are available and reliable; if so, fmincon is preferred, otherwise patternsearch is recommended for derivative-free optimization.
- “How do I wrap a complex simulation function for use in an optimization problem?”
- The agent explains how to use fcn2optimexpr to wrap the function, noting whether to treat it as a black-box or allow automatic differentiation.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/matlab/matlab-solve-optimization/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip matlab-solve-optimization.zip -d .agents/skills
Documentation by MathWorks
MATLAB Optimization Workflow
Guide the full optimization lifecycle: classify the problem, formulate it, select and configure a solver, and validate the results.
When to Use
User is defining an optimization problem in MATLAB (variables, objectives, constraints)
User asks about
optimproblem,optimvar,optimconstr,optimexpr, orfcn2optimexprUser is selecting or configuring a solver (
optimoptions, algorithm choice, tuning)User is interpreting results, debugging convergence, or checking exitflags
User is deciding between problem-based and solver-based approaches
User is writing optimization code with for-loops over decision variables or constraints
When NOT to Use
User is asking to solve a problem that doesn't require numerical optimization solvers (e.g., finding the minimum value in an array or table)
User is working with non-optimization MATLAB code (data analysis, plotting, signal processing)
User is using a third-party optimization toolbox (not MathWorks)
User is solving symbolic equations with
solve(eqns, vars), ODE systems, or linear system solves (A\b)
Stage 1: Classify & Formulate
1.1 Classify the Problem
Before formulating, identify the problem class — it determines which solver to use, what guarantee you can promise (global vs local), and whether a domain-specific tool should replace the generic path.
See references/classify.md for the class→solver→guarantee table, convexity quick-checks, and "hidden easier class" heuristics. Key actions:
Check if a purpose-built domain tool exists before falling back to
optimproblemWatch for hidden easier classes (sum-of-squares disguised as NLP, linear structure missed)
For QPs, check
eig(H)— nonconvex QPs cannot usequadprogreliablyWatch for hidden nonsmoothness:
max,min,abs,sort,if/branching, or norms other than squared-2-norm
1.2 Choose Approach
Use problem-based by default for readable definitions, N-D modeling, and every LP, QP, conic, and mixed-integer problem (unless coefficients are already in matrix-vector form). Problem-based provides automatic differentiation and is less error-prone.
Even when AD is blocked (e.g., ode45 in the objective), fcn2optimexpr can still wrap the function as a black-box — problem-based remains useful.
Only fall back to solver-based when one of these applies:
| Use solver-based when... | Reason |
|---|---|
Trivial mapping to solver API — one vector x, pre-coded objective with exact gradients/Hessian | No benefit from abstraction; solver-based is direct |
| Overhead of building problem-based expressions dominates computation | Avoid tracing/transformation overhead |
Need a solver feature problem-based doesn't expose (CheckpointFile, exact Hessians, custom OutputFcn) | Only available via solver-based calls |
| C code generation for embedded deployment is required | Problem-based does not support codegen |
Converting between approaches: prob2struct(prob) converts problem-based to solver-based form for deployment or performance.
References:
Problem-based: references/problem-based-guide.md
Solver-based (class→solver mapping): references/classify.md
1.3 Formulate the Problem
Problem-based canonical template:
% 1. Define decision variables
x = optimvar("x", N, LowerBound=lb, UpperBound=ub);
% 2. Create problem
prob = optimproblem("Objective", sum(x,"all"));
% 3. Add constraints
prob.Constraints.linear = A*x <= b;
prob.Constraints.nonlinear = fcn2optimexpr(@myNonlinFcn, x) <= rhs;
% 4. Set initial guess (must be struct with field names matching optimvar names)
x0.x = initialValues;
% 5. Solve
[sol, fval, exitflag, output] = solve(prob, x0);Solver-based key differences:
Initial guess is a numeric vector, not a struct
You manage variable indexing manually (flat vector
x)Supply gradients manually for best performance (
SpecifyObjectiveGradient=true)Linear/quadratic solvers require explicit coefficient matrices
1.4 Validate at the Start Point
Before calling any solver, evaluate the objective and constraints at x0 to catch sign/size/NaN errors early:
% Problem-based
fval0 = evaluate(prob.Objective, x0);
assert(isfinite(fval0), 'Objective is not finite at x0');
infeas0 = infeasibility(prob.Constraints, x0);
fprintf('Max infeasibility at x0: %.3e\n', max(infeas0));For solver-based, call fun(x0) and nonlcon(x0) directly and confirm finite, correctly-sized outputs. If gradients are supplied, run checkGradients at this point.
Stage 2: Select & Configure Solver
2.1 Select the Narrowest Solver
Choose the narrowest solver that matches the problem structure. Do not default to fmincon or heuristic global solvers when a more specific solver applies.
Key selection rules:
Always prefer:
linprog>quadprog>coneprog>lsqlin>lsqnonlin>fmincon> global solversAlways prefer
fminuncoverfminsearchwhen Optimization Toolbox is installedAlways prefer
lsqnonlin/lsqcurvefitoverfminconfor least-squares problemsAlways prefer
lsqlinoverlsqnonlinfor linear least-squares with bounds or linear constraintsUse
patternsearchwhen gradients are unavailable/unreliable AND the problem is not extremely expensiveUse
surrogateoptwhen each evaluation takes >15-20 secondsFor nearly linear MIPs, linearize and use
intlinprograther than calling Global Optimization solversFor unit commitment / binary operating modes, keep mixed-integer with
intlinprog
See references/classify.md for the full class→solver table.
2.2 Verify Options — Never Guess
ALWAYS verify that solver options are valid before using them. Options change across MATLAB releases and hallucinated options cause runtime errors.
% Verify options for a solver
opts = optimoptions('solvername')Run optimoptions('solvername') to see all valid options for the user's installed version before writing options code.
2.3 Verify Gradients (if supplied)
If analytic gradients are supplied (SpecifyObjectiveGradient=true), verify them before solving:
[valid, err] = checkGradients(@myObjective, x0, Display="on");For constraint gradients: checkGradients(@myConstraints, x0, IsConstraint=true).
2.4 Parallelize (if expensive)
If the solver supports UseParallel and Parallel Computing Toolbox is available:
ver('parallel') % Check for PCT
options = optimoptions('solvername', UseParallel=true);Solvers supporting UseParallel: fmincon, fminunc, lsqnonlin, lsqcurvefit, patternsearch, surrogateopt, ga, particleswarm, paretosearch, gamultiobj.
Do NOT suggest UseParallel for: quadprog, intlinprog, fminsearch, linprog, lsqlin.
2.5 Performance (after correctness)
If the solve is correct but too slow, see references/performance-levers.md. Key levers: analytic gradients, sparsity patterns, warm starting, code generation. Apply only after Stage 3 confirms correctness — re-validate after any performance change.
Reference: references/solver-tuning.md for per-solver algorithm and tuning guidance.
Stage 3: Validate Results
3.1 Basic Validation (Always Include)
Every time solver-calling code is written, add basic output validation:
[sol, fval, exitflag, output] = solve(prob, x0);
% Check convergence
if exitflag > 0
fprintf('Optimization converged: %s\n', output.message);
else
warning('Optimization did not converge (exitflag = %d): %s\n', exitflag, output.message);
end
% Report key metrics
fprintf('Objective value: %.6f\n', fval);
fprintf('Iterations: %d\n', output.iterations);
if isfield(output, 'constrviolation')
fprintf('Constraint violation: %d\n', output.constrviolation);
endSee references/validation-checklist.md for detailed exitflag meanings per solver.
3.2 Extended Validation
Constraint violations (problem-based):
[allsat, sat] = issatisfied(prob, sol);
if ~allsat
conNames = fieldnames(prob.Constraints);
for i = 1:numel(conNames)
infeas = infeasibility(prob.Constraints.(conNames{i}), sol);
if any(infeas > 0)
fprintf('Constraint "%s" violated by %.3e\n', conNames{i}, max(infeas));
end
end
endOptimality conditions (gradient-based solvers only — skip for patternsearch, ga, particleswarm, surrogateopt):
if isfield(output, 'firstorderopt')
fprintf('First-order optimality: %.6e\n', output.firstorderopt);
if output.firstorderopt > 1e-3
warning('First-order optimality measure is large — solution may not be optimal.\n');
end
end3.3 Debugging Failed or Poor Solutions
When exitflag <= 0 or convergence is poor, follow the improving-results checklist in references/improving-results.md:
Check formulation — constraints feasible? bounds consistent? objective well-defined at x0?
Check scaling — scale variables to O(1); rescale if objective/constraints differ by orders of magnitude; use
FiniteDifferenceType='central'if finite-difference gradients are inaccurateTry different algorithms —
options.Algorithm, increaseMaxIterations/MaxFunctionEvaluations, adjust tolerances, setHybridFcnfor heuristic solversTry different initial points —
MultiStart,GlobalSearch, orsurrogateopt/gafor global optimization
Debug discipline:
Smallest-first. Shrink to 2-3 variables. A bug in a toy problem is minutes; at full scale is hours.
One change at a time, justified by a symptom.
Stop-and-ask budget. Stop coding and talk to the user when: >3 rounds with no improvement, >2 option tweaks that don't move diagnostics, or you can't get a finite objective at x0 even on a toy problem.
3.4 Application-Specific Visualization
| Problem Domain | Suggested Plots |
|---|---|
| Optimal control / navigation | State trajectories vs time, control input profiles, phase portraits |
| Scheduling / assignment | Gantt charts, resource utilization over time |
| Design optimization | Contour plots with optimum marked, sensitivity plots |
| Parameter estimation / fitting | Residual plots, fitted surface vs data |
| Portfolio / allocation | Bar charts of allocations, efficient frontier plots |
Gotchas
Formulation
Initial guess must be a struct with field names matching
optimvarnames exactly. NOT a flat vector.Do NOT set
SpecifyObjectiveGradientorSpecifyConstraintGradientin options for problem-based — AD manages gradients internally.Use N-D
optimvarfor multi-dimensional problems. Do NOT create scalar variables in a loop.Preallocate constraint arrays with
optimconstr(N). Do NOT concatenate in a loop.Call
fcn2optimexprONCE per function, not inside loops. See references/fcn2optimexpr-guide.md.Use
"like"for preallocation inside traced functions to preserve AD type:zeros(n,1,"like",x).
Solver Configuration
Never guess option names from memory. Always verify with
optimoptions('solvername').Do NOT tighten
MeshToleranceforpatternsearchtoo much.Do NOT set
AbsoluteGapTolerance/RelativeGapTolerancehigh forintlinprogfor early stopping — use time/node limits.Keep tolerances well above machine epsilon. Use
1e-6to1e-8range unless specifically required.
Validation
output.constrviolationdoes not exist for unconstrained solvers. Always check withisfield.Do NOT check
output.firstorderoptfor derivative-free solvers. Check solver-specific metrics instead (output.meshsize,output.stallgenerations).infeasibility()operates on individual constraints, not entire problems. Useissatisfied(prob, sol)for overall checks.For
fminconwithexitflag <= 0, checkoutput.bestfeasible. Use it as a starting point for a new solve.
Conventions
Default to problem-based unless a specific blocker applies.
When vectorization is possible, always prefer it over loops.
When wrapping complex logic in
fcn2optimexpr, encapsulate in a single helper function rather than calling inside a loop.Always show the initial guess setup.
Mark code blocks as templates when they depend on user-supplied functions.
When suggesting tuning options, explain the trade-off (speed vs accuracy).
Do not over-tune: for simple or small problems, defaults are usually sufficient.
Always include basic validation (exitflag check) when writing solver-calling code.
When debugging, start with formulation and scaling before changing algorithms.
Copyright 2026 The MathWorks, Inc.
Files
- ATTRIBUTION.mdAdded by AutoGineer1.0 KiB
- LICENSELicence file added by AutoGineer1.4 KiB
- SKILL.md13.4 KiB
- manifest.yaml515 B
- references/classify.md3.8 KiB
- references/fcn2optimexpr-guide.md5.0 KiB
- references/improving-results.md13.5 KiB
- references/performance-levers.md4.1 KiB
- references/problem-based-guide.md5.1 KiB
- references/solver-tuning.md9.7 KiB
- references/validation-checklist.md6.5 KiB
references/performance-levers.md
Performance Levers
Correctness first, always. Apply nothing here until the answer is right and verified. After any change, re-run validation — the answer must not change. A faster path to a different answer is a bug, not a speedup.
When to reach for this file (triggers)
The solve is slow or
funcCountis very largeThe same problem is solved repeatedly (a sweep, an online loop)
The problem is large (many variables/constraints, sparse structure)
It must be deployed — embedded, real-time, or run where MATLAB isn't installed
Lever 1 — Analytic gradients / Jacobian
Gradient-based solvers estimate derivatives by finite differences by default, costing many extra objective evaluations and adding noise. Supplying analytic gradients is usually the biggest single win.
options = optimoptions('fmincon', ...
SpecifyObjectiveGradient=true, ...
SpecifyConstraintGradient=true);For least-squares, return the Jacobian from the residual function.
Always verify with checkGradients — a wrong gradient causes silent stalls, which is worse than slow. Trade-off: more code to write and maintain.
Lever 2 — Sparsity
For large problems with known structure, store matrices as sparse and supply sparsity patterns so the solver skips known-zero entries:
options = optimoptions('fmincon', ...
HessPattern=hess_pattern, ... % for Hessian structure
HessianMultiplyFcn=@hessmult); % for Hessian vector productoptions = optimoptions('lsqnonlin', ...
JacobPattern=jacob_pattern, ... % for Jacobian
JacobianMultiplyFcn=@jacobmult); % for Jacobian vector productBig speed/memory win when the structure is genuinely sparse; no benefit (slight overhead) when dense.
Lever 3 — Warm starting / problem reuse
In an online loop or a sweep of similar problems, seed x0 from the previous solution:
x0 = x_prev_solution; % converges faster from a nearby start
[x, fval] = fmincon(fun, x0, ...);
x_prev_solution = x; % save for next iterationSome LP/QP workflows support explicit warm starts. Helpful only when consecutive problems are genuinely similar.
Lever 4 — Code generation (deployment / real-time)
Use MATLAB Coder to generate C/C++ for embedded or MATLAB-free deployment. Key caveats:
Problem-based
solvedoes not support codegen. Convert to solver-based first withprob2struct.The default algorithm usually does NOT support codegen. You must set a codegen-capable algorithm explicitly. Don't hardcode which one — it's release-specific. Consult "Code Generation in Optimization Toolbox" in the docs and confirm in the session.
Codegen needs fixed-size inputs and has other restrictions.
Always validate generated code against MATLAB:
max(abs(x_codegen - x_matlab))should be ≈1e-10; a gap of ~1e-5+ means a real discrepancy.Bounded effort: if codegen restrictions eat hours, confirm it's genuinely needed for embedded deployment. Fall back to the MATLAB solver for exploratory work.
Trade-off: real engineering effort — worth it for deployment, overkill for one-off analysis.
Lever 5 — Integer programs (MILP) that are too slow
Integer solve time is dominated by the formulation, not solver options. Tighten it:
Smaller big-M constants — oversized M values weaken LP relaxations and explode the tree
Tighter variable bounds — every tighter bound prunes branches
Valid inequalities — extra constraints that don't cut feasible integer points but tighten the relaxation
Warm-start from a known feasible solution where supported
Set a relative-gap or time limit and accept the best incumbent when a proven optimum isn't worth the wait — report the gap honestly.
Note: Parallel evaluation (UseParallel) is already covered in solver-tuning.md. Expensive black-box handling (surrogateopt, bayesopt) and global-search methods (MultiStart, GlobalSearch) are also covered there. This file addresses levers that are NOT already in the solver tuning reference.
Copyright 2026 The MathWorks, Inc.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- MathWorks
- Publisher
- MathWorks (Official)
- Source
- matlab/matlab-agentic-toolkit · skills-catalog/math-and-optimization/matlab-solve-optimization · commit 2a7f215
- Licence
- BSD 2-Clause License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE.md)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by MathWorks.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download matlab-solve-optimization.zip