牛顿法、拟牛顿法原理

非线性方程与其最优化方法

非线性方程指方程的因变量与自变量之间的关系不是线性关系的方程,比如平方关系、对数关系、指数关系、三角函数关系等。对于此类方程,求解n元实函数f在整个n维向量空间Rn上的最优值点往往很难得到精确解,经常需要求近似解问题。
求解该类方程的最优化问题的方法大多是逐次一维搜索的迭代算法,基本思想是在一个近似点处选定一个有利于搜索方向,沿这个方向进行一维搜索,得到新的近似点。如此反复迭代,直到满足预定的精度要求为止。
常用的迭代算法有:

  • 梯度法:只使用当前点一阶导数决定搜索方向,又称最速下降法,是早期的解析法,收敛速度较慢。
  • 牛顿法:利用函数在当前点的一阶导数和二阶导数寻找搜索方向。从本质上看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法更快。
  • 拟牛顿法:在牛顿法的迭代中,需要计算海赛矩阵的逆矩阵H−1,这一计算比较复杂,我们可以考虑用一个正定矩阵来近似代替。这就是拟牛顿法的基本思想。
  • 高斯牛顿法:使用泰勒级数展开式去近似地代替非线性回归模型,然后通过多次迭代,多次修正回归系数,使回归系数不断逼近非线性回归模型的最佳回归系数,最后使原模型的残差平方和达到最小。
  • 共轭梯度法: 介于最速下降法与牛顿法之间的一个方法,它的每一个搜索方向是互相共轭的,而这些搜索方向仅仅是负梯度方向与上一次迭代的搜索方向的组合,因此,存储量少,计算方便。它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,速度介于最速下降法与牛顿法之间。
  • 直接法:不涉及导数,只使用函数值。有交替方向法(又称坐标轮换法)、模式搜索法、旋转方向法、鲍威尔共轭方向法和单纯形加速法等。

梯度法与牛顿法的比较:
梯度下降法每次选择当前位置梯度最大的方向,然后更新;牛顿法在当前位置选择方向时,不仅考虑是否是当前位置梯度最大的方向,还考虑该方向上继续更新时梯度是否会变得更大。因此牛顿法比梯度下降法看得更远一点,能更快地走到最底部。但是因为牛顿法需要计算二阶导数,计算量更大,实际使用时不如梯度下降法计算速度快。

牛顿法原理

牛顿法的基本思想是:在当前位置x0对f(x)做二阶泰勒展开,进而找到下一个位置x的估计值。
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 f ′ ′ ( x 0 ) ( x − x 0 ) 2 f(x)=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)+\frac{1}{2} f^{\prime \prime}\left(x_{0}\right)\left(x-x_{0}\right)^{2} f(x)=f(x0)+f(x0)(xx0)+21f(x0)(xx0)2
对首式左右两边求导,得
f ′ ( x ) = f ′ ( x 0 ) + f ′ ′ ( x 0 ) ( x − x 0 ) f^{\prime}(x)=f^{\prime}\left(x_{0}\right)+f^{\prime \prime}\left(x_{0}\right)\left(x-x_{0}\right) f(x)=f(x0)+f(x0)(xx0)
由于我们要求极值,此时有
f ′ ( x ) = 0 f^{\prime}(x)=0 f(x)=0
于是上式变为
f ′ ( x 0 ) + f ′ ′ ( x 0 ) ( x − x 0 ) = 0 f^{\prime}\left(x_{0}\right)+f^{\prime \prime}\left(x_{0}\right)\left(x-x_{0}\right)=0 f(x0)+f(x0)(xx0)=0
于是可得求下一步位置x的公式
x = x 0 − f ′ ( x 0 ) f ′ ′ ( x 0 ) x=x_{0}-\frac{f^{\prime}\left(x_{0}\right)}{f^{\prime \prime}\left(x_{0}\right)} x=x0f(x0)f(x0)
写成迭代公式形式为
x k + 1 = x k − f ′ ( x k ) f ′ ′ ( x k ) , k = 0 , 1 , ⋯ x_{k+1}=x_{k}-\frac{f^{\prime}\left(x_{k}\right)}{f^{\prime \prime}\left(x_{k}\right)}, \quad k=0,1, \cdots xk+1=xkf(xk)f(xk),k=0,1,
上面是对单变量函数的牛顿法,对于多变量函数,二阶泰勒展开公式如下:
f ( x ) = f ( x 0 ) + ∇ f ( x 0 ) ⋅ ( x − x 0 ) + 1 2 ⋅ ( x − x 0 ) T ⋅ ∇ 2 f ( x 0 ) ⋅ ( x − x 0 ) f(x)=f(x_{0})+\nabla f(x_{0}) \cdot(x-x_{0})+\frac{1}{2} \cdot(x-x_{0})^{T} \cdot \nabla^{2} f(x_{0}) \cdot(x-x_{0}) f(x)=f(x0)+f(x0)(xx0)+21(xx0)T2f(x0)(xx0)
其中▽f是f的梯度向量,▽2f是f的海森矩阵。即:
∇ f = [ ∂ f ∂ x 1 ∂ f ∂ x 2 ⋮ ∂ f ∂ x N ] \nabla f=\left[ \begin{array}{c}{\frac{\partial f}{\partial x_{1}}} \\\\ {\frac{\partial f}{\partial x_{2}}} \\\\ {\vdots} \\\\ {\frac{\partial f}{\partial x_{N}}}\end{array}\right] f=x1fx2fxNf
∇ 2 f = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 … ∂ 2 f ∂ x 1 ∂ x N ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 … ∂ 2 f ∂ x 2 ∂ x N ∂ 2 f ∂ x N ∂ x 1 ∂ 2 f ∂ x N ∂ x 2 ⋯ ∂ 2 f ∂ x N 2 ] \nabla^{2} f=\left[ \begin{array}{cccc}{\frac{\partial^{2} f}{\partial x_{1}^{2}}} & {\frac{\partial^{2} f}{\partial x_{1} \partial x_{2}}} & {\dots} & {\frac{\partial^{2} f}{\partial x_{1} \partial x_{N}}} \\\\ {\frac{\partial^{2} f}{\partial x_{2} \partial x_{1}}} & {\frac{\partial^{2} f}{\partial x_{2}^{2}}} & {\dots} & {\frac{\partial^{2} f}{\partial x_{2} \partial x_{N}}} \\\\ {\frac{\partial^{2} f}{\partial x_{N} \partial x_{1}}} & {\frac{\partial^{2} f}{\partial x_{N} \partial x_{2}}} & {\cdots} & {\frac{\partial^{2} f}{\partial x_{N}^{2}}}\end{array}\right] 2f=x122fx2x12fxNx12fx1x22fx222fxNx22fx1xN2fx2xN2fxN22f
海森矩阵其实就是多变量函数的所有二阶导数组成的NXN矩阵(假设有N个变量)。若f的混合偏导数可以交换次序(这个混合偏导数满足在(x0,y0)点连续即可),则海森矩阵是一个对称矩阵。
下面将▽f记为g,▽2f记为H。
同样对上面的二阶泰勒展开式两边求导,得:
∇ f ( x ) = g 0 + H 0 ⋅ ( x − x 0 ) \nabla f(x)=g_{0}+H_{0} \cdot(x-x_{0}) f(x)=g0+H0(xx0)
又极值点处有
∇ f ( x ) = 0 \nabla f(x)=0 f(x)=0
于是可得
x = x 0 − H 0 − 1 ⋅ g 0 x=x_{0}-H_{0}^{-1} \cdot g_{0} x=x0H01g0
写成迭代公式形式为
x k + 1 = x k − H k − 1 ⋅ g k , k = 0 , 1 , ⋯ x_{k+1}=x_{k}-H_{k}^{-1} \cdot g_{k}, \quad k=0,1, \cdots xk+1=xkHk1gk,k=0,1,
这就是牛顿迭代法,其搜索方向为
d k = − H k − 1 ⋅ g k d_{k}=-H_{k}^{-1} \cdot g_{k} dk=Hk1gk
又称为牛顿方向。

拟牛顿法原理

牛顿法需要计算二阶偏导数,计算量较大。而且有时目标函数的海森矩阵无法保持正定,此时牛顿法会失效。拟牛顿法的思想就是不使用海森矩阵,而是构造一个近似海森矩阵(或其逆矩阵)的正定对称阵来代替,在“拟牛顿”的条件下优化目标函数。

拟牛顿条件

先将函数f(x)在xk+1处二阶泰勒展开:
f ( x ) ≈ f ( x k + 1 ) + ∇ f ( x k + 1 ) ⋅ ( x − x k + 1 ) + 1 2 ⋅ ( x − x k + 1 ) T ⋅ ∇ 2 f ( x k + 1 ) ⋅ ( x − x k + 1 ) f(x) \approx f(x_{k+1})+\nabla f(x_{k+1}) \cdot(x-x_{k+1})+\frac{1}{2} \cdot(x-x_{k+1})^{T} \cdot \nabla^{2} f(x_{k+1}) \cdot(x-x_{k+1}) f(x)f(xk+1)+f(xk+1)(xxk+1)+21(xxk+1)T2f(xk+1)(xxk+1)
两边求一阶偏导数(这里是一个一阶偏导数矩阵),得:
∇ f ( x ) ≈ ∇ f ( x k + 1 ) + H k + 1 ⋅ ( x − x k + 1 ) \nabla f(x) \approx \nabla f(x_{k+1})+H_{k+1} \cdot(x-x_{k+1}) f(x)f(xk+1)+Hk+1(xxk+1)
取x=xk,得
g k + 1 − g k ≈ H k + 1 ⋅ ( x k + 1 − x k ) g_{k+1}-g_{k} \approx H_{k+1} \cdot(x_{k+1}-x_{k}) gk+1gkHk+1(xk+1xk)

s k = x k + 1 − x k , y k = g k + 1 − g k s_{k}=x_{k+1}-x_{k}, y_{k}=g_{k+1}-g_{k} sk=xk+1xk,yk=gk+1gk
则上式可写成
y k ≈ H k + 1 ⋅ s k 或 s k ≈ H k + 1 − 1 ⋅ y k y_{k} \approx H_{k+1} \cdot s_{k} 或 s_{k} \approx H_{k+1}^{-1} \cdot y_{k} ykHk+1skskHk+11yk
这就是拟牛顿条件。
也可以写成
y k = B k + 1 ⋅ s k 或 s k = D k + 1 ⋅ y k y_{k}=B_{k+1} \cdot s_{k} 或 s_{k}=D_{k+1} \cdot y_{k} yk=Bk+1sksk=Dk+1yk
Bk+1和Dk+1分别代表海森矩阵和海森矩阵的逆矩阵。
在满足此条件的基础上如何构造近似海塞矩阵呢?主要有两种方法:DFP算法和BFGS算法。

DFP算法

该算法的思想是通过迭代方法,逐步近似拟合海森矩阵的逆矩阵。迭代公式如下:
D k + 1 = D k + Δ D k , k = 0 , 1 , 2 , ⋯ D_{k+1}=D_{k}+\Delta D_{k}, \quad k=0,1,2, \cdots Dk+1=Dk+ΔDk,k=0,1,2,
其中D0通常取单位矩阵I。
这个迭代公式的关键是每一步的校正矩阵ΔDK的构造。我们采用待定法,先将ΔDK待定为下面的形式:
Δ D k = α u u T + β v v T \Delta D_{k}=\alpha u u^{T}+\beta v v^{T} ΔDk=αuuT+βvvT
α和β为待定系数,u和v为待定向量。uuT和vvT均为对称矩阵,因此可以保证ΔDK也是对称矩阵。
将待定公式代入迭代公式,并结合上面拟牛顿条件最后的sk和yk的表达式,可得:
s k = D k y k + α u u T y k + β v v T y k s_{k}=D_{k} y_{k}+\alpha u u^{T} y_{k}+\beta v v^{T} y_{k} sk=Dkyk+αuuTyk+βvvTyk
继续将上式化为
s k = D k y k + u ( α u T y k ) + v ( β v T y k ) = D k y k + ( α u T y k ) u + ( β v T y k ) v \begin{aligned} s_{k} &=D_{k} y_{k}+u(\alpha u^{T} y_{k})+v(\beta v^{T} y_{k}) \\\\ &=D_{k} y_{k}+(\alpha u^{T} y_{k})u+(\beta v^{T} y_{k})v \end{aligned} sk=Dkyk+u(αuTyk)+v(βvTyk)=Dkyk+(αuTyk)u+(βvTyk)v
上面之所以可以这样交换,是因为
α u T y k , β v T y k \alpha u^{T} y_{k} ,\beta v^{T} y_{k} αuTykβvTyk
是两个数,我们不妨将其设为
α u T y k = 1 , β v T y k = − 1 \alpha u^{T} y_{k}=1, \beta v^{T} y_{k}=-1 αuTyk=1,βvTyk=1

α = 1 u T y k , β = − 1 v T y k \alpha=\frac{1}{u^{T} y_{k}}, \beta=-\frac{1}{v^{T} y_{k}} α=uTyk1,β=vTyk1
将上式代入sk转化后的公式,得
u − v = s k − D k y k u-v=s_{k}-D_{k} y_{k} uv=skDkyk
我们不妨直接取
u = s k , v = D k y k u=s_{k}, v=D_{k} y_{k} u=sk,v=Dkyk
代回上面α和β的表达式,得:
α = 1 s k T y k , β = − 1 ( D k y k ) T y k = − 1 y k T D k y k \alpha=\frac{1}{s_{k}^{T} y_{k}}, \beta=-\frac{1}{(D_{k} y_{k})^{T} y_{k}}=-\frac{1}{y_{k}^{T} D_{k} y_{k}} α=skTyk1,β=(Dkyk)Tyk1=ykTDkyk1
将上两式代回ΔDK的表达式,得
Δ D k = s k s k T s k T y k − D k y k y k T D k y k T D k y k \Delta D_{k}=\frac{s_{k} s_{k}^{T}}{s_{k}^{T} y_{k}}-\frac{D_{k} y_{k} y_{k}^{T} D_{k}}{y_{k}^{T} D_{k} y_{k}} ΔDk=skTykskskTykTDkykDkykykTDk
这样我们就可以使用迭代公式来进行拟牛顿法的计算了。
DFP算法步骤:

  • 给定初值x0和阈值e,令B0=I,k=0;
  • 每一次迭代时我们计算出搜索方向dk:
    d k = − D k g k d_{k}=-D_{k} g_{k} dk=Dkgk
  • 由下式得到步长,然后计算出sk和xk+1;
    λ k = arg ⁡ min ⁡ λ ∈ R f ( x k + λ d k ) \lambda_{k}=\arg \min_{\lambda \in R} f(x_{k}+\lambda d_{k}) λk=argλRminf(xk+λdk)
    s k = λ k d k , x k + 1 = x k + s k s_{k}=\lambda_{k} d_{k}, x_{k+1}=x_{k}+s_{k} sk=λkdk,xk+1=xk+sk
  • 然后计算gk+1,若其值小于设定阈值,则停止计算;
    g k + 1 = g ( x k + 1 ) g_{k+1}=g(x_{k+1}) gk+1=g(xk+1)
  • 否则计算yk;
    y k = g k + 1 − g k y_{k}=g_{k+1}-g_{k} yk=gk+1gk
  • 然后计算Dk+1;
    D k + 1 = D k + s k s k T s k T y k − D k y k y k T D k y k T D k y k D_{k+1}=D_{k}+\frac{s_{k} s_{k}^{T}}{s_{k}^{T} y_{k}}-\frac{D_{k} y_{k} y_{k}^{T} D_{k}}{y_{k}^{T} D_{k} y_{k}} Dk+1=Dk+skTykskskTykTDkykDkykykTDk
    令k=k+1,重新开始计算搜索方向dk。

BFGS算法

BFGS算法是构造近似海森矩阵(而不是构造海森矩阵的逆矩阵),同样,我们使用迭代的方式来逐步逼近。我们使用B来表示海森矩阵的近似矩阵,而在DFP算法中我们是直接使用D来构造近似海森矩阵的逆矩阵。
BFGS算法的迭代公式:
B k + 1 = B k + Δ B k , k = 0 , 1 , 2 , ⋯ B_{k+1}=B_{k}+\Delta B_{k}, \quad k=0,1,2, \cdots Bk+1=Bk+ΔBk,k=0,1,2,
与DFP一样,我们设
Δ B k = α u u T + β v v T \Delta B_{k}=\alpha u u^{T}+\beta v v^{T} ΔBk=αuuT+βvvT
于是有
y k = B k s k + ( α u T s k ) u + ( β v T s k ) v y_{k}=B_{k} s_{k}+(\alpha u^{T} s_{k})u+(\beta v^{T} s_{k})v yk=Bksk+(αuTsk)u+(βvTsk)v
也令
α u T s k = 1 , β v T s k = − 1 \alpha u^{T} s_{k}=1, \beta v^{T} s_{k}=-1 αuTsk=1,βvTsk=1
u = y k , v = B k s k u=y_{k}, v=B_{k} s_{k} u=yk,v=Bksk
可得
α = 1 y k T s k , β = − 1 s k T B k s k \alpha=\frac{1}{y_{k}^{T} s_{k}}, \beta=-\frac{1}{s_{k}^{T} B_{k} s_{k}} α=ykTsk1,β=skTBksk1
于是ΔBk为
Δ B k = y k y k T y k T s k − B k s k s k T B k s k T B k s k \Delta B_{k}=\frac{y_{k} y_{k}^{T}}{y_{k}^{T} s_{k}}-\frac{B_{k} s_{k} s_{k}^{T} B_{k}}{s_{k}^{T} B_{k} s_{k}} ΔBk=ykTskykykTskTBkskBkskskTBk
该算法的流程和DFP算法完全一样,只是将迭代公式换为BFGS算法的迭代公式,搜索方向换为:
d k = − B k − 1 ⋅ g k d_{k}=-B_{k}^{-1} \cdot g_{k} dk=Bk1gk
计算Bk+1公式为:
B k + 1 = B k + y k y k T y k T s k − B k s k s k T B k s k T B k s k B_{k+1}=B_{k}+\frac{y_{k} y_{k}^{T}}{y_{k}^{T} s_{k}}-\frac{B_{k} s_{k} s_{k}^{T} B_{k}}{s_{k}^{T} B_{k} s_{k}} Bk+1=Bk+ykTskykykTskTBkskBkskskTBk
其他步骤与DFP算法完全一样,具体过程可以参考上面的DFP算法。

  • 14
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Matlab混合牛顿法是一种用于求解非线性方程组的数值方法。它采用了牛顿法的高精度和快速收敛性,同时利用了Broyden方法的不需要求解雅可比矩阵的特点。 混合牛顿法基于以下的原理:在每一次迭代中,我们通过求解方程组的线性近似问题来近似于实际的非线性方程组。具体而言,我们使用雅可比矩阵的逆和当前估计值来构建线性近似问题。然后,求解这个近似问题来得到下一个迭代点。通过不断重复这个过程,我们可以逐步逼近方程组的解。 在Matlab中使用混合牛顿法可以通过内置的函数"fminunc"来实现。该函数可以在最小化非线性函数的同时求解方程组。用户需要提供目标函数和初始猜测值,并设置一些其他参数,如迭代收敛的条件。然后,该函数将使用混合牛顿法来求解方程组。 使用Matlab混合牛顿法可以有效地求解大多数非线性方程组。它不仅具有高精度和快速收敛性,而且还可以避免计算雅可比矩阵,从而减少计算量和内存需求。然而,它也有一些局限性,例如当方程组的解存在奇点或收敛到局部最优解时,可能会出现问题。 总之,Matlab混合牛顿法是一种实用的数值方法,可以有效地求解非线性方程组。它在Matlab中被广泛应用于科学、工程和金融等领域的问题求解中。 ### 回答2: 混合牛顿法是一种用于求解非线性方程组的数值方法。在Matlab中,可以使用该方法来解决非线性方程组的求解问题。 混合牛顿法的基本思想是将Newton法和Broyden方法相结合。在每一次迭代中,通过计算雅可比矩阵的逆来更新迭代点,并使用这个更新后的迭代点计算雅可比矩阵。这种方法能够在迭代过程中逐步逼近方程组的解。 Matlab中可以使用'fsolve'函数来实现混合牛顿法的求解。该函数需要提供一个函数句柄作为输入参数,该函数句柄定义了需要求解的非线性方程组。例如: ``` function F = myfun(x) F = [x(1)^2 + x(2)^2 - 1; x(1)^3 - x(2)^3 - x(1)]; end x0 = [0.5; 0.5]; % 初始点 options = optimoptions('fsolve', 'Display', 'iter'); % 设置显示迭代过程 [x, fval, exitflag, output] = fsolve(@myfun, x0, options); ``` 在上述代码中,'myfun'函数定义了需要求解的非线性方程组。'fsolve'函数的第一个输入参数是函数句柄'@myfun',第二个输入参数是初始点'x0'。通过设置'optimoptions'函数的参数,可以选择是否显示迭代过程。'fsolve'函数的返回结果包括方程组的解'x'以及其他有关迭代过程的信息。 需要注意的是,混合牛顿法不一定始终收敛于方程组的解,因此在使用时需要审慎选择初始点,并且关注迭代过程中是否出现停滞或发散的情况。 ### 回答3: 混合牛顿法是一种在优化问题中常使用的数值解法,也称为拟牛顿法之一。 在matlab中实现混合牛顿法有几个步骤。首先,需要定义目标函数以及其导数。其次,选择合适的初始点。然后,利用牛顿法的思想,通过迭代计算得到函数的最小值。在每一次迭代中,需要计算目标函数在当前点的值及导数,并根据这些值进行更新。 在每一次迭代中,混合牛顿法使用Broyden-Fletcher-Goldfarb-Shanno(BFGS)方法的一种变种,即DFP公式,来逼近目标函数的海森矩阵的逆。通过这种方法,可以避免直接计算海森矩阵的逆矩阵,从而提高计算效率。 混合牛顿法还可以通过给定一个收敛准则,如目标函数的精度和迭代次数的限制,来确定算法何时停止。当满足收敛准则时,算法停止迭代并给出最优解。 需要注意的是,混合牛顿法对于解决非线性方程组和最优化问题具有很高的效果。由于它不需要计算二阶导数,所以在实际应用中更加灵活和高效。 总结来说,matlab混合牛顿法是一种通过迭代近似海森矩阵的逆矩阵来求解优化问题的数值解法。通过合适的初始点和收敛准则,可以得到函数的最小值,并在实际应用中具有较高的效率和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值