目录
在数值优化中,一个很强大的重要方法是牛顿法。本次讨论三个部分:(1)牛顿法 (2)泰勒级数(3)牛顿法进行的优化。
牛顿法-----数值计算:求方程的根
牛顿法最初是为了求方程的根。例如,我们有一个方程 ,很容易找到这个方程的根,通过分解
,我们得到这个方程的根是 -2 和 1。但是,要通过计算机求解的复杂方程呢?我们可以使用数值方法 来找到方程的根,其中之一是使用牛顿法。见下图
通过使用牛顿法,去寻找 的根。初始化根寻找的起点,位于图中的
。首先求解
在
处的红色切线,并得到该切线在
轴上面的交点
。紧接着上述步骤,得到
。通过不断更新重复上述过程,最后,我们可以得到
的根。这就是牛顿法的基本方法,最重要的就是求解出
在某处的切线方程,当然,切线斜率的求解也是牛顿法的局限性所在。并不是每个曲线都可导,有的曲线即使可导,但是计算的过程也比较麻烦。
现在,让我们来推导牛顿法的数学表达式吧。为了得到曲线 的 一个切线方程
。
我们有:
得到c以后,我们的切线方程就变成:
令y=0,得到在x轴的交点 。 将此坐标带入切线方程,可以得到
因此,通过迭代这个方程(表达式),我们可以陆续得到x2,x3,逐渐逼近方程的根。牛顿法迭代的公式:, 要求函数在
处可导。
泰勒级数-----逼近一个函数
泰勒级数是使用级数展开的函数的近似。见下图
图中显示了,使用不同阶数(次数)的红色曲线函数,去近似拟合蓝线的动态图。可以看到,随着阶数的增加,红色曲线对蓝色曲线的拟合效果越来越好。理论上,使用泰勒级数,我们可以拟合任何的函数。某个函数 在
处的泰勒展开可以写成:
牛顿法优化
在介绍完了牛顿法数值计算和泰勒展开以后,我们将牛顿法拓展到数值优化中,来寻找一个函数的最小值。感性上来看:
蓝线是我们想要优化的函数曲线,绿色点是我们想要达到点的最优点,此时蓝色曲线函数取到最小值。这里,我们使用泰勒展开的二阶形式去拟合这条蓝色曲线。拟合曲线就是图中的红色和橘黄色曲线。
假设我们的初始点在X0位置,我们可以得到蓝色曲线在该处的泰勒二阶展开。此时对该泰勒二阶展开式求导,使其等于0,得到的x1值,可以使当前的泰勒二阶展开式最小,那么我们就在x1处进行二阶泰勒展开,以此类推,最后找到蓝色曲线的最小值点。数学推导公式:
最后可以得到牛顿优化方法的迭代求解表达式:
Matlab代码例子
clc;clear all; close all
syms x
y=@(x)(x^2-4*x+sin(x)); %定义函数
y_first=@(x)(2.*x-4+cos(x));
y_second=@(x)(x-sin(x));
%初始值
x_temp=20;
x_solu=[x_temp];
for i=1:20
x=x_temp;
y_first_1=y_first(x);
y_second_1=y_second(x);
x_temp=x-y_first_1./(y_second_1+eps);
x_solu=[x_solu;x_temp];
end
%% search visualization
f=@(x)(x.^2-4*x+sin(x));
x=-40:0.1:40;
plot(x,f(x),'k')
hold on
scatter(x_solu(1),f(x_solu(1)),'g','filled')
hold on
plot(x_solu(2:end-1),f(x_solu(2:end-1)),'r')
hold on
scatter(x_solu(2:end-1),f(x_solu(2:end-1)),'r','filled')
hold on
scatter(x_solu(end),f(x_solu(end)),'y','filled')
legend('objective function','start point','search trace','minimizer')
hold off
title('Newton method optimization')
% xlim([-10 20])
xlabel('x')
ylabel('f')
x_solu
总结
牛顿法数值优化,收敛速度较快,但是需要优化函数存在一阶和二阶导数,这是最大的局限性。