第四章一维搜索法

第四章一维搜索法
第四章一维搜索法

第四章 一维搜索法

由第一章关于求解最优化问题概述中我们知道,从已知迭代点n k R X ∈出发按照基本迭代公式k k k k P t X X +=+1来求解最优化问题,其关键在于如何构造一个搜索方向n k R P ∈和确定一个步长1R t k ∈,使下一迭代点1+k X 处的目标函数值下降,即)()(1k k X f X f <+.现在我们来讨论,当搜索方向k P 已经确定的情况下,如何来确定步长k t ?步长因子的选取有多种方法,如取步长为常数,但这样选取的步长并不最好,如何选取最好步长呢?实际计算通常采用一维搜索来确定最优步长.

对无约束最优化问题

)(min X f n

R

X ∈, 当已知迭代点k X 和下降方向k P 时,要确定适当的步长k t 使=+)(1k X f

)(k k k P t X f +比)(k X f 有所下降,即相当于对于参变量t 的函数

)()(k k tP X f t +=?

要在区间],0[∞+上选取k t t =使)()(1k k X f X f <+,即

)0()()()(??=<+=k k k k k X f P t X f t .

由于这种从已知点k X 出发,沿某一下降的探索方向k P 来确定步长k t 的问题,实质上是单变量函数()t ?关于变量t 的一维搜索选取问题,故通常叫做一维搜索.按这种方法确定的步长k t 又称为最优步长,这种方法的优点是,它使目标函数值在搜索方向上下降得最多.

今后为了简便起见,我们用记号

)(1k k k P X ls X ,=+

(4.1)

表示从点k X 出发沿k P 方向对目标函数)(X f 作直线搜索所得到的极小点是1+k X .其中l 和s 分别是Linear search (直线搜索)两词的词首.在目标函数)(X f 已确定的条件下(4.1)

等价于如下两式:

????

?+==+=++k

k k k t

k k t k k k P t X X t tP X f P t X f 1)(min )(min )(,? 下面进一步解释迭代点k k k k P t X X +=+1的空间位置.容易证明,若从k X 出发,沿k P 方

向进行一维搜索得极小点k k k k P t X X +=+1,则该点1+=k X X 处的梯度方向)(1+?k X f 与搜索方向k P 之间应满足

0)(1=?+k T k P X f . (4.2)

事实上,设)()(k k tP X f t +=?,对t 求导有

k T k k P tP X f t )()(+?='?. 令0)('=t ?,即0)(=+?k T k k P tP X f ,所以0)(1=?+k T k P X f .

式(4.2)的几何意义是明显的.从某一点k X 出发沿k P 方向对目标函数)(X f 作直线搜索,所得到的极小点为1+k X .式(4.2)指出,梯度)(1+?k X f 必与搜索方向k P 正交.又因为)(1+?k X f 与目标函数过点1+k X 的等值面)()(1+=k X f X f 正交,所以进一步看到,搜索方向

k P 与这个等值面在点1+k X 处相切(如图4.1所示)

. §4.1 搜索区间及其确定方法

一、搜索区间

设一维最优化问题为

)

(m in max

0t t t ?≤≤. (4.3)

为了求解问题(4.3),我们引入如下的搜索区间概念.

定义4.1 设

])0[)(0[max *

*11t t t R R ,,,:∈∞+∈→?,并且 )

(min )(max

0*t t t t ??≤≤=,

若存在闭区间])0[])([0[][max t b a b a ,,,,

?∞+?使][*

b a t ,∈,则称][b a ,是问题(4.3)的搜索区间.

简言之,一个一维最优化问题的搜索区间,就是包含该问题最优解的一个闭区间.通常,在进行一维搜索时,一般要先确定出问题的一个搜索区间,然后在此区间中进行搜索求解.

二、加步探索法

下面,介绍一个确定问题(4.3)的搜索区间的简单方法.这个方法的思想是:先选定一个

初始点])0[)(0[max 00t t t ,或,

∈?∞+∈和初始步长00>h .然后,沿着t 轴的正方向探索前进一个步长,得到新点00h t +.若目标函数在新点处的值是下降了,即

)()(000t h t ??<+,

则下一步就从新点00h t +出发加大步长,再向前探索.若目标函数在新点处的 函数值上升,即

)()(000t h t ??>+,

则下一步仍以0t 为出发点以原步长开始向t 轴的负方向同样探索.当达到目标函数上升的点时,就停止探索,这时便得到问题(4.3)的一个搜索区间.这种以加大步长进行探索来寻找探索区间的方法叫做加步探索法.

加步探索法算法的计算步骤:

(1) 选取初始数据.选取初始点])0[)(0[max 00t t t ,或,∈?∞+∈,计算)(00t ??=.给

出初始步长00>h ,加步系数1α>,令0=k .

(2) 比较目标函数值.令k k k h t t +=+1,计算)(11++=k k t ??,若k k ??<+1,转(3).否则转(4).

(3)加大探索步长.令k k h h α=+1,同时,令k t t =,1+=k k t t ,1k k ??+=,1k k =+,转(2).

(4) 反向探索.若0=k ,转换探索方向,令1,+=-=k k k t t h h ,转(2).否则,停止迭代,令

图4.1

11min{}max{}k k a t t b t t ++==,,,

输出][b a ,

. 加步探索法算法的流程图如图4.2所示。

在加步探索法中,一般建议2=α.若能估计问题(4.3)的最优解的大体位置的话,初

始点0t 要尽量取接近于问题(4.3)的最优解.在具体运用上述加步探索法时,有时还要考虑一些细节问题.例如,当探索得到新点处的目标函数值和出发点处相同时,以及初始步长应如何选取等,都需作适当处理.

三、单谷区间与单谷函数

由于以后要介绍的一些维搜索方法,主要适用于问题(4.3)在搜索区间中只有唯一的最优解的情况,为此,我们再给出下面单谷区间与单谷函数概念.

定义 4.2 设11R R →:?,闭区间1][R b a ?,

.若存在点][*

b a t ,∈,使得)(t ?在][*t a ,上严格递减,()t ?在][*b t ,上严格递增,则称][b a ,是函数)(t ?的单谷区间,)(t ?是][b a ,上单谷函数.

图4.2

由定义4.2易知,一个区间是某函数的单谷区间意味着,在该区间中函数只有一个“凹

谷”(极小值).例如,图4.3中的][b a ,

是)(t ?的单谷区间,也即)(t ?是][b a ,上的单谷函数.图4.4中的][b a ,

不是)(t ?的单谷区间,即)(t ?不是][b a ,上的单谷函数. 另外,从定义4.2还可知,某区间上的单谷函数在该区间上不一定是连续函数,而凸函

数在所给区间上必然是单谷函数(如图4.3所示).由定义4.1和定义4.2知,函数)(t ?的单谷区间总是相应问题(4.3)的一个搜索区间(如图4.3所示),但反之不然(如图4.4所示).

图4.3

图4.4

单谷区间和单谷函数有如下有用的性质:

定理4.1 设][1

1b a R R ,,

:→?是)(t ?的单谷区间,任取][21b a t t ,,∈并且12t t <. (1)若有)()(12t t ??≤,则][1t a ,

是)(t ?的单谷区间. (2)若有)()(12t t ??≥,则][2b t ,

是)(t ?的单谷区间. 证明略.

定理4.1说明,经过函数值的比较可以把单谷区间缩短为一个较小的单谷区间.换句话说,利用这个定理可以把搜索区间无限缩小,从而求出极小点.以下介绍的几种,一维搜索方法都是利用这个定理通过不断地缩短搜索区间的长度,来求得一维最优化问题的近似最优解.

§4.2 对分法

一、对分法基本原理

求解一维最优化问题min ()t ?一般可先确定它的一个有限搜索区间][b a ,

,把问题化为求解问题)

(min t b t a ?≤≤,然后通过不断缩短区间],[b a 的长度,最后求得最优解.

设1

1R R →:?在已获得的搜索区间][b a ,内具有连续的一阶导数.因为)(t ?在][b a ,

上可微,故)(t ?在][b a ,

上连续,由此知)(t ?在][b a ,上有最小值. 令0)(='t ?,总可求得极小点*t .不妨设)(t ?在)(*t a ,上是单减函数;在)(*

b t ,

上是单增函数.所以)(*t a t ,

∈时,0)(<'t ?,故0)(<'a ?;当)(*b t t ,∈时,0)(>'t ?,亦即0)(>'b ?.对分法的原理如图4.5所示.

二、对分法迭代步骤

已知)(t ?,)(t ?'表达式,终止限ε.

(1) 确定初始搜索区间],[b a ,要求'()0'(a b ??<>,.

(2) 计算],[b a 的中点)

(21

b a

c +=.

(3) 若0)(<'c ?,则c a =,转(4);若0)(='c ?,则c t =*,转(5);若0)(>'c ?,则c b =,转(4).

图4.5

(4) 若ε<-||b a ,则

)(21

*b a t +=

,转(5);否则转(2).

(5) 打印*

t ,结束.

对分法的计算流程如图4.6所示.

三、对分法有关说明

对分法每次迭代都取区间的中点.若这点的导数值小于零,说明0)(='t ?的根位于右半区间中(如图4.5所示),因此去掉左半区间;若中点导数值大于零,则去掉右半区间;若中点导数值正好等于零,则该点就是极小点.因为每次迭代都使原区间缩短一半,所以称为对分法或二分法.

§4.3 Newton 切线法

一、Newton 切线法基本原理

设11:R R →?在已获得的搜索区间][b a ,

内具有连续二阶导数,求

)

(min t b

t a ?≤≤.

因为)(t ?在][b a ,

上可微,故)(t ?在][b a ,上有最小值,令0)(='t ?. 下面不妨设在区间][b a ,

中经过k 次迭代已求得方程0)(='t ?的一个近似根k t .过))(,(k k t t ?'作曲线)(t y ?'=的切线,其方程是

))(()(k k k t t t t y -''='-??.

(4.4)

然后用这条切线与横轴交点的横坐标1+k t 作为根的新的近似(如图 4.7所示).它可由方程(4.4)在令0=y 的解出来,即

)()(1k k k k t t t t ??'''-

=+.

这就是Newton 切线法迭代公式.

二、Newton 切线法迭代步骤

已知)(t ?,)(t ?'表达式,终止限ε.

(1) 确定初始搜索区间],[b a ,要求'()0'(a b ??<>,.

(2) 选定0t .

(3) 计算000'()/"()t t t t ??=-.

(4) 若ε≥-||0t t ,则t t =0,转(3);否则转(5). (5) 打印()t t ?,,结束.

Newton 切线法的计算流程如图4.8所示.

三、Newton 切线法有关说明

这种方法如果初始点选得适当,收敛速度很快,通常经过几次迭代就可以得到满足一般精度要求的结果,但是它也有缺点.第一,需要求二阶导数.如果在多维最优化问题的一维搜索中使用这种方法,就要涉及Hesse 矩阵,一般是难于求出的.第二,当曲线)(t y ?'=在],[b a 上有较复杂的弯曲时,

这种方法也往往失效.如图4.9所示的迭代:210t t t →→,结果2t 跳出],[b a .迭代或

者发散,或者找到的根并不是我们想要的结

果.第三,即使曲线比较正常,在],[b a 中或者上凹或者下凹,初始点的选取也必须适当.在图 4.10(a )的情况下,曲线上凹,

应选点b 作为初始点;而在图4.10(b )的情况下,曲线下凹,应选点a 为初始点.否则都可能失败.

图4.7

图4.9

图4.8

图4.10

§4.4 黄金分割法

一、黄金分割法基本原理

要介绍黄金分割法有必要回顾一下古老的黄金分割问题.所谓黄金分割就是将一线段分为二段时,要求整段长L 与较长段x 的比值正好等于较长段x 与较短段x L -的比值(如图4.11所示),即

x L x

x L -=

于是有022=-+L Lx x ,解出其正根

L L x 618.021

5≈-=

由此可见长段的长度应为全长的0.618倍,而短段的长度应为全长的0.382倍.因为古代的人们认为按0.618的比率来分割线段是最协调,胜似黄金,故称之为黄金分割.

图4.11

用黄金分割法进行一维搜索,其基本思想是在单谷区间][b a ,

内适当插入两点21t t ,,由此把区间][b a ,

分为三段,然后再通过比较这两点函数值大小,就可以确定是删去最左段还是最右段,或者同时删去左右两段保留中间段.如此继续下去可将单谷区间无限缩小.

二、黄金分割法迭代步骤

现在提出一个问题,就在][b a ,

上如何选取二点21t t ,使得迭代次数最小而区间缩短最

快?要解决这个问题,人们想到对区间][b a ,

选二点21t t ,等价于将区间长度a b -进行黄金分割,也就是将第一个搜索点1t 取在][b a ,

的0.618处,第二个搜索点2t 取成1t 的对称点即][b a ,的0.382处(如图4.12所示),亦即

)(618.01a b a t -+=, )(382.02a b a t -+=.

计算)(1t ?与)(2t ?的值,并根据)(1t ?与)(2t ?的值的大小关系分情况讨论:

(1) 若)()(21t t ??<,说明1t 是好点,于是把区间][2t a ,

划掉,保留][2b t ,,则][2b t ,内有一保留点1t ,置新的区间][][211b t b a ,

,=; (2)若)()(21t t ??>,说明2t 是好点,于是应将][1b t ,划掉,保留][1t a ,,则][1t a ,内有保留点2t ,置新的区间][][111t a b a ,

,=. (3)若)()(21t t ??=,则应具体分析,看极小点可能在哪一边再决定取舍.在一般情况下,可同时划掉][2t a ,

和][1b t ,,仅保留中间的][12t t ,,置新的区间][][1211t t b a ,,=. 接下来是在留下的区间][11b a ,内找好点.重复上面的步骤,直到搜索区间][i i b a ,小于给定的允许误差0>ε为止.这样就得到黄金分割法迭代算法:

已知)(t ?,常数β=0.382,终止限ε.

(1)确定)(t ?的初始搜索区间][b a ,

. (2)计算)()(222t a b a t ??β=-+=,.

(3)计算1211()t a b t t ??=+-=,. (4) 若ε<-||21t t ,则打印22

1*t t t +=

,结束;否

则转(5).

(5) 判别是否满足21??≤:若满足,则置

12122??===,,t t t a ,

然后转(3);否则,置

)()(22221211t a b t t t t b ??βα??=-+====,,,,,

然后转(4).

黄金分割法算法流程如图4.13所示.

三、黄金分割法有关说明

黄金分割法是通过所选试点的函数值而逐步缩短单谷区间来搜索最优点*t .该方法适用于单谷区间],[b a 上的任何函数,甚至可以是不连续函数,因此这种算法属于直接法,适用相当广泛.

图4.12

§4.5 抛物线插值法

一、抛物线插值法基本原理 考虑一维搜索问题

)

(min 2

1t t t t ?≤≤,

假设其中)(t ?是定义在区间][21t t ,

上的单谷函数.首先用试探法在][21t t ,上找一点0t ,使之满足

)()()()(0201t t t t ????≥≥,.

通过目标函数曲线上的三个点))(())(())((220011t t t t t t ???,,,,,

,作它的二次拟合曲线(如图4.14所示)

2210)(t a t a a t P ++=.

)

图4.13

图4.14

由于上述三个点既是目标函数曲线)(t ?上的点,又是二次拟合曲线)(t P 上的点,故有方程组

?????=++==++==++=.,,

)()()()()()(2222210202

02010012121101t t a t a a t P t t a t a a t P t t a t a a t P ???

(4.5)

将方程组(4.5)中的0a 消去,得

22110210102210220202()()()()()()()()a t t a t t t t a t t a t t t t ?????-+-=-??-+-=-??,.

(4.6)

从方程组(4.6)可解出待定系数

))()(()()()()()()(1220012202102122122201t t t t t t t t t t t t t t t a ----+-+-=

???,

(4.7)

))()(()

()()()()()(1220012010121202t t t t t t t t t t t t t t t a ----+-+-=

???.

(4.8)

对于二次拟合函数2210)(t a t a a t P ++=,我们很容易求得它的极小值点.令0)

(=dt t dP ,

即0221=+t a a ,从中解出

212a a t -

=

(4.9)

即为二次拟合函数)(t P 的极小值点.

将式(4.7)与式(4.8)代入式(4.9)得

)()()()()()()()()()()()(212201012120220210212212220

21t t t t t t t t t t t t t t t t t t a a t ??????-+-+--+-+-=-= (4.10)

用区间],[21t t 上二次拟合函数)(t P 的这个极小值点t 作为目标函数)(t ?在该区间极小值点的一个估计值.若t 和0t 已充分接近,即对给定的允许误差0>ε使

ε<-||0t t

(4.11)

成立时,t 就可被看作是)(t ?在区间][21t t ,

内近似最优解;否则应缩短区间,按照)(t ?值保持两头大、中间小的原则构成新的三点,继续上述过程,直至不等式(4.11)成立为止.

二、抛物线插值法迭代步骤

下面具体介绍一下缩短区间,构成新三点的方法.

由式(4.15)得到的点t ,在区间],[21t t 内既可能在点0t 的左侧(即0t t <),又可能在0

t 的右侧(即0t t >),分别对应这两种情形比较)(t ?和)(0t ?的大小,又有)()(0t t ??<,

)()(0t t ??>及)()(0t t ??=等三种情形,故共有如下六种情况(如图4.15与图4.16所示):

(1)对于图 4.15(a )的情况:因)()(0t t ??<,所以相对0t 来说t 是好点,故划掉区

间],[20t t ,保留],[01t t 为新区间,故置)()(0202t t t t ??==,,00()()t t t t ??==,,1t 保持不变;

(2)对于图4.15(b )的情况:因)()(0t t ??>,所以相对t 来说0t 是好点,故划掉],[1t t ,

保留],[2t t 为新区间,故置11()()t t t t ??==,

,0t 与2t 保持不变; (3)对于图4.15(c )的情况:因)()(0t t ??<,所以相对0t 来说t 是好点,

故划掉],[01t t ,保留],[20t t 为新区间,故置10100()()t t t t t t ??===,

,,0()()t t ??=,2t 保持不变;

(4)对于图4.15(d )的情况:因)()(0t t ??>,所以相对t 来说0t 是好点,故划掉]

,[2t t 保留],[1t t ,故置22()()t t t t ??==,,0t 与1t 保持不变.

(5)对于图4.16(a )的情况:一般同时划掉],[1t t 及],[20t t 仅留中间的],[0t t ,故置

t t =1,1()()t t ??=,02t t =,20()()t t ??=,22

10t t t +=,

??? ??+=2)(210

t t t ??; (6)对于图4.16(b )的情况:一般同时划掉],[01t t 及],[2t t ,仅留中间],[0t t ,故置01t t =,

10()()t t ??=,t t =2,2()()t t ??=, 22

10t t t += ,

??? ??+=2)(210

t t t ??. 通过上述讨论,我们可直接给抛物线插值法的迭代流程图(图4.17). 三、抛物线插值法有关说明

抛物线插值法是多项式逼近法的一种.所谓多项式逼近,是利用目标函数在若干点的函数值或导数值等信息,构成一个与目标函数相接近的低次插值多项式,用该多项式的最优解作为目标函数的近似最优解.

图4.15 图4.16

斐波那契法 一维搜索方法

短后的区间不大于区间[0,10]的5% 。 解:由题意=δ5%,由斐波那契数列δ1 ≥n F ,则n=7, 00=a ,100=b 1t =0b )(0076a b F F --=2180 , 21 130)(00760'1=-+=a b F F a t , 将1t 和'1t 代入函数,比较大小有)()('11t f t f < 则有001==a a ,21801'2==t t ,21130'11==t b ,21 50)(116512=--=a b F F b t , 将2t 和'2t 代入函数,比较大小有)()('22t f t f < , 则有012==a a ,21502'3==t t ,2180'22==t b ,21 30)(225423=--=a b F F b t , 将3t 和'3t 代入函数,比较大小有)()('33t f t f >, 则有213033==t a ,2150'34==t t ,218023==b b ,21 60)(33433'4=-+=a b F F a t , 将4t 和'4t 代入函数,比较大小有)()('44t f t f >, 则有215044==t a ,2160'45==t t ,218034==b b ,21 70)(44324'5=-+=a b F F a t , 将5t 和'5t 代入函数,比较大小有)()('55t f t f >, 则有216055= =t a ,2170'56==t t ,218045==b b , 则令105 351)21602180()01.05.0(2160))((55215'6=-?++=-++=a b F F a t ε, 将6t 和'6t 代入函数,比较大小有)()('66t f t f <, 则216056==a a ,105351'66==t b ,区间为:?? ????105351,2160 所以选择6t 为极小点,=)(6t f 89.6)2170( -=f 。

最优化方法一维搜索法C++程序

加步探索法 #include #include using namespace std; double fun(double t) { return (t*t*t-2*t+1); } double max(double a,double b) { if(a>b)return a; else return b; } double min(double a,double b) { if(a>b)return b; else return a; } double Addstep(double(*pfun)(double t)) { int k=0; double t0=0,h=1,r=2,t,a=0,b=0; t=t0+h; do{ if(fun(t)

对分法 #include #include using namespace std; double fun(double t) { return (t*t-3*t); } double dfun(double t) { return (2*t-3); } void Dichotomous(double(*pfun)(double t),double (*pdfun)(double t)) { int maxflag=1000,k=1; double a=-3,b=5,c,err=0.1,t; do { c=(a+b)/2; if(dfun(c)<0){a=c;} else {if(dfun(c)>0){b=c;} else{a=c;b=c;}} k++; }while(fabs(a-b)>err&&k=maxflag) cout<

三点一维搜索法报告

三点一维搜索法报告 姓名:张攀班级:2009211102 学号:09210048 算法的基本思想: 三点一维算法是从0.618法衍生而来的,0.618算法使用从两点a,b间选择两个点c,d将原来区域分为三个,抛弃不符合所求数值趋势的两个区域,不断逼近所求值,当|b-a|

实例分析: 选择函数:f[x] := Sin[x^4] + Cos[x] 该函数在[0,1]范围内有极小值,令a=0,b=1,p=0.1,e选取1*10^(-9),运算后结果在x=0.4904089750976563时有最小值0.939949。运算次数为22次, P值选取效率的影响: 在该函数中,[0,1]内函数波动较为平缓,从中间缓慢向两边扩展显然速度较快,因为所求点接近终点,当p增大的时能很快覆盖到所求点效率将变高,如果区域远超过所求点则效率将变低。 P取值以及逼近次数i的关系: P=0.1,i=22 P=0.2,i=26 P=0.25,i=19 P=0.3,i=19 P=0.35,i=21 P=0.4,i=23 P=0.5,i=26 P=0.6,i=30 P=0.7,i=36 P=0.8,i=57 可见最好的取值应为0.25到0.3之间。 总结: 三点一维算法实际通过多次比较,减少了0.618法对点的移动,和对区域的选择,比0.618法稳定。在比较区域大时三点一维算法比起0.618法更加优秀。

实验1 一维搜索算法的程序设计

实验一 一维搜索算法的程序设计 一、实验目的 1、熟悉一维无约束优化问题的二分法、0.618算法和牛顿法。 2、培养matlab 编程与上机调试能力。 二、实验课时:2个课时 三、实验准备 1、预习一维无约束优化问题的二分法、0.618算法和牛顿法的计算步骤。 2、熟悉matlab 软件的基本操作。 四、实验内容 课堂实验演示 1、根据二分法算法编写程序,求函数 2 ()22f x x x =++ 在区间[2,1]-上的极小值。 二分法如下: (1)给定区间[,]a b (要求满足0)(',0)('>δ; (2)若δ≤-a b ,则停,输出*()/2x a b =+; (3)计算()/2c a b =+; (4)若0)('c f ,令b c =;否则若0)('=c f ,则停输出*()/2x a b =+; function [val,x,iter] = bisection_method(a,b,delta) iter = 0; while abs(b-a)>delta iter = iter+1; [y,dy] = fun((a+b)/2); if abs(dy)<= delta x = (a+b)/2; val = y; return; elseif dy<0 a = (a+b)/2; else b = (a+b)/2;

end end x = (a+b)/2; [val,dval] = fun(x); %%%%%%%%%%%%%%%%%%%%%%% obj function %%%%%%%%%%%%%%%%%%%%%%%%% function [y,dy] = fun(x) y = x^2+2*x+2; dy = 2*x+2; >> delta = 1.0e-6; [val,x,iter] = bisection_method(-2,1,delta) val = 1 x = -1 iter = 21 2、根据0.618算法编写程序,求函数 ()()()630sin tan 1x f x x x e =- 在区间[0,1]上的极大值。 令()()()()630sin tan 1x g x f x x x e =-=--,则原问题转化为求[] ()0,1m in x g x ∈ 0.618算法如下: (1)给定区间[,]a b ,及精度0eps >; (2)计算试探点0.382(),0.618()r a b a u a b a =+-=+-. 令1=k ; (3)若eps a b <-,则停止计算,输出)(,2/)(* **x f f a b x =+=;否则, 若()()f r f u >,转(4);若)()(u f r f <,转(5); (4)令a r =,r u =,计算0.618()u a b a =+-,转(6); (5)令b u =,u r =,计算0.382()r a b a =+-,转(6); (6)令1+=k k ,回 (3). 运行结果,如下: >> a=0,b=1,eps=10^(-5); [optx,opty,iter]=gold_section_method(a,b,eps) iter = 26 optx = 0.9707

第三章 一维搜索

第三章 常用一维搜索方法 第节维搜索概述 第一节 一维搜索概述一、下降迭代算法的基本思想、下降迭代算法的基本思想 不失一般性,考虑如下的优化问题 min ()x S f x ∈ (3.1) 其中:n f S R R ?→. 下降迭代算法的的基本思想:给定一个初始点1n x R ∈,按 }k 使得当}k 是有限点列时照某种迭代规则产生一个点列{x ,使得当{x 其最后一个点是最优化问题的最优解;当{}k x 是无穷点列时,它有极限点,且其极限点是优化问题的最优解.

设已迭代到点k x 处,则下一次迭代会出现以下两种情况之一: (1) 从k x 出发沿任何方向移动,目标函数不再下降; 出发至少存在个方向使标数有所 (2)从k x 出发至少存在一个方向使目标函数()f x 有所下降.这时,从中选取一个下降方向k d ,即k d 满足 ()0k T k f x d ?<,然后在直线 k k x x d λ=+上适当的确定一个新点 1k k k k x x d λ+=+,使得1()()()k k k k k f x f x d f x λ+=+<,此时就说完成了第1k +次迭代. 基本迭代格式 1k k k k x x d λ+=+ 本代格式 k d ------搜索方向 k λ-----步长因子或搜索步长

最优化问题的求解步骤 最优化问题的求解步骤:(1)选取初始点1x ,令1k =; (2)构造搜索方向k d .依照一定的规则,构造()f x 在点 k x 处的下降方向或可行下降方向作为搜索方向k d ; (3)确定搜索步长k λ.以k x 为起点沿搜索方向k d 选取的 λ适当步长k ,使得目标函数值有某种意义的下降,通常使 ()()k k k k f x d f x λ+<. 1k +令1k k k + (4)求出新的迭代点x .令k x x d λ=+(5)检验终止条件.判定1 k x +是否满足终止条件,若满足 停止迭代输出近似最优解否则令转 停止迭代,输出近似最优解1k x +;否则,令:1k k =+,转(2).

一维搜索算法(二)

项目二 一维搜索算法(二) [实验目的] 编写抛物线插值法的程序。 [实验学时] 2学时 [实验准备] 1、掌握二分法的思想及迭代步骤 2、掌握抛物线插值法的思想及迭代步骤。 [实验内容及步骤] 编程解决以下问题: 1、用二分法求解 )2()(min +=t t t ?, 已知初始单谷区间]5,3[],[-=b a ,要求按精度3.0=ε,001.0=ε分别计算. 2、用抛物线插值法求解 3728)(m in 23+--=x x x x f , 已知初始单谷区间001.0]20[][==ε,,, b a .取初始插值点为x=1

[实验教案] 例1 用二分法求f(x)=8x^3-2*x^2-7*x+3 的局部最优解.允许误差ε=0.0001 ,初始点设区间为[0,1]. #include using namespace std; float f(float x) { return (8*x*x*x-2*x*x-7*x+3); } float f1(float x) { return (24*x*x-4*x-7); } void main() { float a=0,b=1,c,delta=0.0001; do { c=(a+b)/2; if(f1(c)>=0) { b=c; } else { a=c; } }while((b-a)/2>delta); cout<<"该问题的最优解为"<<(a+b)/2<<",最优值为"<

[例题2] 用抛物线插值法求解 30min ()32t t t t ?≥=-+, 已知初始单谷区间[0,3].0.05ε=,取初始插值点为t=1 #include #include using namespace std; double Alpha(double x1,double x2,double x3); double faiPhi(double t); double faiPhi(double t) //求3()32x t t ?=-+ { return (t*t*t-3*t+2); } double Alpha(double x1,double x2,double x3) //求α { double x,y; x=(x2*x2-x3*x3)*faiPhi(x1)+(x3*x3-x1*x1)*faiPhi(x2)+(x1*x1-x2*x2)*faiPhi(x3); y=(x2-x3)*faiPhi(x1)+(x3-x1)*faiPhi(x2)+(x1-x2)*faiPhi(x3); return (0.5*x/y); } void main() { double a=0,b=3,t=2,Epsilon=0.05,t1; do { t1=Alpha(a,t,b); if(fabs(t-t1)t) { if(faiPhi(t1)<=faiPhi(t)) { a=t;t=t1; } else { b=t1; } } else { if(faiPhi(t1)<=faiPhi(t)) { b=t;t=t1; } else { a=t1; } } } }while(1); }

第四章一维搜索法

第四章 一维搜索法 由第一章关于求解最优化问题概述中我们知道,从已知迭代点n k R X ∈出发按照基本迭代公式k k k k P t X X +=+1来求解最优化问题,其关键在于如何构造一个搜索方向n k R P ∈和确定一个步长1R t k ∈,使下一迭代点1+k X 处的目标函数值下降,即)()(1k k X f X f <+.现在我们来讨论,当搜索方向k P 已经确定的情况下,如何来确定步长k t ?步长因子的选取有多种方法,如取步长为常数,但这样选取的步长并不最好,如何选取最好步长呢?实际计算通常采用一维搜索来确定最优步长. 对无约束最优化问题 )(min X f n R X ∈, 当已知迭代点k X 和下降方向k P 时,要确定适当的步长k t 使=+)(1k X f )(k k k P t X f +比)(k X f 有所下降,即相当于对于参变量t 的函数 )()(k k tP X f t +=? 要在区间],0[∞+上选取k t t =使)()(1k k X f X f <+,即 )0()()()(??=<+=k k k k k X f P t X f t . 由于这种从已知点k X 出发,沿某一下降的探索方向k P 来确定步长k t 的问题,实质上是单变量函数()t ?关于变量t 的一维搜索选取问题,故通常叫做一维搜索.按这种方法确定的步长k t 又称为最优步长,这种方法的优点是,它使目标函数值在搜索方向上下降得最多. 今后为了简便起见,我们用记号 )(1k k k P X ls X ,=+ (4.1) 表示从点k X 出发沿k P 方向对目标函数)(X f 作直线搜索所得到的极小点是1+k X .其中l 和s 分别是Linear search (直线搜索)两词的词首.在目标函数)(X f 已确定的条件下(4.1) 等价于如下两式: ???? ?+==+=++k k k k t k k t k k k P t X X t tP X f P t X f 1)(min )(min )(,? 下面进一步解释迭代点k k k k P t X X +=+1的空间位置.容易证明,若从k X 出发,沿k P 方 向进行一维搜索得极小点k k k k P t X X +=+1,则该点1+=k X X 处的梯度方向)(1+?k X f 与搜索方向k P 之间应满足 0)(1=?+k T k P X f . (4.2) 事实上,设)()(k k tP X f t +=?,对t 求导有

一维搜索算法(一)

项目一 一维搜索算法(一) [实验目的] 编写进退法、对分法、Newton 法的程序。 [实验学时] 2学时 [实验环境] Matlab 或VC++6.0 [实验目的] 1.掌握一维收搜索中搜索区间的进退法的思想及迭代步骤; 2.掌握0.618法的思想及迭代步骤; 3.掌握Fibonaci 法的思想及迭代步骤。 [实验内容及步骤] 编程解决以下问题: 1.用进退法确定一维最优化问题 12)(min 30+-=≥t t t t ? 的搜索区间,要求选取2,1,000===αh t . 2.用0.618法求解 12)(min 3+-=t t t ?, 已知初始单谷区间]1,0[],[=b a ,要求精度01.0=ε. 3.用Fibonaci 法求解 12)(min 3+-=t t t ?, 已知初始单谷区间]1,0[],[=b a ,要求精度01.0=ε.

[实验教案] 例1 设f(x)=x^2-2*x+4 ,试用进退法确定初始搜索区间。#include using namespace std; float f(float x) { return (x*x-2*x+4); } void main() { int k=0; float a0,h,t,aerfa,a1,a,b; cout<<"初始数据为: "; cout<<"初始点a0="; cin>>a0; cout<<"\t\t始步长h="; cin>>h; cout<<"\t\t加倍系数t="; cin>>t; do { a1=a0+h; if(f(a1)

牛顿法

牛顿法 如前面所提到的,最速下降法在最初几步迭代中函数值下降很快外,总的说来下降的并不快,且愈接近极值点下降的愈慢。因此,应寻找使目标函数下降更快的方法。牛顿法就是一种收敛很快的方法,其基本思路是利用二次曲线来逐点近似原目标函数,以二次曲线的极小值点来近似原目标函数的极小值点并逐渐逼近改点。 一维目标函数()f x 在()k x 点逼近用的二次曲线(即泰勒二次多项式)为 ()()()()()()21 ()()()()()()2 k k k k k k x f x f x x x f x x x ?'''=+-+ - 此二次函数的极小点可由()()0k x ?'=求得。 对于n 维问题,n 为目标函数()f X 在() k X 点逼近用的二次曲线为: ()()()()()2()() 1 ()()().[][].().[]2 k k k k k T k k X f x f X X X X X f X X X ???=+?-+-?-?? 令式中的Hessian 2()()()()k k f X H X ?=,则上式可改写为: ()()()()()()() 1 ()()().[][].().[]2 () k k k k k T k k X f x f X X X X X H X X X f X ???=+?-+--?? ≈ 当()0X ??=时可求得二次曲线()X ?的极值点,且当且仅当改点处的Hessian 矩阵为正定时有极小值点。 由上式得: ()()()()()()[]k k k X f X H X X X ??=?+- 令()0X ??=,则() ()()()()[]0k k k f X H X X X ?+-= 若() ()k H X 为可逆矩阵,将上式等号两边左乘1 () ()k H X -????,则得 1 ()()() ()()[]0k k k n H X f X I X X -???+-=?? 整理后得 1 () ()() ()()k k k X X H X f X -??=-??? 当目标函数()f X 是二次函数时,牛顿法变得极为简单、有效,这时() ()k H X 是一个 常数矩阵,式 ()()()()()()() 1 ()()().[][].().[]2 () k k k k k T k k X f x f X X X X X H X X X f X ???=+?-+--?? ≈变成精

最优化理论与方法——牛顿法

牛顿法简介 摘要:牛顿法作为求解非线性方程的一种经典的迭代方法,它的收敛速度快,有内在函数可以直接使用。结合着matlab 可以对其进行应用,求解方程。关键词:牛顿法,Goldfeld 等人修正牛顿法,matlab 实现 1介绍: 迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法,即一次性解决问题。但多数方程不存在求根公式,因此求解根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。 迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。 利用迭代算法解决问题,需要做好以下3个方面的工作: 1,确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 2,建立迭代关系式。所谓迭代关系式,是指如何从变量的前一个值推出下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 3,对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。牛顿迭代法(Newton’s method )又称为牛顿-拉夫逊方法(Newton-Raphson method ),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法,其基本思想是利用目标函数的二次Taylor 展开,并将其极小化。牛顿法使用函数()f x 的泰勒级数的前面几项来寻找方程()0f x =的根。牛顿法是求方程根的重要方法之一,其最大优点是在方程()0f x =的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时非线性收敛,但是可通过一些方法变成线性收敛。 牛顿法的几何解释: 方程()0f x =的根*x 可解释为曲线()y f x =与x 轴的焦点的横坐标。如下图:

一维搜索牛顿法

2013-2014(1)专业课程实践论文题目:一维搜索牛顿法

牛顿法是一种函数逼近法,基本思想是:在极小点附近用 函数的二阶泰勒多项式近似代替目标函数,从而求得目标函数 的极小点的近似值。 对 ()f x 在 xk 点二阶泰勒展开: 221()()'()()''()()(())2 k k k k k k f x f x f x x x f x x x o x x =+-+-+- 略去高阶项得 2 1()()'()()''()()2k k k k k f x f x f x x x f x x x ≈+-+ - 两边对x 求导,'()'()''()()k k k f x f x f x x x ≈+- 令 '()=0f x ,得到 '() ''()k k k f x x x f x ≈- 取 1'() =''()k k k k f x x x f x +- 作为新的迭代点,继续迭代,直到达到精度,这样就得到了 函数 f 的一个驻点 。以上过程即Newton 法。

三、算法程序 #include #include using namespace std; double fun(double t) { return (t*t*t-2*t+1); } double dfun(double t) { return (3*t*t-2); } void NewtonIterative(double(*pfun)(double t),double (*pdfun)(double t)) { int maxflag=1000,k=1; double t0=1,err=0.01,t; do { t0=t; t=t0-pfun(t0)/pdfun(t0); k++; }while(fabs(t-t0)>err&&k=maxflag) cout<

相关主题