Regularity of parametric matrices

We consider a matrix whose coefficients are functions of a set of
variables. The procedure `RegularMatrix` allows one to determine
if the set of matrices includes only regular matrices. Its syntax is

RegularMatrix(mat,vars,init,cond,typedet)where

`mat`: the matrix definition (here called A)`vars`: the set of variables`init`: a list of ranges, one for each variable`cond`: an integer that indicates if matrix conditioning is used. It is 0 if no conditioning is used, 1 if the conditioning KA is used, 2 if AK is used and 3 if both conditioning are used. The matrix K used here is Inverse(A(Mid(vars))).`typedet`: a list of 3 integers. This integer indicates which determinant calculation procedure is used. A value lower than 2 indicates the use of`Fast_Determinant`, a value of 2 the use of`Medium_Determinant`and a value of 3`Slow_Determinant`. A value of -1 indicates that the user has provided its own procedure to compute the determinant: the procedure name is``ALIAS/user_determinant_matrix``and is written in the file``ALIAS/user_determinant_matrix``.C. It is also possible to use specific procedures for computing the determinant of the left and right conditioned matrices by using the procedure``ALIAS/user_determinant_cond_left``and``ALIAS/user_determinant_cond_right``.

Note that the procedure generates the C++ code for calculating
the elements of the matrix by using the procedure `MakeF`. If
these elements
includes several times the same complex expressions it is advised
to use the mechanism described in `MakeF` (section 2.1.1) to
interval evaluate
these expressions only once.

Note also that the used bisection method is to bisect the unknown range having the largest width. Scaling the unknown is therefore important

Note a special case that may occur if the matrix may include interval coefficients apart of the parameters or if the matrix is badly numerically conditioned. In that case it may happen that for a specific value of the parameters the sign of the determinant of the matrix cannot be ascertained (such point will be called unsafe). Hence at this point we cannot state the regularity of the matrix. But it may happen that at 2 other points the determinants will have opposite sign indicating the presence of a singularity. So the following cases may occur:

- at point P1 the determinant has not a constant sign while at points P2, P3 the signs are opposite
- at a set of points the determinant has not a constant sign while at all other points the determinant have a constant sign

The procedure may behave in 2 different ways:

- stop as soon as an unsafe point has been found
- continue if an unsafe point is detected until either a case 1 is detected or until only unsafe points remains

The procedure behavior is controlled through the flag
``ALIAS/unsafe_det``.
If this flag is set to 1 behavior 1 will
be used while behavior 2 is obtained by setting the flag to 0.
The default value of this flag is 0.
For behavior 1 the return code of the procedure is -3 if an
unsafe point is found.

The procedure reorders the boxes every `ALIAS/rand` iteration (default value=0 i.e. at each iteration). The ordering may be controlled through the `ALIAS/order` variable. Assume that the interval evaluation for a box is [a,b]. At some point the procedure will have find a box with a constant sign s for the determinant:

- if the order is 0 the box are sorted by decreasing order of b+a is s or -(b+a) if s
- otherwise the box are sorted by decreasing order of b/(b-a) if s or -a/(b-a) if s

The conditioning may play an important role especially as the
conditioned matrix is calculated symbolically. Assume for example
that the first row of A is `[x x]` and that AK is used. If the
first column of K is `[a1 a2]`, then the first element of the
conditioned matrix is `a1x+a2x`, that the procedure will arrange
as `x(a1+a2)`, thereby leading to an optimal form in term of
interval evaluation, which is better than the numerical
conditioning.

The procedure accepts an optional sixth argument which is a
string such as `SIMP` that defines a *matrix
simplification procedure*. The syntax of such procedure is

SIMP(int dimA,INTERVAL_MATRIX & A)where

A parallel version of this procedure is `ParallelRegularMatrix`.