DeaR list,

I'm running an external program that computes some electromagnetic response of a scattering body. The numerical scheme is based on a discretization with a characteristic mesh size "y". The smaller y is, the better the result (but obviously the computation will take longer).

A convergence study showed the error between the computed values and the exact solution of the problem to be a quadratic in y, with standard error increasing as y^3. I wrote the interface to the program in R, as it is much more user friendly and allows for post- processing analysis. Currently, it only runs with user-defined discretization parameter. I would like to implement an adaptive scheme [1] and provide the following improvements,

1) obtain an estimate of the error by fitting the result against a series of mesh sizes with the quadratic model, and extrapolate at y = 0. (quite straight forward)

2) adapt "dynamically" the set of mesh sizes to fulfill a final accuracy condition, between a starting value (a rule-of thumb estimate is given by the problem values). The lower limit of y should also be constrained by the resources (again, an empirical rule dictates the computation time and memory usage).

I'm looking for advice on this second point (both on the technical aspect, and whether this is sound statistically):

- I can foresee that I should always start with a few y values before I can do any extrapolation, but how many of them? 3, 10? How could I know?

- once I have enough points (say, 10) to use the fitting procedure and get an estimate of the error, how should I decide the best location of the next y if the error is too important?

- in a practical implementation, I would use a while loop and append the successive values to a data.frame(y, value). However, this procedure will be run for different parameters (wavelengths, actually), so the set and number of y values may vary between one run and another. I think I'd be better off using a list with each new run having its own data.frame. Does this make sense?


Below are a few lines of code to illustrate the problem,


program.result <- function(x, p){ # made up function that mimicks the results of the real program
        
        y <- p[3]*x^2 + p[2]*x + p[1]
        y * (1 + rnorm(1, mean=0,  sd =  0.1 * y^3))
}


p0 <- c(0.1, 0.1, 2) # set of parameters

## user defined limits of the y parameter (log scale)
limits <- c(0.1, 0.8)
limits.log <- (10^limits)
y.log <- seq(limits.log[1], limits.log[2], l=10)

y <- log10(y.log)

result <- sapply(y, function(x) program.result(x, p0)) # results of the program

#### fitting and extrapolation procedure ####
library(gplots) # plot with CI
plotCI(y, result, y^3, xlim=c(0, 1), ylim=c(0, 2)) # the data with y^3 errors

my.data <- data.frame(y = y,  value = result)

fm <- lm(value ~ poly(y, degree=2, raw=TRUE), data = my.data , weights = 1/y^3)
lines(y, predict(fm, data.frame(y=y)), col = 2)

extrap <- summary(fm)$coefficients[1,] # intercept and error on it
plotCI(0,extrap[1], 2 * extrap[2],  col = 2, add=T)


### my naive take on adaptive runs... ##

objective <- 1e-3 # stop when the standard error of the extrapolated value is smaller than this

err <- extrap[2]
my.color <- 3
while (err > objective){
        
        new.value <- min(y)/2 # i don't know how to choose this optimally
        y <- c(new.value, y)
        new.result <- program.result(new.value, p0)
        result <- c(new.result, result)
        points(new.value, new.result, col= my.color)
        my.data <- data.frame(y = y,  value = result)
fm <- lm(value ~ poly(y, degree=2, raw=TRUE), data = my.data , weights = 1/y^3)
        lines(y, predict(fm, data.frame(y=y)), col = my.color)

        extrap <- summary(fm)$coefficients[1,] # intercept and error on it
        err <- extrap[2]
        print(err)
        plotCI(0,extrap[1], 2 * err,  col = 2, add=T)
        my.color <- my.color + 1
        
}
err



Many thanks in advance for your comments,

baptiste


[1]: Yurkin et al., Convergence of the discrete dipole approximation. II. An extrapolation technique to increase the
accuracy. J. Opt. Soc. Am. A / Vol. 23, No. 10 / October 2006
_____________________________

Baptiste Auguié

Physics Department
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag
http://projects.ex.ac.uk/atto

______________________________________________
R-help@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.

Reply via email to