牛顿法:数值计算和优化推导

发布于:2022-12-23 ⋅ 阅读:(690) ⋅ 点赞:(0)

目录

牛顿法-----数值计算:求方程的根

泰勒级数-----逼近一个函数

 牛顿法优化

 Matlab代码例子

总结 


在数值优化中,一个很强大的重要方法是牛顿法。本次讨论三个部分:(1)牛顿法 (2)泰勒级数(3)牛顿法进行的优化。

牛顿法-----数值计算:求方程的根

牛顿法最初是为了求方程的根。例如,我们有一个方程 x^2+x-2=0,很容易找到这个方程的根,通过分解 (x+2)(x-1)=0,我们得到这个方程的根是 -2 和 1。但是,要通过计算机求解的复杂方程呢?我们可以使用数值方法 来找到方程的根,其中之一是使用牛顿法。见下图

通过使用牛顿法,去寻找 f(x) 的根。初始化根寻找的起点,位于图中的X_{0} 。首先求解 f(x) 在X_{0} 处的红色切线,并得到该切线在X轴上面的交点X_{1} 。紧接着上述步骤,得到X_{2} 。通过不断更新重复上述过程,最后,我们可以得到f(x)=0 的根。这就是牛顿法的基本方法,最重要的就是求解出f(x) 在某处的切线方程,当然,切线斜率的求解也是牛顿法的局限性所在。并不是每个曲线都可导,有的曲线即使可导,但是计算的过程也比较麻烦。

现在,让我们来推导牛顿法的数学表达式吧。为了得到曲线 f(x) 的 一个切线方程 y=mx+c 。

我们有:

y=mx+c , f(x_{0})=f^{'}(x_{0})x_{0}+c, c=f(x_{0})-f^{'}(x_{0})x_{0}

得到c以后,我们的切线方程就变成:

y=mx+c, f(x_{0})=f^{'}(x_{0})x+f(x_{0})-f^{'}(x_{0})x_{0}, y=f(x_{0})+f^{'}(x_{0})[x-x_{0}]

令y=0,得到在x轴的交点 (x_{1},0)。 将此坐标带入切线方程,可以得到

y=f(x_{0})+f^{'}(x_{0})[x-x_{0}] , 0=f(x_{0})+f^{'}(x_{0})[x_{1}-x_{0}] \\ x_{1}-x_{0}=-\frac{f(x_{0})}{f^{'}(x_{0})}, x_{1}=x_{0}-\frac{f(x_{0})}{f^{'}(x_{0})}

因此,通过迭代这个方程(表达式),我们可以陆续得到x2,x3,逐渐逼近方程的根。牛顿法迭代的公式:x_{n+1}=x_{n}-\frac{f(x_{n})}{f^{'}(x_{n})}, 要求函数在x_{n} 处可导。

泰勒级数-----逼近一个函数

泰勒级数是使用级数展开的函数的近似。见下图

图中显示了,使用不同阶数(次数)的红色曲线函数,去近似拟合蓝线的动态图。可以看到,随着阶数的增加,红色曲线对蓝色曲线的拟合效果越来越好。理论上,使用泰勒级数,我们可以拟合任何的函数。某个函数f(x) 在x=a 处的泰勒展开可以写成:

 牛顿法优化

在介绍完了牛顿法数值计算和泰勒展开以后,我们将牛顿法拓展到数值优化中,来寻找一个函数的最小值。感性上来看:

蓝线是我们想要优化的函数曲线,绿色点是我们想要达到点的最优点,此时蓝色曲线函数取到最小值。这里,我们使用泰勒展开的二阶形式去拟合这条蓝色曲线。拟合曲线就是图中的红色和橘黄色曲线。

假设我们的初始点在X0位置,我们可以得到蓝色曲线在该处的泰勒二阶展开。此时对该泰勒二阶展开式求导,使其等于0,得到的x1值,可以使当前的泰勒二阶展开式最小,那么我们就在x1处进行二阶泰勒展开,以此类推,最后找到蓝色曲线的最小值点。数学推导公式:

最后可以得到牛顿优化方法的迭代求解表达式:

x_{n+1}=x_{n}-\frac{f^{'}(x_{n})}{f^{''}(x_{n})}

 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

总结 

牛顿法数值优化,收敛速度较快,但是需要优化函数存在一阶和二阶导数,这是最大的局限性。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到