fminNCG

语法

fminNCG(func, X0, fprime, fhess, [xtol=1e-5], [maxIter], [c1=1e-4], [c2=0.9])

详情

使用牛顿共轭梯度法(Newton conjugate gradient;也称为截断牛顿法,Truncated Newton method)对目标函数进行无约束最小化。本方法适用于解决大型非线性优化问题。

参数

func 函数名,表示需要最小化的目标函数。注意:函数返回值须是数值标量类型。

X0 数值类型的标量或向量,表示使目标函数最小化的参数的初始猜测。

fprime 函数名,表示计算 func 梯度的函数。

fhess 函数名,表示计算 func 的 Hessian 矩阵的函数。

xtol 可选参数,正数值标量,用于判断是否结束迭代的步长衡量值。如果两次迭代间参数变化量的范数小于 xtol*size(X0),则认为算法收敛,停止迭代。默认值为 1e-5。

maxIter 可选参数,非负整数标量,表示执行的最大迭代次数。

c1 可选参数,数值标量,值域为(0,1),c1 应小于 c2,表示 Armijo 条件规则的参数。默认值为 1e-4。

c2 可选参数,数值标量,值域为(0,1),c2 应大于 c1,表示曲率条件规则参数。默认值为 0.9。

返回值

返回一个字典,字典有以下成员:

  • xopt:浮点数向量,使目标函数最小化的参数值。

  • fopt:浮点数标量,目标函数最小值。fopt=func(xopt)。

  • iterations:整数标量,优化过程中执行的总迭代数。

  • fcalls:整数标量,优化过程中的目标函数调用次数。

  • gcalls:整数标量,优化过程中的梯度函数调用次数。

  • hcalls:整数标量,优化过程中的计算 Hessian 函数的调用次数。

  • warnFlag:整数标量,有四个可能值:

    • 0:表示成功执行算法全过程。

    • 1:表示已达最大迭代次数,算法停止执行。

    • 2:表示由于精度损失问题,线搜索失败。

    • 3:表示结果产生 NULL 值。

例子

本例自定义条件,传入参数 f, X0, fprime, fhess,使用牛顿共轭梯度法找到目标函数 rosen 的最小值。

def rosen(x) { 
	N = size(x);
	return sum(100.0*power(x[1:N]-power(x[0:(N-1)], 2.0), 2.0)+power(1-x[0:(N-1)], 2.0));
}

def rosen_der(x) {
	N = size(x);
	xm = x[1:(N-1)]
	xm_m1 = x[0:(N-2)]
	xm_p1 = x[2:N]
	der = array(double, N)
	der[1:(N-1)] = (200 * (xm - xm_m1*xm_m1) - 400 * (xm_p1 - xm*xm) * xm - 2 * (1 - xm))
	der[0] = -400 * x[0] * (x[1] - x[0]*x[0]) - 2 * (1 - x[0])
	der[N-1] = 200 * (x[N-1] - x[N-2]*x[N-2])
	return der
}

def diag1(x, k) {
	N = size(x)
	m = matrix(type(x), N+1,N+1)
	if (k == 1) {
		for(i in 0:N){
			m[i, i+1] = x[i]
		}
	} else {
		for(i in 0:N){
			m[i+1, i] = x[i]
		}
	}

	return m
}

def rosen_hess(x) {
	N = size(x);
	x1= x[0:(N-1)] * 400
	H = diag1(-x1, 1) - diag1(x1, -1)
	diagonal = array(type(x), N)
	diagonal[0] = 1200 * x[0]*x[0] - 400 * x[1] + 2
	diagonal[N-1] = 200
	diagonal[1:(N-1)] = 202 + 1200 * x[1:(N-1)]*x[1:(N-1)] - 400 * x[2:N]
	H = H + diag(diagonal)
	return H
}

X0 = [4, -2.5]
fminNCG(rosen, X0, rosen_der, rosen_hess)

/* Ouput:(返回顺序可能略有不同)
xopt->[0.999999966120496,0.999999932105584]
fopt->1.149654357653714E-15
iterations->34
fcalls->45
gcalls->45
hcalls->34
warnFlag->0
*/