When you solve a model, the software may report that a solution cannot be obtained
because the left-hand-side matrix is structurally or numerically singular.

These problems can be tricky to analyse and fix. Unfortunately we do not know of a
fool-proof, general-purpose method for tracking down and eliminating these problems.
However there are several things you can do (as described below).

A description of the difference between these two types of singularity can be found
here. That section also suggests some options you
can use to gain more information about these problems. Other things to try are suggested
below.

Structurally Singular Case

Most models come with one or more standard closures. Most closures are obtained from
these by making one or more swaps (swapping one variable from the exogenous list with
another from the endogenous list).

Structural singularity is nearly always a closure problem. A good strategy is to start
from the nearest standard (or working) closure and attempt to move towards the
troublesome closure making one swap at a time. The first time you get a singular matrix,
examine carefully the last swap to try to identify the problem.

Numerically Singular Case

Numerically singular matrices can be the result of a problem with the closure or a
problem with the data.

The comments above under "Structurally Singular Case" may be relevant if your problem
is related to the closure. The comments below may be relevant if your problem is related
to the data or to the closure.

If your matrix is numerically singular, you may gain more information by switching to
the alternative sparse-linear-solving routines.
If you are using MA48, try using MA28 by putting the statement "m28 = yes ;" in your
Command file.
If you are using MA28, try using MA48 by putting the statement "m28 = no ;" in your
Command file.
However, if the model is singular with one of these but not with the other, you should be
highly skeptical about the validity of the results.

If you have different data sets for the same model (for example, different
aggregations of the data), it may help to try the same closure with a different
aggregation.

Numerical singularity (as distinct from structural singularity) can sometimes be
overcome by changing one or more data items from zero to a (small) nonzero value. If the
model solves with slightly different data (or a different aggregation), zeros in the data
may be the cause of your numerical singularity.