[R] solve computationally singular

Simon Wood s.wood at bath.ac.uk
Thu Nov 9 16:49:59 CET 2006

On Tuesday 07 November 2006 19:46, xchen wrote:
> Hi uRsers,
> when inverting a 2 by 2 matrix using solve, I encountered a error message:
> solve.default(sigma, tol = 1e-07) :
>         system is computationally singular: reciprocal condition number
> = 1.7671e-017
> and then I test the determinant of this matrix: 6.341393e-06.
> In my program, I have a condition block that whether a matrix is
> invertible like this:
> if(det(sigma)<1e-7) return NULL;

- the determinant isn' t the best way of testing for computational 

For example, in the following `a' is computationally singular (it has a 
condition number of 1e18, but it has a determinant of 1e-6) 

a<- diag(c(1e6,1e-12)) 
> a
      [,1]  [,2]
[1,] 1e+06 0e+00
[2,] 0e+00 1e-12
> det(a)
[1] 1e-06
> solve(a)
Error in solve.default(a) : system is computationally singular: reciprocal 
condition number = 1e-18

If you are really only interested in small matrices, then calculation of the 
condition number as the ratio of largest to smallest singular values is the 
most reliable thing to do (or you could just trap the `solve' errors). See 
e.g. Golub and van Loan "Matrix Computations" for efficient condition number 
estimators, for larger matrices. 


> but this seems doesnot work to prevent the singularity when inverting a
> matrix. I am some confused about the relationship between "reciprocal
> condition number" and determinant. Can anybody give me some idea how to
> prevent this situation?
> Thanks a lot!
> Xiaohui
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html and provide commented, minimal,
> self-contained, reproducible code.

> Simon Wood, Mathematical Sciences, University of Bath, Bath, BA2 7AY UK
> +44 1225 386603  www.maths.bath.ac.uk/~sw283

More information about the R-help mailing list