32 lines
		
	
	
		
			991 B
		
	
	
	
		
			R
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			991 B
		
	
	
	
		
			R
		
	
	
	
	
	
# Polynomial f(x, y) = 5 x^2 - 6x y + 5 y^2
 | 
						|
fun <- function(x) {
 | 
						|
    5 * x[1]^2 - 6 * x[1] * x[1] + 5 * x[2]^2
 | 
						|
}
 | 
						|
# Update, df(x, y)/dx = 0  =>  x = 6 y / 10 for y fixed
 | 
						|
# The same the other way arround
 | 
						|
update <- function(x, i) {
 | 
						|
    (6 / 10) * if (i == 1) x[2] else x[1]
 | 
						|
}
 | 
						|
# call with initial values (x, y) = (-0.5, -1)
 | 
						|
stopifnot(all.equal(
 | 
						|
    ICU(fun, update, c(-0.5, -1)),
 | 
						|
    c(0, 0) # known minimum
 | 
						|
))
 | 
						|
 | 
						|
# Same problem as above but with a list of parameters
 | 
						|
fun <- function(params) {
 | 
						|
    5 * params$x^2 - 6 * params$x * params$x + 5 * params$y^2
 | 
						|
}
 | 
						|
# Update, df(x, y)/dx = 0  =>  x = 6 y / 10 for y fixed
 | 
						|
# The same the other way arround
 | 
						|
update <- function(params, i) {
 | 
						|
    (6 / 10) * if (i == 1) params$y else params$x
 | 
						|
}
 | 
						|
# and a callback
 | 
						|
callback <- function(iter, params) {
 | 
						|
    cat(sprintf("%3d - fun(%7.4f, %7.4f) = %6.4f\n",
 | 
						|
        iter, params$x, params$y, fun(params)))
 | 
						|
}
 | 
						|
# call with initial values (x, y) = (-0.5, -1)
 | 
						|
ICU(fun, update, list(x = -0.5, y = -1), callback = callback)
 |