A real vector argument to fn, indicating the initial guess
for the root of the nonliinear system of equations fn.
fn
Nonlinear system of equation that is to be solved.
A vector function that takes a real vector as argument and
returns a real vector of the same length.
method
A vector of integers specifying which Barzilai-Borwein
steplengths should be used in a consecutive manner. The methods will
be used in the order specified.
control
A list of parameters governing the algorithm behaviour.
This list is the same as that for dfsane and sane (excepting
the default for trace).
See details for important special features of control parameters.
quiet
logical indicating if messages about convergence success or
failure should be suppressed
...
arguments passed fn (via the optimization algorithm).
Details
This wrapper is especially useful in problems where the algorithms
(dfsane or sane) are likely to experience difficulties in
convergence. When these algorithms with default parameters fail, i.e.
when convergence > 0 is obtained, a user might attempt various
strategies to find a root of the nonlinear system. The function BBsolve
tries the following sequential strategy:
Try a different BB steplength. Since the default is method = 2
for dfsane, the BBsolve wrapper tries method = c(2, 1, 3).
Try a different non-monotonicity parameter M for each method,
i.e. BBsolve wrapper tries M = c(50, 10) for each BB steplength.
Try with Nelder-Mead initialization. Since the default for
dfsane is NM = FALSE, BBsolve does NM = c(TRUE, FALSE).
The argument control defaults to a list with values
maxit = 1500, M = c(50, 10), tol = 1e-07, trace = FALSE,
triter = 10, noimp = 100, NM = c(TRUE, FALSE).
If control is specified as an argument, only values which are different
need to be given in the list. See dfsane for more details.
Value
A list with the same elements as returned by dfsane
or sane. One additional element returned is cpar which
contains the control parameter settings used to obtain successful
convergence, or to obtain the best solution in case of failure.
References
R Varadhan and PD Gilbert (2009), BB: An R Package for Solving a Large System of Nonlinear Equations and for Optimizing a High-Dimensional Nonlinear Objective Function, J. Statistical Software, 32:4, http://www.jstatsoft.org/v32/i04/
See Also
BBoptim,
dfsane,
sanemultiStart
Examples
# Use a preset seed so test values are reproducable.
require("setRNG")
old.seed <- setRNG(list(kind="Mersenne-Twister", normal.kind="Inversion",
seed=1234))
broydt <- function(x) {
n <- length(x)
f <- rep(NA, n)
h <- 2
f[1] <- ((3 - h*x[1]) * x[1]) - 2*x[2] + 1
tnm1 <- 2:(n-1)
f[tnm1] <- ((3 - h*x[tnm1]) * x[tnm1]) - x[tnm1-1] - 2*x[tnm1+1] + 1
f[n] <- ((3 - h*x[n]) * x[n]) - x[n-1] + 1
f
}
p0 <- rnorm(50)
BBsolve(par=p0, fn=broydt) # this works
dfsane(par=p0, fn=broydt) # but this is highly unliikely to work.
# this implements the 3 BB steplengths with M = 50, and without Nelder-Mead initialization
BBsolve(par=p0, fn=broydt, control=list(M=50, NM=FALSE))
# this implements BB steplength 1 with M = 50 and 10, and both with and
# without Nelder-Mead initialization
BBsolve(par=p0, fn=broydt, method=1, control=list(M=c(50, 10)))
# identical to dfsane() with defaults
BBsolve(par=p0, fn=broydt, method=2, control=list(M=10, NM=FALSE))
Results
R version 3.3.1 (2016-06-21) -- "Bug in Your Hair"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
> library(BB)
> png(filename="/home/ddbj/snapshot/RGM3/R_CC/result/BB/BBsolve.Rd_%03d_medium.png", width=480, height=480)
> ### Name: BBsolve
> ### Title: Solving Nonlinear System of Equations - A Wrapper for dfsane()
> ### Aliases: BBsolve
> ### Keywords: multivariate
>
> ### ** Examples
>
> # Use a preset seed so test values are reproducable.
> require("setRNG")
Loading required package: setRNG
> old.seed <- setRNG(list(kind="Mersenne-Twister", normal.kind="Inversion",
+ seed=1234))
>
> broydt <- function(x) {
+ n <- length(x)
+ f <- rep(NA, n)
+ h <- 2
+ f[1] <- ((3 - h*x[1]) * x[1]) - 2*x[2] + 1
+ tnm1 <- 2:(n-1)
+ f[tnm1] <- ((3 - h*x[tnm1]) * x[tnm1]) - x[tnm1-1] - 2*x[tnm1+1] + 1
+ f[n] <- ((3 - h*x[n]) * x[n]) - x[n-1] + 1
+ f
+ }
>
> p0 <- rnorm(50)
> BBsolve(par=p0, fn=broydt) # this works
Successful convergence.
$par
[1] -0.5707612 -0.6819101 -0.7024859 -0.7062605 -0.7069519 -0.7070784
[7] -0.7071015 -0.7071058 -0.7071066 -0.7071067 -0.7071067 -0.7071068
[13] -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068
[19] -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068
[25] -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068
[31] -0.7071068 -0.7071068 -0.7071068 -0.7071067 -0.7071067 -0.7071065
[37] -0.7071061 -0.7071050 -0.7071019 -0.7070933 -0.7070700 -0.7070063
[43] -0.7068325 -0.7063577 -0.7050615 -0.7015252 -0.6918946 -0.6657975
[49] -0.5960353 -0.4164123
$residual
[1] 9.385509e-08
$fn.reduction
[1] 31.59999
$feval
[1] 281
$iter
[1] 255
$convergence
[1] 0
$message
[1] "Successful convergence"
$cpar
method M NM
3 50 0
> dfsane(par=p0, fn=broydt) # but this is highly unliikely to work.
Iteration: 0 ||F(x0)||: 4.468913
iteration: 10 ||F(xn)|| = 7.372656
iteration: 20 ||F(xn)|| = 2.148256
iteration: 30 ||F(xn)|| = 1.087926
iteration: 40 ||F(xn)|| = 1.837539
iteration: 50 ||F(xn)|| = 1.227962
iteration: 60 ||F(xn)|| = 1.173819
iteration: 70 ||F(xn)|| = 1.164419
iteration: 80 ||F(xn)|| = 1.116905
iteration: 90 ||F(xn)|| = 1.126721
iteration: 100 ||F(xn)|| = 1.112744
iteration: 110 ||F(xn)|| = 1.113586
iteration: 120 ||F(xn)|| = 1.115942
iteration: 130 ||F(xn)|| = 1.112886
$par
[1] -0.5706552 -0.6837528 -0.7044984 -0.7057360 -0.7087213 -0.7061261
[7] -0.6987339 -0.6990289 -0.7070646 -0.7002412 -0.7064187 -0.7075855
[13] -0.7067219 -0.7016219 -0.6943348 -0.6600190 -0.5448951 -0.1804689
[19] 0.6734614 1.5312355 -0.1678685 -0.5997800 -0.6774198 -0.7063091
[25] -0.7050525 -0.7029759 -0.7094338 -0.7060808 -0.7104785 -0.6995702
[31] -0.7145343 -0.6990088 -0.7072191 -0.6836870 -0.6969368 -0.6938772
[37] -0.6985233 -0.7016326 -0.7064762 -0.7041186 -0.7080469 -0.7058380
[43] -0.7078563 -0.7050803 -0.7057069 -0.7008472 -0.6920625 -0.6656979
[49] -0.5960234 -0.4164090
$residual
[1] 0.1538559
$fn.reduction
[1] 30.51206
$feval
[1] 456
$iter
[1] 130
$convergence
[1] 5
$message
[1] "Lack of improvement in objective function"
Warning message:
In dfsane(par = p0, fn = broydt) : Unsuccessful convergence.
>
> # this implements the 3 BB steplengths with M = 50, and without Nelder-Mead initialization
> BBsolve(par=p0, fn=broydt, control=list(M=50, NM=FALSE))
Successful convergence.
$par
[1] -0.5707612 -0.6819101 -0.7024859 -0.7062605 -0.7069519 -0.7070784
[7] -0.7071015 -0.7071058 -0.7071066 -0.7071067 -0.7071067 -0.7071068
[13] -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068
[19] -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068
[25] -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068
[31] -0.7071068 -0.7071068 -0.7071068 -0.7071067 -0.7071067 -0.7071065
[37] -0.7071061 -0.7071050 -0.7071019 -0.7070933 -0.7070700 -0.7070063
[43] -0.7068325 -0.7063577 -0.7050615 -0.7015252 -0.6918946 -0.6657975
[49] -0.5960353 -0.4164123
$residual
[1] 9.385509e-08
$fn.reduction
[1] 31.59999
$feval
[1] 281
$iter
[1] 255
$convergence
[1] 0
$message
[1] "Successful convergence"
$cpar
method M NM
3 50 0
>
> # this implements BB steplength 1 with M = 50 and 10, and both with and
> # without Nelder-Mead initialization
> BBsolve(par=p0, fn=broydt, method=1, control=list(M=c(50, 10)))
Successful convergence.
$par
[1] -0.5707611 -0.6819101 -0.7024861 -0.7062606 -0.7069518 -0.7070784
[7] -0.7071016 -0.7071058 -0.7071066 -0.7071067 -0.7071068 -0.7071068
[13] -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068
[19] -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068
[25] -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068 -0.7071068
[31] -0.7071068 -0.7071068 -0.7071068 -0.7071067 -0.7071067 -0.7071065
[37] -0.7071061 -0.7071050 -0.7071019 -0.7070933 -0.7070700 -0.7070063
[43] -0.7068325 -0.7063577 -0.7050615 -0.7015252 -0.6918946 -0.6657975
[49] -0.5960353 -0.4164123
$residual
[1] 6.796092e-08
$fn.reduction
[1] 31.59999
$feval
[1] 54
$iter
[1] 31
$convergence
[1] 0
$message
[1] "Successful convergence"
$cpar
method M NM
1 50 0
>
> # identical to dfsane() with defaults
> BBsolve(par=p0, fn=broydt, method=2, control=list(M=10, NM=FALSE))
Unsuccessful convergence.
$par
[1] -0.5706552 -0.6837528 -0.7044984 -0.7057360 -0.7087213 -0.7061261
[7] -0.6987339 -0.6990289 -0.7070646 -0.7002412 -0.7064187 -0.7075855
[13] -0.7067219 -0.7016219 -0.6943348 -0.6600190 -0.5448951 -0.1804689
[19] 0.6734614 1.5312355 -0.1678685 -0.5997800 -0.6774198 -0.7063091
[25] -0.7050525 -0.7029759 -0.7094338 -0.7060808 -0.7104785 -0.6995702
[31] -0.7145343 -0.6990088 -0.7072191 -0.6836870 -0.6969368 -0.6938772
[37] -0.6985233 -0.7016326 -0.7064762 -0.7041186 -0.7080469 -0.7058380
[43] -0.7078563 -0.7050803 -0.7057069 -0.7008472 -0.6920625 -0.6656979
[49] -0.5960234 -0.4164090
$residual
[1] 0.1538559
$fn.reduction
[1] 30.51206
$feval
[1] 456
$iter
[1] 130
$convergence
[1] 5
$message
[1] "Lack of improvement in objective function"
$cpar
method M NM
2 10 0
>
>
>
>
>
> dev.off()
null device
1
>