From rvaradhan at jhmi.edu  Sun Aug  2 22:25:27 2009
From: rvaradhan at jhmi.edu (Ravi Varadhan)
Date: Sun, 02 Aug 2009 16:25:27 -0400
Subject: [Rd] Inaccurate complex arithmetic of R (Matlab is accurate)
Message-ID: <f5139d6efa66.4a75bdf7@johnshopkins.edu>

Dear All,

Hans Borchers and I have been trying to compute "exact" derivatives in R using the idea of complex-step derivatives that Hans has proposed.  This is a really, really cool idea.  It gives "exact" derivatives with only a minimal effort (same as that involved in computing first-order forward-difference derivative).  

Unfortunately, we cannot implement this in R as the "complex arithmetic" in R appears to be inaccurate.

Here is an example:

#-- Classical Rosenbrock function in n variables
rosen <- function(x) {
n <- length(x)
x1 <- x[2:n]
x2 <- x[1:(n-1)]
sum(100*(x1-x2^2)^2 + (1-x2)^2)
}


x0 <- c(0.0094, 0.7146, 0.2179, 0.6883, 0.5757, 0.9549, 0.7136, 0.0849, 0.4147, 0.4540)
h <- c(1.e-15*1i, 0, 0, 0, 0, 0, 0, 0, 0, 0)
xh <- x0 + h

rx <- rosen(xh)
Re(rx)
Im (rx)

#  rx = 190.3079796814885 - 12.13915588266717e-15 i  # incorrect imaginary part in R

However, the imaginary part of the above answer is inaccurate.  The correct imaginary part (from Matlab) is:

190.3079796814886 - 4.66776376640000e-15 i  # correct imaginary part from Matlab

This inaccuracy is serious enough to affect the acuracy of the compex-step gradient drastically.

Hans and I were wondering if there is a way to obtain accurate "small" imaginary part for complex arithmetic.  

I am using Windows XP operating system.

Thanks for taking a look at this.

Best regards,
Ravi.


____________________________________________________________________

Ravi Varadhan, Ph.D.
Assistant Professor,
Division of Geriatric Medicine and Gerontology
School of Medicine
Johns Hopkins University

Ph. (410) 502-2619
email: rvaradhan at jhmi.edu



[Rd] Inaccurate complex arithmetic of R (Matlab is accurate)
Ravi Varadhan