lbfgs:如何找到梯度

lbfgs: how to find gradient

我想使用 lbfgs 方法来最小化函数。问题是该函数是 Svenson 函数(参见:Svenson function),我不知道如何找到此类函数的梯度,其中 tau(时间)从 1:15.

开始

有什么帮助吗?

这是渐变。取每个变量的部分。

我们可以通过数值检查梯度是否正确。

grad=function(t, b0, b1, b2, b3, l1, l2) {
  a=1
  b=exp(-t/l1)
  c=t/l1*exp(-t/l1)
  d=t/l2*exp(-t/l2)
  e=t*exp(-t/l1)*(b1*l1+b2*(t-l1))/l1^3
  f=-b3*t*exp(-t/l2)*(l2-t)/l2^3
  return(c(a,b,c,d,e,f))
}
func=function(t, b0, b1, b2, b3, l1, l2) {
  return(b0+b1*exp(-t/l1)+b2*t/l1*exp(-t/l1)+b3*t/l2*exp(-t/l2))
}
x0=c(runif(6))
x1=x0+rnorm(6, 0, .01)

f0=func(1, x0[1], x0[2], x0[3], x0[4], x0[5], x0[6])
f0grd=grad(1, x0[1], x0[2], x0[3], x0[4], x0[5], x0[6])
f1=func(1, x1[1], x1[2], x1[3], x1[4], x1[5], x1[6])
f1-f0
0.009506896

sum(f0grd * (x1-x0))
0.009467063