数值算法:无约束优化之一维搜索方法之二分法、牛顿法、割线法

1、二分法(一阶导)

二分法是利用目标函数的一阶导数来连续压缩区间的方法,因此这里除了要求 f 在 [a0,b0] 为单峰函数外,还要去 f(x) 连续可微。

(1)确定初始区间的中点 x(0)=(a0+b0)/2 。然后计算 f(x) 在 x(0) 处的一阶导数 f‘(x(0)), 如果 f‘(x(0)) >0 , 说明极小点位于 x(0) 的左侧,也就是所,极小点所在的区间压缩为[a0,x(0)];反之,如果 f‘(x(0)) <0,说明极小点位于x(0)的右侧,极小点所在的区间压缩为[x(0),b0];如果f‘(x(0)) = 0,说明就是函数 f(x) 的极小点。

(2)根据新的区间构造x(1),以此来推,直到f‘(x(k)) = 0,停止。

可见经过N步迭代之后,整个区间的总压缩比为(1/2)N,这比黄金分割法和斐波那契数列法的总压缩比要小。

2、牛顿法(二阶导)

这里进一步要求f(x)连续二阶可微。对于函数 f(x) 上一点 x(k),我们可以使用泰勒公式构造一个多项式函数 q(x)=f(x(k))+f‘(x(k))(x-x(k))+1/2 * f‘‘(x(k))(x-x(k))2,对 f(x)在 x(k) 附近进行局部二次拟合,q(x)可以看为f(x)的(在x(k)附近的局部)近似,因此求f(x)的极小点可以转化为求q(x)的极小点。

0=q‘(x)=f‘(x(k))+f‘‘(x(k))(x-x(k))  =>   x = x(k)  -  f‘(x(k))/f‘‘(x(k))  因此可以选择 x(k+1) = x(k)  -  f‘(x(k))/f‘‘(x(k))

牛顿法能够不断地迫使目标函数f(x)的一阶导数趋于0。x(k+1)由g(x(k))的切线产生:

x(k+1)为g(x(k))的切线与x轴交点。随着x(k) -> x*,  g(x)->0。(g(x)为f(x)的近似)

注意1:牛顿法不需要计算函数值,但需要计算一阶导数和二阶导数值,且要求 f‘‘(x)>0,如果f‘‘(x)<0,则可能存在从 x(k) 到 x(k+1)反向调整,收敛到极大点,即越来越偏离极小点。

f‘‘(x(k))>0, x(k)->x*

f‘‘(x(k))<0, x(k)远离x*

注意2:如果x(k)的调整幅度太大可能会导致x的调整序列在极小点左右波动。

初始点g‘(x(0))/g‘‘(x(0))太大,造成算法失效

(3)割线法

牛顿法需要f(x)的二阶导数,如果二阶导数不存在,可以采用不同点的一阶导数对其近似,如 f‘‘(x(k))=(f‘(x(k))-f‘(x(k-1)))/(x(k)-x(k-1)),将其带入牛顿迭代公式,可以得到新的迭代公式:

x(k+1) = x(k)  -  f‘(x(k))  *  (x(k)-x(k-1)) /(f‘(x(k))-f‘(x(k-1)))   <=>   x(k+1) = ( f‘(x(k))x(k-1)  - f‘(x(k-1)) x(k)  )    /   (    f‘(x(k))  -  f‘(x(k-1))  )

这个方法需要两个初始点 x(-1)和x(0),可以看出割线法不需要计算函数值f(x(k)),二阶导数值f‘‘(x(k)),它使用x(k)和x(k-1)之间的割线产生x(k+1)

x(k+1)由过x(k)和x(k-1)的割线产生

(4)拟抛物线插值法

迭代算法跟割线法类似,不同点为使用三个点的函数值近似公式中的两个一阶导数。

[测试数据]:fx.dat  minx.dat

[算法代码]:test.cpp  binaryseg.a   binayseg.so   newton.a   newton.so   secant.a   secant.so

时间: 2024-11-10 13:48:35

数值算法:无约束优化之一维搜索方法之二分法、牛顿法、割线法的相关文章

数值算法:无约束优化之一维搜索方法之黄金分割法、斐波那契数列法

目标函数为一元单值函数f:R->R的最小化优化问题,一般不会单独遇到,它通常作为多维优化问题中的一个部分出现,例如梯度下降法中每次最优迭代步长的估计. 一维搜索方法是通过迭代方式求解的,这不同于我们人脑的直接通过解表达式求解方法.迭代算法是从初始搜索点x(0)出发,产生一个迭代序列x(1),x(2),....在第k=0,1,2,...次迭代中,通过当前迭代点x(k)和目标函数 f 构建下一个迭代点x(k+1).某些算法可能只需要用到迭代点处的目标函数值,而另一些算法还可能用到目标函数的导数 f'

数值算法:无约束优化之一维搜索方法之划界法寻找极小点上下界

前面介绍的黄金分割法.斐波那契数列法.二分法.牛顿法.割线法寻找极小点方法的前提是: 给定初始区间,它包含一个单峰的f(x). 如何寻找这个初始区间? 划界法:(挑选一个含有极小点的区间) 随机挑选3个点x1.x2.x3, 如果 f(x2)<f(x1) 且 f(x2)<f(x3) ,那么 [x1, x3]包含极小点.如果f(x1)>f(x2)>f(x3),那么选择一个点x4,x4>x3, 使得 f(x2) <f(x4)成立,这样[x1, x4]包含极小点.如果f(x1)

数值算法:无约束优化之一维搜索方法之多维优化问题中每步迭代的最优学习率设定问题

多维优化问题的迭代求解算法中,经常遇到学习率(步长)参数问题,比如线性分类器.一般如果采用固定学习率,那么算法收敛将比较慢,为了提高收敛速度往往需要不断调整学习率.一般多维优化问题中的迭代算法中的迭代公式为: xk+1=xk+rk dk 其中 xk 从给定的初始搜索点 x0 迭代,rk>=0为第k次迭代的学习率或步长,迭代目的是寻找最优解x*,使得代价函数 J(x) 最小,dk表示搜索方向,下面讨论学习率最优值问题, 定义: hk(r)=  J(xk + r*dk)  = J(xk+1) 而 J

无约束优化方法

本文讲解的是无约束优化中几个常见的基于梯度的方法,主要有梯度下降与牛顿方法.BFGS 与 L-BFGS 算法,无约束优化的问题形式如下,对于 $x \in \mathbb{R}^n$ ,目标函数为: \[\min_xf(x)\] 泰勒级数 基于梯度的方法都会涉及泰勒级数问题,这里简单介绍一下,泰勒级数就是说函数 $f(x)$ 在点 $x_0$ 的邻域内具有 $n+1$ 阶导数,则该邻域内 $f(x)$ 可展开为 $n$ 阶泰勒级数为: \[f(x) = f(x_0) + \nabla f(x_0

【工程优化】一维搜索方法

一维搜索方法的分类如下: 这篇文章主要讲解黄金分割法.二分法.牛顿法这三种一维搜索方法.黄金分割法只用到原函数,二分法用到函数的一阶导,牛顿法用到函数的二阶导.由于本文主要对研一上学期的课程中的部分算法进行程序实现,理论部分大多参考上课的课件. 黄金分割法 基本概念: 算法思想: 算法流程图及优缺点如下: 二分法  基本思想: 牛顿法 基本思想: 算法流程图: 具体实现: 下面我们通过程序具体实现,在程序中,我们设置原函数都是f(x)=sinx/x,搜索区间都是[0,1],牛顿法中假设初始值设为

&lt;28&gt;【了解】10-枚举类型介绍及定义+【掌握】11-枚举变量变量定义和使用+【掌握】13-typedef定义新的类型+【掌握】15-宏的概念及无参宏定义方法+【掌握】16-有参宏定义和使用方法+【掌握】17-应用:使用有参宏求最大值+【掌握】18-typedef和#define的区别

[了解]10-枚举类型介绍及定义 枚举类型: C语言提供了一个种类型,这种类型的变量的取值被限定在一定的范围之内了 枚举类型的定义: enum 枚举类型名{ 枚举值1,枚举值2,.... }; 举例: 定义一个变量,保存一周的第几天 enum weekday{ zhouyi,zhouer,zhousan,zhousi,zhouwu ,zhouliu,zhouri }; 定义iPhone手机的颜色 关于枚举类型元素的命名习惯 enum iColor{kIcolorWhite,kIcolorBlac

virtualbox共享文件夹无访问权限问题解决方法

早就困扰了,这次新装虚拟机又碰到了,记录下来. 这篇文章主要介绍了virtualbox共享文件夹无访问权限问题解决方法,造成这个问题的原因是不跟virtualbox在同一个用户组,所以加入同个组即可解决这个问题,需要的朋友可以参考下virtualbox的共享文件夹一般都挂载在/media下面,用ll查看会发现文件夹的所有者是root,所有组是vboxsf,所以文件管理去无法访问是正常的,解决方法是把你自己加入到vboxsf组里面. 复制代码代码如下:sudo usermod -a -G vbox

eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn&#39;t work)

在eclipse中用过maven的可能都遇到过这种情况,我以前一直在search.maven里面搜索,然后添加pom信息. 今天在网上搜索时,找到了一个解决方法,在这里分享一下. 第一步,在preferences里面选择maven,选中"Download repository index updates on startup" 第二步,打开Maven仓库 第三步,在全局仓库上右键选择"Full Index Enabled" 选择之后,maven会下载一个近百兆的索引

源码解析一种无模块注入进程方法

对windows安全比较熟悉的同学对模块注入应该都比较了解,很多病毒.木马.外挂都会用到,无模块注入应用得则比较少. 无模块注入的好处是DLL注入进去后,确实已经不以模块的形式存在了,用任何进程模块查看工具,都找不到注入进去的DLL.因为它已经变为一块纯堆内存,跟EXE主模块里申请的堆没有任何差别. 这里讲的一种无模块注入的方法,能够让DLL自身实现这样的功能,无需外部注入工具帮助处理.当然如果进程内自行加载这样的DLL后,也是以无模块DLL形式存在. 注入完成后,进程内找不到注入的模块存在,用