一、应用方向
1、求方程的根
并不是所有的方程 都有求根公式,或者求根公式很复杂,这时可以利用牛顿法,迭代求解。
原理是利用泰勒公式在 处展开,且展开到一阶,即,求解 ,即 ,化简得:,因此获得迭代公式如下:
2、最优化
在最优化问题中,线性最优化可以用行法求解,但对于非线性最优化问题,牛顿法提供了一种求解的办法。假设任务是优化一个目标函数 ,求函数的极大极小问题,可以转化为求解函数的导数 的问题,这样就可以把优化问题转化为方程求解问题。
若要求方程 的根,则迭代公式如下:
二、牛顿法
考虑无约束最优化问题:,其中,, 为目标函数的极小点。
假设有二阶连续偏导数,若第k次迭代值为,则可将在附近进行二阶泰勒展开:
这里, 是 的梯度向量在点 的值; 是 的黑塞矩阵
在点 的值。 函数有极值点的必要条件是在极值点处一阶导数为0,即梯度向量为0,。特别是当 在极值点处是正定矩阵时,函数的极值为极小值。
由二阶泰勒展开式,两边对 求导,得 ;再假设 满足 ,则 ,因此,迭代公式如下:
其中, 为迭代方向, 为迭代步长。
完整算法如下:
三、代码实现
matlab实现求正定二次函数的极小值点
% 牛顿法---收敛速度很快;但是每一步都需要计算Hessian矩阵的逆,计算复杂
% 牛顿法---基于二阶导数,基于当前位置的切线来确定下一次的位置
function [x,m] = newton(A,b,x,ep,n)
% A:正定矩阵 b:向量 x:初始向量 ep:停止误差 n:最大迭代次数
% 求二次函数 f(x)=(1/2)x'*A*x+b'x+c 的极小值,A为正定矩阵
% A为f(x)的Hessian矩阵 f'(x)=Ax+b为梯度向量
m = 0; % 统计迭代次数
for k = 0:n
g = A * x + b; % 梯度向量
if (g'*g <= ep) % 终止条件
break;
end
H = A; % hessian矩阵
x = x - H^(-1) * g; % 迭代公式
m = m + 1;
end
% A = [2,1;1,2];
% b = [1;2];
% x = [0;0];
% ep = 0.00001;
% n = 1000;
% [y,m] = newton(A,b,x,ep,n); % [0;-1]