共轭梯度法求极小值
最优化方法-共轭方向和共轭梯度法

由3式可以看出
2020/3/6
16
2.共轭方向-共轭方向法
• 基本定义
利用共轭方向作为搜索方向的无约束极小化算法
• 通用步骤:
(1)任取X 0 ,以及在X 0的下降方向P0 , k 0; (1)求解一维搜索问题
min f ( X k Pk ),为最优步长,是个数值.
(3) X k1 X k k Pk ;
X
T QX
bT
X
c, Q正定,
X 0是初始点,
P0
f
(X0)
X k1 X k k Pk , k 0,1...m 1, k是最优步长,且
Pk1 f ( X k1) ak Pk (这是构造的结果)
其中ak
f
( X k1)T QPk PkT QPk
,
P0
(
X
)T
k 1
Pk
)T
PkT f ( X k1)
f ( X k1) QX k1 b Q( X k k Pk ) b, ( X k 1 X k k Pk )
f ( X k1) (QX k b) kQPk f ( X k ) kQPk
当m 2时 所以,P0,P1, Pm1是线性无关的。
P0T QP1
P0T Q f ( X 1 )
f ( X 1 )T QP0 P0T QP0
P0
P0T Qf ( X 1 ) f ( X 1 )T QP0 0
表明,P0与P1共轭。
2020/3/6
2020/3/6
4
1.共轭方向法的基本原理
• 已知 X1 点是在 X 0 点在直线 l0 上沿 P0 搜索方向的一个极小 点。(l0 与 P0 是平行的)
目标函数的几种极值求解方法

目标函数极值求解的几种方法题目:()()2221122min -+-x x,取初始点()()Tx 3,11=,分别用最速下降法,牛顿法,共轭梯度法编程实现。
一维搜索法:迭代下降算法大都具有一个共同点,这就是得到点()k x 后需要按某种规则确定一个方向()k d ,再从()k x 出发,沿方向()k d 在直线(或射线)上求目标函数的极小点,从而得到()k x 的后继点()1+k x ,重复以上做法,直至求得问题的解,这里所谓求目标函数在直线上的极小点,称为一维搜索。
一维搜索的方法很多,归纳起来大体可以分为两类,一类是试探法:采用这类方法,需要按某种方式找试探点,通过一系列的试探点来确定极小点。
另一类是函数逼近法或插值法:这类方法是用某种较简单的曲线逼近本来的函数曲线,通过求逼近函数的极小点来估计目标函数的极小点。
本文采用的是第一类试探法中的黄金分割法。
原理书上有详细叙述,在这里介绍一下实现过程:⑴ 置初始区间[11,b a ]及精度要求L>0,计算试探点1λ和1μ,计算函数值()1λf 和()1μf ,计算公式是:()1111382.0a b a -+=λ,()1111618.0a b a -+=μ。
令k=1。
⑵ 若L a b k k <-则停止计算。
否则,当()K f λ>()k f μ时,转步骤⑶;当()K f λ≤()k f μ时,转步骤⑷ 。
⑶ 置k k a λ=+1,k k b b =+1,k k μλ=+1,()1111618.0++++-+=k k k k a b a μ,计算函数值()1+k f μ,转⑸。
⑷ 置k k a a =+1,k k b μ=+1,k k μμ=+1,()1111382.0++++-+=k k k k a b a λ,计算函数值()1+k f λ,转⑸。
⑸ 置k=k+1返回步骤 ⑵。
1. 最速下降法实现原理描述:在求目标函数极小值问题时,总希望从一点出发,选择一个目标函数值下降最快的方向,以利于尽快达到极小点,正是基于这样一种愿望提出的最速下降法,并且经过一系列理论推导研究可知,负梯度方向为最速下降方向。
2.3_共轭斜量法

另证
[ proof ] 由于 ( x)的梯度 ( x) ( x) ( x) ( x ) , , , Ax b x2 xn x1 且 ( x)的Hessian矩阵为 2 ( x) 2 H ( x) A xi x j 而A正定, 故 ( x)的驻点(梯度的零点)必为 ( x)的极小值点反之亦然 . .
对一切x R n , 有 1 1 ( x ) ( x ) ( Ax , x ) (b, x ) ( Ax * , x * ) 2 2 1 1 * ( Ax , x ) ( Ax , x ) ( Ax * , x * ) 2 2 1 ( A( x x * ), x x * ) (5) 2
1 ( Ax ( k ) , x ( k ) ) ( b, x ( k ) ) ( Ax ( k ) , p( k ) ) (b, p( k ) ) 2
2
2
( Ap( k ) , p( k ) )
( x ( k ) ) ( Ax ( k ) b, p( k ) ) ( x ( k ) ) ( r ( k ) , p( k ) )
1 2 4 例:设 A = , b 2 6 10 1 2 2 ( x) = ( x1 6 x2 4 x1 x2 ) (4 x1 10 x2 ) 2
有如下性质:
n 1 n n (x) aij xi x j bi xi 2 i 1 j 1 i 1
x*
最速下降算法: x (0) R n , k 0,1, 2, r
(k )
function [x,n]=zuisu(a,b,x,eta,N)
最优化方法实验报告(2)

最优化方法实验报告Numerical Linear Algebra And ItsApplications学生所在学院:理学院学生所在班级:计算数学10-1学生姓名:甘纯指导教师:单锐教务处2013年5月实验三实验名称:无约束最优化方法的MATLAB实现实验时间: 2013年05月10日星期三实验成绩:一、实验目的:通过本次实验的学习,进一步熟悉掌握使用MATLAB软件,并能利用该软件进行无约束最优化方法的计算。
二、实验背景:(一)最速下降法1、算法原理最速下降法的搜索方向是目标函数的负梯度方向,最速下降法从目标函数的负梯度方向一直前进,直到到达目标函数的最低点。
2、算法步骤用最速下降法求无约束问题n R()min的算法步骤如下:xxf,a )给定初始点)0(x ,精度0>ε,并令k=0;b )计算搜索方向)()()(k k x f v -∇=,其中)()(k x f ∇表示函数)(x f 在点)(k x 处的梯度;c )若ε≤)(k v ,则停止计算;否则,从)(k x 出发,沿)(k v 进行一维搜索,即求k λ,使得)(min )()()(0)()(k k k k v x f v x f λλλ+=+≥; d )令1,)()()1(+=+=+k k v x x k k k k λ,转b )。
(二)牛顿法1、算法原理牛顿法是基于多元函数的泰勒展开而来的,它将)()]([-)(1)(2k k x f x f ∇∇-作为搜索方向,因此它的迭代公式可直接写出来:)()]([)(1)(2)()(k k k k x f x f x x ∇∇-=-2、算法步骤用牛顿法求无约束问题n R x x f ∈),(min 的算法步骤如下:a )给定初始点)0(x ,精度0>ε,并令k=0;b )若ε≤∇)()(k x f ,停止,极小点为)(k x ,否则转c );c )计算)()]([,)]([)(1)(2)(1)(2k k k k x f x f p x f ∇∇-=∇--令;d )令1,)()()1(+=+=+k k p x x k k k ,转b )。
共轭梯度法简介

算法步骤—FR共轭梯度法 算法步骤 FR共轭梯度法 FR
共轭梯度法
Step1: Step2: Step3: Step4: Step5: Step6: Step7:
共轭梯度法
举例
参见 P187 例7.3.1.
共轭梯度法
收敛性分析
与Newton法相比,共轭梯度 法相比, 法相比 全局收敛性 法具有较弱的收敛条件. 法具有较弱的收敛条件
共轭方向法和共轭梯度法
问题1: 问题 如何建立有效的算法? 如何建立有效的算法? 从二次模型到一般模型. 从二次模型到一般模型
问题2: 什么Leabharlann 的算法有效呢? 什么样的算法有效呢? 问题 二次终止性. 二次终止性
简介
共轭方向法和共轭梯度法
共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导 共轭梯度法是介于最速下降法与牛顿法之间的一个方法, 数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储 数信息,但克服了最速下降法收敛慢的缺点, 和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组 和计算Hesse矩阵并求逆的缺点, Hesse矩阵并求逆的缺点 最有用的方法之一,也是解大型非线性最优化最有效的算法之一. 最有用的方法之一,也是解大型非线性最优化最有效的算法之一.
共轭方向法和共轭梯度法
特点 (1) 建立在二次模型上,具有二次终止性. 建立在二次模型上,具有二次终止性. (2) 一种有效的算法,克服了最速下降法的锯齿现象, 一种有效的算法,克服了最速下降法的锯齿现象 锯齿现象, 又避免了牛顿法的计算量大和局部收敛性的缺点. 又避免了牛顿法的计算量大和局部收敛性的缺点. (3) 算法简单,易于编程,无需计算二阶导数,存储 算法简单,易于编程,无需计算二阶导数, 空间小等优点, 空间小等优点,是求解中等规模优化问题的主要 方法. 方法.
利用共轭梯度算法求解n元正定二次函数的极小点

利用共轭梯度算法求解n元正定二次函数的极小点我利用共轭梯度算法来解决n元正定二次函数的极小点问题,并通过一个简单的函数模型来测试基于该算法的程序的正确性。
通过分析该算法后,我采用matlab7.0中的设计语言来编写程序。
matlab是集数学计算、图形处理和程序设计与以设计与一体的著名数学软件,在许多科学领域成为计算机辅助设计和分析、算法研究和应用开发的基本工具和首选平台。
一.算法条件及特点:适宜条件:无约束n元正定二次函数f(x)=1txax+bt+c2n式中a为n⨯n对称正定阵;x,b∈e;c为常数。
算法特点:未知p(i)(i=0,...,n-1)关于a共轭,以出任给x(0)启程,依次以p(0),p(1),...,p(n-1)为搜索方向的下述算法:minf(x(k)+λp(k))=f(x(k)+λkp(k))λ(k+1)(k)(k)x,k=0,1,...,n-1=x+λkp二.算法步骤:(1)选择初始值近似x(0)(0)p=-∇f(x)(0),得出容许误差ε>0,k=0。
并用x(1)=x(0)+λ0p(0)∇f(x(0))tp(0)(1)和λ0=-算出x。
(0)t(0)(p)ap(k)(3)通常地,假设已得出结论x(4)||f(x(k+1)和p(k),则可计算第k+1次近似x(k+1):(k+1)(k)(k)=x+λkpλk:minf(x(k)+λp(k)))||2≤ε,停止计算,x(k+1)即为要求的近似解。
p(k+1)=-∇f(x(k)(k))+βkp∇f(x(k+1))t∇f(x(k+1))βk=∇f(x(k))t∇f(x(k))k=k+1计算出βk和p(k+1),并转向第三步。
三.详尽算法中变量表明:gradf:函数的梯度。
e:终止条件ε四.模型解:已知一个二维正定二次函数f(x)=3212x1+x2-x1x2-2x1221312-x1x2-2x1化为f(x)=xtax+bt+c形式,得∙将f(x)=x12+x2222a=⎛3-1⎛⎛-2⎛⎛⎛,b=⎛⎛⎛-11⎛⎛0⎛∙初始条件x(0)⎛-2⎛=4⎛⎛,ε=0。
共轭梯度法

•基本思想:把共轭性与最速下降法相结合,利用已 知点处的梯度构造一组共轭方向,并沿着这组方 向进行搜索,求出目标函数的极小点
4.4共轭梯度法
先讨论对于二次凸函数的共轭梯度法,考虑问题
min f (x) 1 xT Ax bT x c
3, giT d (i) giT gi (蕴涵d (i) 0)
证明: 显然m1,下用归纳法(对i)证之.
当i 1时,由于d (1) g1,从而3)成立,对i 2时, 关系1)和2)成立,从而3)也成立.
4.4共轭梯度法
设对某个i<m,这些关系均成立,我们证明对于i+1
也成立.先证2),
因此
2 / 3 1 5/ 9
d (2)
1/ 1
3
1 9
2 0
5/9 1
从x(2)出发,沿方向d (2)进行搜索,求步长2,使满足 :
f
( x (1)
2d (1) )
min
0
f
(x(2)
d (2))
2 0
4.4共轭梯度法
显然, d (1)不是目标函数在x(1)处的最速下降方向.
下面,我们用FR法构造两个搜索方向.
从x(1)出发,沿方向d (1)进行搜索,求步长1,使满足 :
f
( x (1)
1d (1) )
min
0
f
( x (1)
d (1) )
得1 2 3
A正定,故x是f(x)的极小值点.
最优化问题的算法迭代格式

最优化问题的算法迭代格式最优化问题的算法迭代格式最优化问题是指在一定的条件下,寻找使某个目标函数取得极值(最大值或最小值)的变量取值。
解决最优化问题的方法有很多种,其中较为常见的是迭代法。
本文将介绍几种常用的最优化问题迭代算法及其格式。
一、梯度下降法梯度下降法是一种基于负梯度方向进行搜索的迭代算法,它通过不断地沿着目标函数的负梯度方向进行搜索,逐步接近极值点。
该方法具有收敛速度快、易于实现等优点,在许多应用领域中被广泛使用。
1. 算法描述对于目标函数 $f(x)$,初始点 $x_0$ 和学习率 $\alpha$,梯度下降算法可以描述为以下步骤:- 计算当前点 $x_k$ 的梯度 $\nabla f(x_k)$;- 更新当前点 $x_k$ 为 $x_{k+1}=x_k-\alpha\nabla f(x_k)$;- 如果满足停止条件,则输出结果;否则返回第 1 步。
2. 算法特点- 沿着负梯度方向进行搜索,能够快速收敛;- 学习率的选择对算法效果有重要影响;- 可能会陷入局部极小值。
二、共轭梯度法共轭梯度法是一种基于线性方程组求解的迭代算法,它通过不断地搜索与当前搜索方向共轭的新搜索方向,并在该方向上进行一维搜索,逐步接近极值点。
该方法具有收敛速度快、内存占用少等优点,在大规模问题中被广泛使用。
1. 算法描述对于目标函数 $f(x)$,初始点 $x_0$ 和初始搜索方向 $d_0$,共轭梯度算法可以描述为以下步骤:- 计算当前点 $x_k$ 的梯度 $\nabla f(x_k)$;- 如果满足停止条件,则输出结果;否则进行下一步;- 计算当前搜索方向 $d_k$;- 在当前搜索方向上进行一维搜索,得到最优步长 $\alpha_k$;- 更新当前点为 $x_{k+1}=x_k+\alpha_k d_k$;- 计算新的搜索方向 $d_{k+1}$;- 返回第 2 步。
2. 算法特点- 搜索方向与前面所有搜索方向都正交,能够快速收敛;- 需要存储和计算大量中间变量,内存占用较大;- 可以用于非线性问题的求解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
应用共轭梯度法求解方程组121242
x x x x +=⎧⎨-=⎩的根。
初始值(0)(0,0)T x = 分析:将方程组Ax b =转化为优化问题中的极值问题然后应用共轭梯度法进行求解。
令()R x Ax b =-,只需求得x ,使得()R x 取得最小值。
则有: min ()R x ⇔2min ()R x min T R R ⇔
()()
()()
()()()()2T T T T T T T T T T T T T T T T T T T T T T T T T T R R Ax b Ax b X A b Ax b X A AX X A b b Ax b b
X A AX X A b b Ax b b
X A A X b AX b Ax b b
X A A X b AX b b
=--=--=--+=--+=--+=-+这是一个数 与1()2
T T f x x Gx b x c =++比较 则有:2,()22T T T G A A g x A A A b ==- 回到题目问题中,则对应有124124012,,04444x G g b x --⎛⎫⎛⎫⎛⎫=== ⎪ ⎪ ⎪--⎝⎭⎝⎭⎝⎭
也就是应用共轭梯度法求点使221212()2212420f x x x x x =+--+取得最小值。
程序清单:
#include <stdio.h>
#include <math.h>
double a,b,s[2]; /*全局变量*/
double E=1e-6;
double F(double x1,double x2)
{
double y;
y=2*x1*x1+2*x2*x2-12*x1-4*x2+20;
return (y);
}
void qujian(double x1,double x2) /*用前进后退法求a 的探索区间*/ {
double a0=0,h=1,a1,a2,f1,f2,X1,X2,X3,X4;
a1=a0;a2=a0+h;
X1=x1+a1*s[0];
X2=x2+a1*s[1];
f1=F(X1,X2);
X3=x1+a2*s[0];
X4=x2+a2*s[1];
f2=F(X3,X4);
if (f1>f2)
{
while(1)
{
h=h*2;
a2=a2+h;
f1=f2;
X3=x1+a2*s[0];
X4=x2+a2*s[1];
f2=F(X3,X4);
if (f1>f2) {a1=a2-h;}
else{a=a1;b=a2;break;}
}
}
else
{
h=-h/4;
while(1)
{
a1=a1+h;
f2=f1;
X1=x1+a1*s[0];
X2=x2+a1*s[1];
f1=F(X1,X2);
if(f1<f2) {a2=a1-h;h=2*h;}
else{a=a1;b=a2;break;}
}
}
}
double MIN(double x1,double x2) /*二次插值法求a的最小值*/ {
double x01,x02,x03,x0,xmin;
double f1,f2,f3,f;
double X1,X2,X3,X4,X5,X6,X7,X8;
double h=(b-a)/2;
double k1,k2;
x01=a;x02=a+h;x03=b;
X1=x1+x01*s[0];
X2=x2+x01*s[1];
X3=x1+x02*s[0];
X4=x2+x02*s[1];
X5=x1+x03*s[0];
X6=x2+x03*s[1];
f1=F(X1,X2);
f2=F(X3,X4);
f3=F(X5,X6);
while (1)
{
k1=(f3-f1)/(x03-x01);
k2=((f2-f1)/(x02-x01)-k1)/(x02-x03);
x0=(x01+x03-k1/k2)/2;
X7=x1+x0*s[0];
X8=x2+x0*s[1];
f=F(X7,X8);
if(fabs(x0-x02)<=E)
{
xmin=x0;break;
}
else if(x02<x0)
{
if(f2<f)
{x03=x0;f3=f;}
else
{x01=x02;f1=f2;x02=x0;f2=f;}
}
else
{
if(f2<f)
{x01=x0;f1=f;}
else
{x03=x02;f3=f2;x02=x0;f2=f;}
}
}
return(xmin);
}
void main()
{
double g[3],m1,m2,b;
int n=2,k=0;
double x1=0,x2=0; /*起始点*/
g[1]=4*x1-12;
g[2]=4*x2-4;
m1=g[1]*g[1]+g[2]*g[2];
s[0]=-g[1];
s[1]=-g[2];
while(1)
{
qujian(x1,x2);
a=MIN(x1,x2); /*求a的探索区间*/
x1=x1+a*s[0];
x2=x2+a*s[1];
g[1]=4*x1-12;
m2=g[1]*g[1]+g[2]*g[2];
if(sqrt(g[1]*g[1]+g[2]*g[2])<=E)
break;
if(k+1==n)
{g[1]=4*x1-12;g[2]=4*x2-4;s[0]=-g[1];s[1]=-g[2];}
else
{b=m2/m1;s[0]=-g[1]+b*s[0];s[1]=-g[2]+b*s[1];k=k+1;}
printf("最优解:\n X1=%f\n X2=%f\n",x1,x2);
}
}
运行结果:
最优解:
X1=3.000000
X2=1.000000。