Tuning¶
Basics of tuning¶
There are only two tuning parameters for the default
optimization algorithm used by
:
the number of internal and external iterations. We find that in
many cases the tuning procedure is easy and intuitive. For problems
without state constraints, only the number of internal iterations is
of importance. These parameters are specified online.
At the moment, the selection of these parameters is made entirely by the user.
In many embedded systems, the number of iterations may be limited by the
processor computational power. More generally, the user may need to compare
the MPC controller performance given by the solution
of an exact solver (like CVXOPT) against that given by the solution of
for
a given number of iterations. For example, the comparison could be made
using the stage cost at each point of a given trajectory
(see [ZKF13]). In the end, the precise number of iterations strongly depends on
the application.
The penalty parameter¶
An optional third tuning value is the penalty parameter ,
which is selected off-line (i.e. specified in the data file).
will by default automatically compute a good value for
if none is specified (recommended).
Roughly speaking, a large penalty parameter implies that
a low number of external iterations are required to reach good performance,
especially when state constraints are active. However, more internal iterations
are necessary, because the condition number of the internal problem increases.
The opposite is also true, a small
makes the internal problem
easier to solve, especially if no state constraints are active. When
the state constraint are active, however, the required number of external
iterations is higher.
By now it should be clear that the selection of an appropriate value of
(not too low, not too high) is crucial.
Although in general not recommended, allows
experienced users to explicitely set a value for
in the data file.
The selection of the penalty parameter
is easily done via
the function
find_penalty_parameters
in the ldt
module.
For example, using the the problem and data files
from the tutorial:
from muaompc import ldt
res = ldt.find_penalty_parameters('myprb.prb', 'mydat.dat')
res
is a dictionary that contains the keys params
and condnums
.
In this case, each of them is a list
consisting of a single element. For params
, it is the value of
used by default, and for
condnums
is the condition number for the algorithm
corresponding to that parameter. Thus, to get default value of type:
mu = res['params'][0]
The default value of the penalty parameter is one that is not too high
but not too low. By using the parameter factors
,
several values of multiples of the default can be tried at once:
res = ldt.find_penalty_parameters('myprb.prb', 'mydat.dat', factors=[1, 4])
Now, res
will contain the two penalty parameters with their corresponding
condition number.
For example, by typing:
mu = res['params'][0]
mu4 = res['params'][1]
cn4 = res['condnums'][1]
we get in mu
the default value for (i.e.
),
and
mu4
has the value , corresponding to the second factor
in the list given as input via
factors
.
This may help to check that the parameter mu4
does not make the
value of cn4
too high (i.e. the internal
problem is ill-conditioned).
Once you have found a new value of mu
that better suit your needs,
you need to include that information in your data file.
For example, if the new value of the penalty parameter is 123
,
modify the mydat.dat
data file by adding the line:
mu = 123
Save the data file, and generate the data again as explained in the Section Code generation at a glance .