无约束优化方法程序
(05)第四章-无约束优化方法(梯度法-牛顿法和变尺度法)

第四章
第四章
无约束优化问题标准形式:
无约束优化问题标准形式:
§
§
§
§
§
§
图最速下降法的收敛过程
αα
2
2
例4-1 求目标函数
取初始点
[2,2]
=
x
例4-2 求目标函数解取初始点[2,2]
=x
算出一维搜索最佳步长
§
例4-3 用梯度法求下面无约束优化问题:
例4-3 用梯度法求下面无约束优化问题:
例4-3 用梯度法求下面无约束优化问题:
例4-3 用梯度法求下面无约束优化问题:
例4-3 用梯度法求下面无约束优化问题:
梯度法的特点
x
给定0,ε
一般迭代式:
§4.3
§4.3
§4.3
§4.3
α0
d 0
x
x 1
x*
1
α1d 1
1()
f −∇x d 1
4-4 共轭方向法
假设目标函数f (x ) 在极值点附近的二次近似函数为
沿某个下降方向
如果能够选定这样的搜索方向,那么对于二
α
0d0
x0x1x*
1
α
1
d1
1
()
f
−∇x d
1。
第三章 无约束最优化方法

f x f x
*
所以函数f(x)在 x * 处取得局部极小值,称x *为
局部极小点。 而优化问题一般是要求目标函数在某一区域内 的全局极小点。 函数的局部极小点是不是一定是全局极小点呢?
5
第三章 无约束最优化方法
下凸的一元函数
可以证明凸规划问题的局部最小点就是其全局最小点。
6
第三章 无约束最优化方法
f x 0
x Rn
的问题。一般地,这是一个非线性方程组, 17 可对其采用迭代法求解之。
第三章 无约束最优化方法
下降迭代算法
算法:给定目标函数 f x 的极小点的一个初始估计点 x0 , 然后按一定的规则产生一个序列 xk ,这种规则通常称 为算法。如果这个序列的极限恰好是问题(3-1)的极 小点 x* ,即
正定矩阵 设 Q是n×n 阶对称矩阵。
若 x Rn 且 x 0 都有 x T Q x 0 ,则称矩阵Q 是正定的 若 x R
n n
T x 都有 Q x 0 ,则称矩阵Q 是半正定的
若 x R 且 x 0 都有 xT Q x 0 ,则称矩阵Q 是负定的 若 x Rn 都有 x T Q x 0 ,则称矩阵Q 是半负定的
为正定的定义是:若对任何向量d (d!=0),有
d T 2 f x* d 0
对称正定方阵 2 f x* 的检验方法是所有主子式均大于零。 二、迭代方法 求解 无约束最优化问题 T f x min x x1, x2 , , xn 的问题可以转变为求解n 元方程组
26
3-2
一维搜索(0.618法)
设给定一个较小的步长δ,从α=0开始,先计算φ(0),然 后计算在 (1.618)0 的函数值φ(δ);如果φ(δ)<φ(0), 则讲步长δ增大1.618倍,得到一个新点 1.618 2.618 , 计算φ(2.618δ);如果φ(2.618δ)仍小于φ(δ),再继续增加 步长为原步长的1.618倍,如下图所示,从而得到一系列 j 点的αj的值为 '
实验二 无约束最优化

实验二、 无约束最优化【实验目的】1.了解无约束最优化方法的一些基本概念。
2.熟悉掌握用相关的命令来求解无约束最优化问题。
【实验内容】把题目和相应的完整命令写在实验报告上。
1:无约束最优化问题实际上是什么问题?求这类问题的最优解的基本思路是什么?2:求()5x f x e x =-在区间[1,2]内的极小值点和极小值。
3:已知22212312123(,,)3sin f x x x x x x x x =+-。
(1) 求123(,,)f x x x 在点(1,1,0)-附近的极小值;(2) 求123(,,)f x x x 在点(1,1,0)-附近的极小值点和极小值,要求优化算法用高斯-牛顿法,搜索方向用拟牛顿法的DFP 公式。
【相关知识说明】无约束最优化是指在没有约束条件下,求多变量实值函数极值。
无约束最优化问题的数学表达式为12min (),(,,,)n n f x x x x x R =∈。
一般f 为非线性函数,x 是n 维实变量,实际上这是一个多元函数无条件极值问题。
由于求极大值问题,可以用添加负号的方式转化为求极小值问题,因此通常只讨论求极小值问题。
应该注意的是,极值问题的解,即极值点,都是局部最优解,全局最优解只能从局部最优解的比较中得到。
如何求解无约束最优化问题的最优解呢?一般是采用迭代法,即先选择一个初始点,再寻找该点处的下降方向(我们称为搜索方向),在该方向上求极小点,得到一个新的点,然后在新点处再寻找下降方向和在该方向上的求极小点,……,如此下去,最终得到最优解。
我们先来看求一元函数y=f(x)在[x1,x2]内的极小值的命令:说明:其中'fun'是函数f(x)的表达式,当然也可以是关于f(x)的函数M-文件名。
返回值x 是极小值点。
现在我们来回答问题1。
问题1:求()2sin x f x e x -=在区间[0,6]内的极小值点和极小值.命令如下f='2*exp(-x)*sin(x)';x=fminbnd(f,0,6) %极小值点fval=2*exp(-x)*sin(x) %对应x 的极小值大家得到的结果是什么呢?这些是一元函数求极值,那么怎么求多元函数的极值呢?可以用下面的最简形式的命令:如果还必须满足更苛刻的要求,可以用下面的命令说明:(1) 返回值中,x 是极小值点。
第3章 无约束最优化方法 3-1 最速下降法 3-2 牛顿法

1
u f ( x)u m u
T 2
2
u R
n
则从任意的初始点 x 0 出发,阻尼牛顿法产 生的迭代点列 满足: (1)当 x k 为有穷点列时,其最后一个点 为 f ( x) 的唯一极小点。 (2)当 x k 为无穷点列时,收敛到 f ( x) 的
第3.2节 Newton法及其改进
第3.1节 最速下降法(Steepest Method)
对于最速下降法的几点说明 (1)第2.6节中介绍的关于下降算法的收敛 性定理对最速下降法都是成立的 。 (2)目标函数在负梯度方向下降得最快只 是局部性质。 (3)锯齿现象 (4)改进策略:在计算的开始阶段使用最 速下降法,在迭代数次后,改用其他算法。
本节的主要内容:
(1)牛顿法的基本思想
(2)阻尼牛顿法
(3)带保护措施的阻尼牛顿法
(4)吉尔-默里稳定牛顿法
(5)信赖域方法(一)
第3.2节 Newton法及其改进
(1)牛顿法的基本思想: * 在目标函数f ( x)的极小点 x 的近似点 x k 附近将 f ( x) 二阶Tayler展开,用展开的二次 函数去逼近 f ( x),将这个二次函数的极小点 * x 作为 的一个新的近似点 x k 1 ,依次下去, 用一系列二次函数的极小点 xk 1 去逼近 f ( x) 的极小点 x * 。
第3.2节 Newton法及其改进
设 f ( x)二次连续可微,则 f ( x) 在 x k 处的二次 近似为: 1 T f ( x) qk ( x) f ( xk ) f ( xk ) ( x xk ) ( x xk )T 2 f ( xk )( x xk ) 2 令
无约束常用优化方法

步长 ,作前进(或后退)试探.如试探成功(目
标函数值有所减小),则按步长序列
,加
大步长(注意每次加大步长都是由初始点算起),直
至试探失败(目标函数值比前一次的有所增加)时,
则取其前一次的步长作为沿这个坐标轴方向搜索的最
优步长,并计算出该方向上的终止点,而后以这个终
止点为始点再进行下一坐标轴方向的搜索,并重复上
处
显然 是二次函数,并且还是正定二次函数,所以 是凸函数且存在唯一全局极小点.为求此极小点,令
即可解得
即
(5.9)
对照基本迭代公式,易知,式(5.9)中的搜索方向
步长因子
方向
是直指点 处近似二次函数
的极小点的方向.此时称此方向为从点 出发的
Newton方向.从初始点开始,每一轮从当前迭代点出发,
沿Newton方向并取步长 的算法称为Newton法.
另外,共轭梯度法不要求精确的直线搜 索.但是,不精确的直线搜索可能导致迭代 出来的向量不再共轭,从而降低方法的效 能.克服的办法是,重设初始点,即把经过 n次迭代得到的Xn作为初始点重新迭代.
五、坐标轮换法
在坐标轮换法中,沿各个坐标轴方向进行一维搜索
时,常选用最优步长法或加速步长法.加速步长法从
初始点出发,沿搜索(坐标轴)方向先取一个较小的
三、共轭方向法
1、概念
通常,我们把从任意点
出发,依次沿某组共轭
方向进行一维搜索的求解最优化问题的方法,叫做共
轭方向法.
2、特点
• 一般地,在n维空间中可以找出n个互相共轭的方向,对于n元正 定二次函数,从任意初始点出发,顺次沿这n个共轭方向最多作n 次直线搜索就可以求得目标函数的极小点.这就是共轭方向法的 算法形成的基本思想.
凸优化之无约束优化(一维搜索方法:二分法、牛顿法、割线法)

凸优化之⽆约束优化(⼀维搜索⽅法:⼆分法、⽜顿法、割线法)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,这⽐黄⾦分割法和斐波那契数列法的总压缩⽐要⼩。
1 #ifndef _BINARYSECTION_H_2#define _BINARYSECTION_H_34 typedef float (* PtrOneVarFunc)(float x);5void BinarySectionMethod(float a, float b, PtrOneVarFunc fi, float epsilon);67#endif1 #include<iostream>2 #include<cmath>3 #include "BinarySection.h"45using namespace std;67void BinarySectionMethod(float a, float b, PtrOneVarFunc tangent, float epsilon)8 {9float a0,b0,middle;10int k;11 k = 1;12 a0 = a;13 b0 = b;14 middle = ( a0 + b0 )/2;1516while( abs(tangent(middle)) - epsilon > 0 )17 {18 #ifdef _DEBUG19 cout<<k++<<"th iteration:x="<<middle<<",f'("<<middle<<")="<<tangent(middle)<<endl;20#endif2122if( tangent(middle) > 0)23 {24 b0 = middle;25 }26else27 {28 a0 = middle;29 }30 middle =( a0+b0)/2;31 }3233 cout<<k<<"th iteration:x="<<middle<<",f'("<<middle<<")="<<tangent(middle)<<endl;34 }1 #include<iostream>2 #include "BinarySection.h"345float TangentFunctionofOneVariable(float x)6 {7return14*x-5;//7*x*x-5*x+2;8 }910int main()11 {12 BinarySectionMethod(-50, 50, TangentFunctionofOneVariable, 0.001);13return0;14 }1th iteration:x=0,f'(0)=-52th iteration:x=25,f'(25)=3453th iteration:x=12.5,f'(12.5)=1704th iteration:x=6.25,f'(6.25)=82.55th iteration:x=3.125,f'(3.125)=38.756th iteration:x=1.5625,f'(1.5625)=16.8757th iteration:x=0.78125,f'(0.78125)=5.93758th iteration:x=0.390625,f'(0.390625)=0.468759th iteration:x=0.195312,f'(0.195312)=-2.2656210th iteration:x=0.292969,f'(0.292969)=-0.89843811th iteration:x=0.341797,f'(0.341797)=-0.21484412th iteration:x=0.366211,f'(0.366211)=0.12695313th iteration:x=0.354004,f'(0.354004)=-0.043945314th iteration:x=0.360107,f'(0.360107)=0.041503915th iteration:x=0.357056,f'(0.357056)=-0.001220716th iteration:x=0.358582,f'(0.358582)=0.020141617th iteration:x=0.357819,f'(0.357819)=0.0094604518th iteration:x=0.357437,f'(0.357437)=0.0041198719th iteration:x=0.357246,f'(0.357246)=0.0014495820th iteration:x=0.357151,f'(0.357151)=0.0001144412、⽜顿法(⼆阶导)前提:f 在 [a0,b0] 为单峰函数,且[a0,b0] 在极⼩点附近,不能离的太远否则可能⽆法收敛。
最优化方法第六讲 无约束(多维)最优化

step4. 若 || f ( xk1) || ,停止,x* xk1 ;
否则,令 k : k 1, 转step 2 。
14
➢算法框图
给定初始点x0和精度 || f ( x0 ) ||
停止,输出x1
否
是
| x1 x0 |
是 停止,输出x0
否 否
2 f (x0) 0
计算x1
x0
f ( x0 ) 2 f (x0)
1
13 62
x2
x1
1d 1
(
36 , 31
8 31
)T
7
三、最速下降法的特点
1.性质. 设 f ( x) 有一阶连续偏导数,若 步长 满足 k
f ( xk d k ) min f ( xk d k )
k
则有 f ( xk d k )T d k 0。 k
证明:令 ( ) f ( xk d k ),所以
5
一、梯度法(最速下降法):
1. 搜索方向:d k f ( xk ) ,也称为最速下降方向;
2. 搜 索 步 长: k 取 最 优 步 长, 即 满 足
f (xk
kd k )
min
f
(xk
d k ) 。
二、梯度法算法步骤:
1. 给定初始点 x1 Rn ,允许误差 0, 令k 1。
2. 计算搜索方向 d k f ( xk ) ;
Step3. 令 xk 1 xk kd k , 其中tk : f ( xk kd k ) min f ( xk d k )。
24
Step 4. 判断 xk 1 是否满足终止准则: yes: 计算 stop, 则x* : xk1
No : 转 step 5 。
运筹学第16讲 无约束最优化方法 (2)

k=k+1 d(k)=-H(k) ▽ f(x(k)) 一维搜索得λk x(k+1)=x(k)+ λk d(k)
修正H(k)产生H(k+1)
N
||x(k+1)-x(k)||<
ε?
y
Stop. x(k+1)----解
第五章4 变尺度法
下面构造H(k) ,要求H(k) 是▽2f(x(k))的近似且能逐次迭
第五章 2 Newton法
二、 Newton法的改进: (1)为减小工作量,取m(正整数),使每m次迭代使用同一个 Hesse阵,迭代公式变为: x(km+j+1)=x(km+j)-[▽2f(x(km))]-1 ▽f(x(km+j)) j=0,1,2, …,m-1 , k=0,1,2, … 特点:收敛速度随m的增大而下降 m=1时即Newton法, m→∞ 即线性收敛。 (2)带线性搜索的Newton法: 在Newton迭代中,取d(k)= -[▽2f(x(k)) ]-1 ▽f(x(k)) , 加入线性搜索:min f(x(k)+λk d(k)) 求得λk , x(k+1)=x(k)+λkd(k) 特点:可改善局部收敛性,当d(k)为函数上升方向时,可向负方 向搜索,但可能出现± d(k)均非下降方向的情况。
第五章4 变尺度法
二、DFP法: (续)
令修正公式为 ( 秩 2 公式 )。满足拟 则 H = H + α UU Newton 条件
T
+ β VV
T
u,v ∈ R n
S = H y.
S = Hy + α ( u T y ) u + β ( v T y ) v v = Hy 1 ST y ,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无约束优化方法---鲍威尔方法本实验用鲍威尔方法求函数f(x)=(x1-5)2+(x2-6)2 的最优解。
一、简述鲍威尔法的基本原理从任选的初始点x⑴o出发,先按坐标轮换法的搜索方向依次沿e1.e2.e3进行一维搜索,得各自方向的一维极小点x⑴ x⑵ x⑶.连接初始点xo⑴和最末一个一维极小点x3⑴,产生一个新的矢量 S1=x3⑴-xo⑴再沿此方向作一维搜索,得该方向上的一维极小点x⑴.从xo⑴出发知道获得x⑴点的搜索过程称为一环。
S1是该环中产生的一个新方向,称为新生方向。
接着,以第一环迭代的终点x⑴作为第二环迭代的起点xo⑵,即 Xo⑵←x⑴弃去第一环方向组中的第一个方向e1,将第一环新生方向S1补在最后,构成第二环的基本搜索方向组e2,e3,S1,依次沿这些方向求得一维极小点x1⑵,x2⑵,x3⑵.连接Xo⑵与x3⑵,又得第二环的新生方向S2=x3⑵-xo⑵沿S2作一维搜索所得的极小点x⑵即为第二环的最终迭代点二、鲍威尔法的程序#include "stdafx.h" /* 文件包含*/#include <math.h>#include <stdio.h>#include <stdlib.h>#define MAXN 10#define sqr(x) ((x)*(x))double xkk[MAXN],xk[MAXN],sk[MAXN];int N,type,nt,et; //N--变量个数,type=0,1,2,3 nt,et--不等式、等式约束个数double rk;double funt(double *x,double *g,double *h){g[0]=x[0]; g[1]=x[1]-1; g[2]=11-x[0]-x[1];return sqr(x[0]-8)+sqr(x[1]-8);}double F(double *x){double f1,f2,ff,fx,g[MAXN],h[MAXN];int i;fx=funt(x,g,h);f1=f2=0.0;if(type==0 || type==2)for(i=0; i<nt; i++) f1+=(fabs(g[i])>1.0e-15)?1.0/g[i]:1.0e15;else for(i=0; i<nt; i++) f1+=(g[i]>0)?0:g[i]*g[i];for(i=0; i<et; i++) f2+=h[i]*h[i];if(type==0 || type==2)ff=fx+rk*f1+f2/sqrt(rk);else ff=fx+rk*(f1+f2);return ff;}double f(double x){int i;for (i=0; i<N; i++) xkk[i]=xk[i]+x*sk[i];return F(xkk);}void find_ab(double x0,double h0,double *a,double *b) {double h,x1,y1,x2,y2,x3,y3;h=h0;x1=x0; y1=f(x1); x2=x1+h; y2=f(x2);if (y2>=y1) {h=-h0; x3=x1; y3=y1;x1=x2; y1=y2; x2=x3; y2=y3;}for (;;) {h*=2.0; x3=x2+h; y3=f(x3);if (y2<y3) break;x1=x2; y1=y2; x2=x3; y2=y3;}if (h>0) {*a=x1; *b=x3;}else {*a=x3; *b=x1;}}void search_gold(double a,double b,double e,double *x,double *y) {double x1,x2,y1,y2;x1=a+0.382*(b-a); y1=f(x1);x2=a+0.618*(b-a); y2=f(x2);do {if (y1<y2) {b=x2; x2=x1; y2=y1;x1=a+0.382*(b-a); y1=f(x1);} else {a=x1; x1=x2; y1=y2;x2=a+0.618*(b-a); y2=f(x2);}} while ((b-a)>e);*x=0.5*(a+b); *y=f(*x);}double nc_powell(double *x0,double e1,double e2){int i,j,k=1,m;double a,b,ax,ay,d;doubless[MAXN][MAXN],s1[MAXN],ff[MAXN],x[MAXN],xn[MAXN],xn 1[MAXN],f0,f1,f2,f3;for (i=0; i<N; i++) for (j=0; j<N; j++) if (j==i) ss[i][j]=1; else ss[i][j]=0;for (;;) {for (j=0; j<N; j++) xk[j]=x0[j];for (i=0; i<N; i++) {for (j=0; j<N; j++) sk[j]=ss[i][j];find_ab(0,1,&a,&b);search_gold(a,b,e2,&ax,&ay);for (j=0; j<N; j++) xk[j]=xkk[j];ff[i]=F(xk);}for (j=0; j<N; j++) xn[j] = xkk[j];for (j=0; j<N; j++) { sk[j]=xkk[j]-x0[j]; s1[j]=sk[j];}find_ab(0,1,&a,&b);search_gold(a,b,e2,&ax,&ay);for (j=0; j<N; j++) x[j]=xkk[j];d=0;for (j=0; j<N; j++) d+=(x[j]-x0[j])*(x[j]-x0[j]);d=sqrt(d);printf("k=%d;",k);for (j=0; j<N; j++) printf("x[%d]=%lf;",j+1,x0[j]);printf("d=%lf\n",d);if (d<=e1) {for (j=0; j<N; j++) x0[j]=x[j];break;}f0=F(x0);d=f0-ff[0]; m=0;for (j=1; j<N; j++) if (d<ff[j-1]-ff[j]) {m=j; d=ff[j-1]-ff[j];} for (j=0; j<N; j++) xn1[j]=2*xn[j]-x0[j];f1=F(x0); f2=F(xn); f3=F(xn1);if (0.5*(f1-2*f2+f3)>=d) {if (f2<f3) for (j=0; j<N; j++) x0[j]=xn[j];else for (j=0; j<N; j++) x0[j]=xn1[j];} else {for (i=m+1; i<N; i++) for (j=0; j<N; j++) ss[i-1][j]=ss[i][j];for (j=0; j<N; j++) ss[N-1][j]=s1[j];for (j=0; j<N; j++) x0[j]=x[j];}k++;}for (j=0; j<N; j++) x0[j]=xkk[j];return F(xkk);}main(){double fk,fkk,ck,d1,d2,e1,e2;double g[MAXN],h[MAXN],x1[MAXN],x0[MAXN];int i;N=2;nt=3;et=0;type=1;e1=0.0001;e2=0.0001;rk=0.001; ck=2;x0[0]=8; x0[1]=8;printf("=========\n");fk = nc_powell(x0,0.01,0.001);for(i=0; i<N; i++) x1[i]=x0[i];printf("rk=%lf\n",rk);for (i=0; i<N; i++) printf("x[%d]=%lf;",i+1,x0[i]);printf("%lf\n",fk);for(;;) {rk*=ck;fkk = nc_powell(x0,0.01,0.005);printf("rk=%lf\n",rk);for (i=0; i<N; i++) printf("x[%d]=%lf;",i+1,x0[i]); printf("%lf\n",fkk);d1=0; for(i=0; i<N; i++) d1+=(x1[i]-x0[i])*(x1[i]-x0[i]); d1=sqrt(d1);d2=fabs((fkk-fk)/fk);printf("d1=%lf d2=%lf\n",d1,d2);if(d1<=e1 || d2<=e2) break;for(i=0; i<N; i++) x1[i]=x0[i];fk=fkk;}fk=funt(x0,g,h);printf("**********************\n");for (i=0; i<N; i++) printf("x[%d]=%lf;",i+1,x0[i]);printf("F* = %lf\n",fk);for (i=0; i<nt; i++) printf("g[%d]=%lf;",i+1,g [i]); return 1;}。