## Choose a Fixed-Step Solver

This example shows an algorithmic method of selecting an appropriate
fixed-step solver for your model. For simulation workflows in Simulink^{®}, the default setting for the **Solver** parameter
in the Model Configuration Parameters is `auto`

. The heuristics used by
Simulink to select a variable-step solver is shown in the figure below.

### When to Use a Fixed-Step Solver

One common case to use a fixed-step solver is for workflows where you plan to generate code from your model and run the code on a real-time system.

With a variable-step solver, the step size can vary from step to step, depending on the model dynamics. In particular, a variable-step solver increases or reduces the step size to meet the error tolerances that you specify and as such, the variable step sizes cannot be mapped to the real-time clock of a target system.

Any of the fixed-step continuous solvers in the Simulink product can simulate a model to any desired level of accuracy, given a small enough step size. Unfortunately, it is not possible or practical to decide without trial, the combination of solver and step size that will yield acceptable results for the continuous states in the shortest time. Determining the best solver for a particular model generally requires experimentation.

The example model represents the flight control algorithm for the longitudinal flight of an aircraft.

### Establish Baseline Results Using a Variable-Step Solver

Before you begin simulation, determine acceptable error tolerances for your
variable-step solver. The model is currently set up with the default values of absolute and
relative tolerances of `1e-6`

and `1e-4`

respectively.

If these values are acceptable, continue with the example. Otherwise, you can change them to your specification using the Model Configuration Parameters.

Select a variable-step solver from the list of solvers in the **Solver** dropdown in the **Solver** pane of the
Model Configuration Parameters to simulate the model. The default setting in Simulink for
the **Solver** parameter is
`VariableStepAuto`

. Simulink selects a solver and the maximum step size
of the simulation based on the contents and dynamics of the model.

Simulate the model using the `auto`

solver, or pick another solver.
Additionally, enable the **Save states**, **Save time,** and **Save outputs**
parameters in the **Data Import/Export** pane of the Model
Configuration Parameters. Set the logging format for your model to
`Dataset`

to allow the Simulation Data Inspector to log the
signals.

The simulation results from this run will be designated the baseline results for this task. The model contains 13 signals, but this example focuses on only a few signals plotted below.

Profile the model using the **Solver Profiler** to find an
appropriate step size for the candidate fixed-step simulations of the model. See Solver Profiler for information on
how to launch and use the tool. For command-line usage, see `solverprofiler.profileModel`

.

Note the maximum and average step sizes returned by the **Solver
Profiler.**

solver: 'ode45' tStart: 0 tStop: 60 absTol: 1.0000e-06 relTol: 1.0000e-04 hMax: 0.1000 hAverage: 0.0447 steps: 1342 profileTime: 0.0665 zcNumber: 0 resetNumber: 600 jacobianNumber: 0 exceptionNumber: 193

### Run Fixed-Step Simulations of the Model

Once you obtain the results of the variable-step simulation of the model, simulate it
using one or more of the fixed-step solvers. In this example, the model is simulated using
all the non-stiff fixed-step solvers: `ode1`

, `ode2`

,
`ode3`

, `ode4`

, `ode5`

, and
`ode8`

. You can also select a specific solver from the **Solver** dropdown in the Model Configuration Parameters to run
against the variable-step baseline.

**Considerations for Selecting a Fixed Step Size**

The optimal step size for a fixed-step simulation of your model strikes a balance between speed and accuracy, given constraints such as code-generation objectives, physics or dynamics of the model, and modeling patterns used. For example, code generation would dictate the step size must be greater than or equal to the clock speed of the processor (the reciprocal of the CPU frequency). For pure simulation objectives, the step size must be less than the discrete sample times specified by individual blocks in the model. For models with periodic signals, the step size must be such that the signal is sampled at twice its highest frequency; this is known as the Nyquist frequency.

For this specific example, set the fixed-step size of the solver to 0.1 (the maximum
step size detected by the **Solver Profiler**). This takes
into account the discrete sample time 0.1 of the Dryden Wind-Gust block, as well as the
periodic nature of the stick movements and the aircraft response.

Make sure that the model states, outputs, and simulation time are enabled for logging
and that the logging format is set to `Dataset`

in the Model Configuration
Parameters.

Simulate the model by selecting any one or all the non-stiff fixed-step solvers from the
**Solver** dropdown of the Model Configuration Parameters
when the solver **Type** is set to
`Fixed-step`

.

A `Simulink.sdi.Run`

object is created for the fixed-step solver
simulation(s) and stored in the `fsRuns`

struct in the base
workspace.

### Compare Fixed-Step Simulations with the Variable-Step Baseline

Use the **Simulation Data Inspector** to visualize and
inspect logged signals in your model. You can also compare signals across simulations, or
runs, using the **Compare** feature. For more information on
using the **Simulation Data Inspector**, see Simulation Data Inspector. For more
information on how to compare simulations using the Simulation Data Inspector, see Compare Simulation Data.

To compare signals, switch to the **Compare** tab in the
**Simulation Data Inspector**. Set the **Baseline** run to the variable-step simulation and select a
fixed-step simulation from the **Compare to** dropdown. Set
the **Global Abs Tolerance**, **Global Rel
Tolerance**, and **Global Time Tolerance** based
on your requirements.

For this example, **Global Abs Tolerance** is set to
`0.065`

, **Global Rel Tolerance** is set
to 0.005, and **Global Time Tolerance** is set to
`0.1`

.

The comparison plots display the results for the lowest order fixed-step solver simulation where all signals fell within tolerance, when compared to the baseline variable-step simulation. For the selected solver, comparison results of a few of the signals are plotted below.

The lowest order with all signals within tolerance is determined to be
`ode4`

. Consider the results for the ode1 fixed-step solver, where the
comparison results showed 11 signals out of tolerance. Observe that there are 11 signals
out of tolerance when the signal comparison parameters are set as:

**Signal Abs Tolerance**: 0.065**Signal Rel Tolerance**: 0.065**Signal Time Tolerance**: 0.1