Description Usage Arguments Details Value References See Also Examples
A strategy using different Barzilai-Borwein steplengths to solve a nonlinear system of equations.
1 2 3 |
par |
A real vector argument to |
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 |
quiet |
logical indicating if messages about convergence success or failure should be suppressed |
... |
arguments passed fn (via the optimization algorithm). |
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.
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.
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/
BBoptim
,
dfsane
,
sane
multiStart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 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))
|
Loading required package: setRNG
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
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.
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
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
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
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.