$$f(x_1,x_2)=(1-x_1)^2+100(x_2-x_1^2)^2$$算法
该函数全局最小值在($x_1=1,x_2=1$)时取到。函数
下面这种写法是由于有多个自变量函数,传入一个参数x,每一个自变量用向量x的份量来表示,从而定义出目标函数。优化
obj <- function(x){ x1 <- x[1] x2 <- x[2] y <- 100*(x2-x1^2)^2+(1-x1)^2 return(y) }
x1梯度:$-400*x_1*(x_2-x_1^2)-2*(1-x_1)$spa
x2梯度:$200*(x_2-x_1^2)$code
梯度:blog
gradient <- function(x){ x1 <- x[1] x2 <- x[2] c(x1_gradient = -400*x1*(x2-x1^2)-2*(1-x1), x2_gradient =200*(x2-x1^2)) }
tip:对于多元函数,须要用向量的形式来输出各个变量上的梯度。图片
下面以$x_1=0,x_2=3$做为起始点,其余参数采用默认设置,梯度也不输入。(默认时优化算法为单纯型法)ip
optim(par = c(0,3),fn=obj)
convergence是收敛的代码字符串
method:优化方法,经过字符串形式传入,表示优化求解的算法,数学
Nelder-Mead:单纯型法,为optim默认优化算法。
使用CG共轭梯度法在默认的迭代次数下求解:
optim(par = c(0,3),fn=obj)
发现算法到达迭代次数上限而退出。
咱们增长迭代次数:
optim(par = c(0,3),fn=obj,method = "CG",control = list(maxit=500))
能够发现目标函数的值能够减小,进一步增长迭代的次数能够获得最优解,可是效率上比默认的Nelder-Mead单纯型法差太多。注意:CG已经使用梯度信息,不须要咱们本身传入自定义的gradient函数
若是咱们使用拟牛顿法BFGS,下面分别为不传入梯度信息与本身传入梯度信息
optim(par = c(0,3),fn=obj,method = "BFGS")
optim(par = c(0,3),fn=obj,gr=gradient,method = "BFGS")