[R] adaptive optimization of mesh size

baptiste Auguié ba208 at exeter.ac.uk
Sun May 4 17:39:43 CEST 2008


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



More information about the R-help mailing list