简体   繁体   中英

How to solve nonlinear equations in R with Controls

I try to solve nonlinear equations with controls.

Here is my code:


fun <- function(x) {

  b0 <- (0.64*1+(1-0.64)*x[1]*(x[2]*x[1]-1)+x[1]*1*(1-x[2])*x[3])/(x[1]-1) -1805*2.85*0.64
  b1plus <-  (0.64*1+(1-0.64)*x[1]*(x[2]*x[1]-1.01)+x[1]*1.01*(1-x[2])*x[3])/(1.01*(x[1]-1)) -1805*2.85*0.64*(1+0.00235)
  b1minus <-  (0.64*1+(1-0.64)*x[1]*(x[2]*x[1]-0.99)+x[1]*0.99*(1-x[2])*x[3])/(0.99*(x[1]-1)) -1805*2.85*0.64*(1-0.00235)

  return(c(b0,b1plus,b1minus))
} 


multiroot(fun,c(1.5, 0, 0))

However, the result I get is far beyond the actual results. I wish to control x1 to the range (1.5,4), x2(0,1), x3(0,10000). How can I do that?

Thank you!!

Methods like 'Newton-Raphson' in multiroot or nleqslv do not work well together with bounds constraints. One possible approach is to square and sum the components of your function

fun1 <- function(x) sum(fun(x)^2)

and then treat this as a global optimization problem where you hope for a minimum value of 0.0 . For example, GenSA provides an implementation of "simulated annealing" that works reasonably well in low dimensions.

library(GenSA)
res <- GenSA(par=NULL, fn=fun1,
             lower=c(1.5,0,0), upper=c(4,1,10000),
             control=list(maxit=10e5))
res$value; res$par
## [1] 119.7869
## [1]    4.00    0.00 2469.44

Several tries did not find a lower function value than this one, which makes me think there is no common root in the constraint box you requested.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM