[R] a numeric problem

Duncan Murdoch murdoch.duncan at gmail.com
Mon Mar 7 15:13:58 CET 2011


On 07/03/2011 8:46 AM, baicaidoufu wrote:
> ### An numeric problem in R  ########
>
> ###I have two matrix one is##########
>
> A<- matrix(c(21.97844, 250.1960, 2752.033, 29675.88, 316318.4, 3349550,
> 35336827,
>                24.89267, 261.4211, 2691.009, 27796.02, 288738.7, 3011839,
> 31498784,
>                21.80384, 232.3765, 2460.495, 25992.77, 274001.6, 2883756,
> 30318645,
>                39.85801, 392.2341, 3971.349, 40814.22, 423126.2, 4409388,
> 46090850,
>                25.55343, 235.5315, 2343.281, 23987.10, 248557.3, 2590821,
> 27089162,
>                16.63100, 195.4592, 2200.264, 24006.66, 257499.5, 2736200,
> 28922851,
>                23.20258, 262.6086, 2824.971, 29973.61, 316369.1, 3331009,
> 35025965
>                ),7,7,byrow=T)
>
> #### the other one is##################
> S<-matrix(c(356.57205,  32.55943, 120.28162,  95.74285,  45.013261,
> 271.557635, 183.9009,
>               32.55943, 299.68103,  81.95644, 246.95280,  96.023270,
> 19.383732, 153.4544,
>              120.28162,  81.95644, 277.09354,  85.42180, 138.751600,
> 138.972234, 140.0991,
>               95.74285, 246.95280,  85.42180, 527.78444, 182.417527,
> 24.946245, 129.1490,
>               45.01326,  96.02327, 138.75160, 182.41753, 328.414655,
> 1.035543,  63.2730,
>              271.55764,  19.38373, 138.97223,  24.94625,   1.035543,
> 322.635669, 158.5317,
>              183.90092, 153.45443, 140.09909, 129.14899,  63.273005,
> 158.531662, 256.1531
>              ),7,7,byrow=T)
>
> ####both of these two matrix are non-singular so their inverse should be
> exists######
> ####while
> KK<- t(A)%*%solve(S)%*%A
> det(KK) ###12553.48 which is not 0, but solve() function refuse to work now.

Look at the eigenvalues of KK:  they range from 10^(-7) to 10^12.  Its 
condition number (according to the rcond definition) is about 10^(-21).
If you could invert it, you would just be seeing noise from rounding error.

So the best advice I can give is:  don't do that.  But if you really 
don't care about the quality of your results, you could use solve(A) %*% 
S %*% t(solve(A)) to avoid the error messages.  If you multiply that by 
KK you'll get something that's a long way from an identity matrix.

Duncan Murdoch

> ##  So I try to use ginv() instead###
> ginv(KK)
>
> ### It is expected that
>
> A%*%ginv(t(A)%*%solve(S)%*%A)%*%t(A)
>
> ### should equal to solve(S)######
>
> solve(S)
>
> ### but it is not!!!
> ### So I am wondering in such situation, do you have any suggestion?
> ### I have tried the argument "tol = sqrt(.Machine$double.eps))" in ginv(),
> but it won't help in
> ### more larger determinant matrix.
>
> --
> View this message in context: http://r.789695.n4.nabble.com/a-numeric-problem-tp3338989p3338989.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help at r-project.org 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.



More information about the R-help mailing list