system: [SYSTEM]

user: 3. 牛顿法 牛顿法最初由艾萨克·牛顿于1736年在 Method of Fluxions中公开提出 [ 2 ]。若非线性目标函数 f ( X ) 具有二阶连续偏导数，又设 X ( k ) 为其极值点的某一近似，在这一点做 f ( X ) 的二阶泰勒展开，即： f ( X ) ≈ g ( X ) = f ( X ( k ) ) + ∇ f ( X ( k ) ) T ( X − X ( k ) ) + 1 2 ( X − X ( k ) ) T ∇ 2 f ( X ( k ) ) ( X − X ( k ) ) 其中 ∇ 2 f ( X ( k ) ) 为 f ( X ) 在 X ( k ) 处的Hessian矩阵。 为求 g ( X ) 的平稳点，令 ∇ g ( X ) = 0 ，即 ∇ f ( X ( k ) ) + ∇ 2 f ( X ( k ) ) ( X − X ( k ) ) = 0 设矩阵 ∇ 2 f ( X ( k ) ) 可逆，则得到牛顿法的算法迭代公式： X ( k + 1 ) = X ( k ) − [ ∇ 2 f ( X ( k ) ) ] − 1 ∇ f ( X ( k ) ) 如果 f ( X ) 是二次函数，则其Hessian矩阵 ∇ 2 f ( X ) 为常数阵。在这种情况下，从任意一点出发，只要一步即可求出 f ( X ) 的极值点(假设Hessian矩阵正定)。 如果 f ( X ) 不是二次函数，二阶泰勒展式仅是一个近似表达式。此时，求得的极值点只是 f ( X ) 的近似极值点。在这种情况下，选取搜索方向： d ( k ) = − [ ∇ 2 f ( X ( k ) ) ] − 1 ∇ f ( X ( k ) ) X ( k + 1 ) = X ( k ) + d ( k ) 按照这种方式求函数 f ( X ) 极小点的方法称为牛顿法，称方向 d ( k ) = − [ ∇ 2 f ( X ( k ) ) ] − 1 ∇ f ( X ( k ) ) 为牛顿 方向。牛顿法收敛的速度很快，当 f ( X ) 的二阶导数及Hessian矩阵的逆矩阵便于计算时，这一方法非常有效。 例2用牛顿法求解例1问题 min f ( X ) = − 2 x 1 x 2 − 2 x 2 + x 1 2 + 2 x 2 2 初始点 X ( 0 ) = ( 0 ， 0 ) T ，   ε = 0.1 。 解：目标函数 f ( X ) 的梯度为 ∇ f ( X ) = ( − 2 x 2 + 2 x 1 ， − 2 x 1 − 2 + 4 x 2 ) T 。 Hessian阵 H ( X ) = ∇ 2 f ( X ) = ( 2 − 2 − 2 4 ) 为正定矩阵(即目标函数为二次凸函数)。 初始点 X ( 0 ) = ( 0 ， 0 ) T ，于是有 ∇ f ( X ( 0 ) ) = ( 0 ， − 2 ) T ，此时 ‖ ∇ f ( X ( 0 ) ) ‖ = 2 > 0.1 ，开始第一次迭代 H ( X ( 0 ) ) = ∇ 2 f ( X ( 0 ) ) = ( 2 − 2 − 2 4 ) ， H ( X ( 0 ) ) − 1 = ( 1 1 2 1 2 1 2 ) 根据牛顿法的迭代公式有： X ( 1 ) = X ( 0 ) − H ( X ( 0 ) ) − 1 ∇ f ( X ( 0 ) ) = ( 0 0 ) − ( 1 1 2 1 2 1 2 ) ( 0 − 2 ) = ( 1 1 ) 于是 ∇ f ( X ( 1 ) ) = ( 0 0 ) ，所以 X * = X ( 1 ) = ( 1 1 ) 为问题精确的极小点，极小值为 f ( X ( 1 ) ) = − 1 。 显然，与例1对比可以知道，牛顿法的收敛速度要远远大于梯度法。 牛顿法每一步的迭代步长都是 t k = 1 ，这样虽然算法简单，但是会在一定的程度上影响收敛速度，所以每次迭代时，我们依然可以采用一维搜索的方法计算出最优步长，即找到搜索方向上的最优迭代点，该种方法被称为阻尼牛顿法。 选择非线性规划常用的测试函数 [ 3 ]： min f = 100 ( x 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 ，该函数图像如图4所示，此问题解析解为(1， 1)，最优值为0，设误差为0.1进行迭代求解，结果见表2。 由下面的分析可以知道，梯度法对于初值的依赖性不强(初值点从 ( 0 ， 0 ) → ( 10 ， 10 ) → ( 20 ， 20 ) → ( 100 ， 100 ) ，在满足精度要求的前提下，迭代次数从 156 → 18374 → 57561 → 619505 次)，越接近极值点收敛速度越慢，而恰好牛顿法对于初值的依赖性很强(初值点从 ( 0 ， 0 ) → ( 10 ， 10 ) → ( 20 ， 20 ) → ( 40 ， 40 ) ，迭代次数从 3 → 12598 → 88854 → 167330 次，初值点在(0， 0)时，只需迭代3次即可满足精度要求，而初值点在(10， 10)时，却需要迭代12598次才能满足精度要求)，在极值点附近收敛速度很快。再对比牛顿法和阻尼牛顿法，显然可以看出阻尼牛顿法由于每一次迭代都在搜索方向上寻求了最优的迭代点，所以他的收敛速度相比牛顿法会有明显的提升，但牛顿法固有的对初值依赖性强的问题并没有得到解决，所以我们想到结合两种算法，首先使用梯度法进行迭代，当迭代点进入极值点的某个充分小邻域时，再使用阻尼牛顿法进行搜索，从而提升问题的收敛速度，本文将此种改进算法称作GN算法。 图4. 测试函数的函数图像 Table 2 Initial value points and iteration table of the test function were solved by the three method 算法 初始值 最优解 最优值 迭代次数 精度 梯度法 (0， 0) (0.9027， 0.8145) 0.0095 156 ε 1 = 0.1 (10， 10) (1.1200， 1.2549) 0.0144 18，374 ε 1 = 0.1 (2.7811， 7.7360) 3.1725 5000 ε 1 = 0.1 (20， 20) (1.1186， 1.2518) 0.0141 57，561 ε 1 = 0.1 (2.4586， 6.0482) 2.1287 50，000 ε 1 = 0.1 (100， 100) (1.0036， 1.0073) 1.3127e−05 619，505 ε 1 = 0.1 牛顿法 (0， 0) (1.000， 1.000) 4，9304e−30 3 ε 1 = 0.1 (10， 10) (1.0498， 1.1020) 0.0025 12，598 ε 1 = 0.1 (20， 20) (1.0498， 1.1020) 0.0025 88，854 ε 1 = 0.1 (40， 40) (1.0498， 1.1020) 0.0025 167，330 ε 1 = 0.1 阻尼牛顿法 (0， 0) (0.9501， 0.9027) 0.0025 317 ε 1 = 0.1 (10， 10) (7，4362， 55.2978) 41.4253 5000 ε 1 = 0.1 (1.0498， 1.1020) 0.0025 12，597 ε 1 = 0.1 (20， 20) (1.0498， 1.1020) 0.0025 44，426 ε 1 = 0.1 表2. 三种方法求解测试函数的初值点和迭代次数表 GN算法的算法步骤： (1) 给出初始点 X ( 0 ) ∈ E n ，精度 ，令 k = 0 ； (2) 计算 ∇ f ( X ( k ) ) ； (3) 若 ‖ ∇ f ( X ( k ) ) ‖ < ε 1 ，则迭代结束，取 X ¯ = X ( k ) ，否则转(4)； (4) 若 ‖ ∇ f ( X ( k ) ) ‖ ≥ ε 1 。 (I)若 ‖ ∇ f ( X ( k ) ) ‖ ≥ ε 2 ，用一维搜索求 φ ( t ) = f ( X ( k ) + t d ( k ) ) 的一个极小点 t k ，使 f ( X ( k ) + t k d ( k ) ) < f ( X ( k ) ) ，其中 d ( k ) = − ∇ f ( X ( k ) ) 。 令 X ( k + 1 ) = X ( k ) + t k d ( k ) ， k = k + 1 ，转(2)。 (II)若 ‖ ∇ f ( X ( k ) ) ‖ < ε 2 ，用一维搜索求 φ ( t ) = f ( X ( k ) + t d ( k ) ) 的一个极小点 t k ，使 f ( X ( k ) + t k d ( k ) ) < f ( X ( k ) ) ，其中 d ( k ) = − [ ∇ 2 f ( X ( k ) ) ] − 1 ⋅ ∇ f ( X ( k ) ) 。 令 X ( k + 1 ) = X ( k ) + t k d ( k ) ， k = k + 1 ，转(2)。 Table 3 Initial value points and iteration table of the test function were solved by the GN method 算法 初始值 最优解 最优值 迭代次数 精度 GN算法 (0， 0) (0.9905， 0.9810) 9.1200e−05 500 ε 1 = 0.1 ， ε 2 = 0.5 (10， 10) (1.0047， 1.0093) 2.1719e−05 16，000 ε 1 = 0.1 ， ε 2 = 0.5 (1.0000， 1.0000) 9.3138e−10 17，000 ε 1 = 0.1 ， ε 2 = 0.5 (100， 100) (1.0000， 1.0000) 3.9211e−14 18，000 ε 1 = 0.1 ， ε 2 = 0.5 表3. GN算法求解测试函数的初值点及迭代次数表 由表3可以看出，当初值点位于(100， 100)时，G-N算法经18，000次迭代，即可得到非常精确(误差仅为3.9211e−14)的最优解，而此时无论是牛顿法还是阻尼牛顿法甚至都是不能得到近似解的，因为牛顿法每一次迭代都严格要求迭代点处的Hessian矩阵可逆，而满足这点并不容易。我们改进后的算法只在极值点的充分小的邻域内使用阻尼牛顿法，既发挥了牛顿法迭代速度快的优点，又最大限度的避免了初值对其影响大的缺点，在局部最优解的充分小的邻域内依然可以保证至少二阶的收敛速度，是一种有效的改进算法。