共轭梯度法求极小值
- 格式:doc
- 大小:59.50 KB
- 文档页数:4
目标函数极值求解的几种方法题目:()()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. 最速下降法实现原理描述:在求目标函数极小值问题时,总希望从一点出发,选择一个目标函数值下降最快的方向,以利于尽快达到极小点,正是基于这样一种愿望提出的最速下降法,并且经过一系列理论推导研究可知,负梯度方向为最速下降方向。
最优化方法实验报告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 )。
利用共轭梯度算法求解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。
最优化问题的算法迭代格式最优化问题的算法迭代格式最优化问题是指在一定的条件下,寻找使某个目标函数取得极值(最大值或最小值)的变量取值。
解决最优化问题的方法有很多种,其中较为常见的是迭代法。
本文将介绍几种常用的最优化问题迭代算法及其格式。
一、梯度下降法梯度下降法是一种基于负梯度方向进行搜索的迭代算法,它通过不断地沿着目标函数的负梯度方向进行搜索,逐步接近极值点。
该方法具有收敛速度快、易于实现等优点,在许多应用领域中被广泛使用。
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. 算法特点- 搜索方向与前面所有搜索方向都正交,能够快速收敛;- 需要存储和计算大量中间变量,内存占用较大;- 可以用于非线性问题的求解。
应用共轭梯度法求解方程组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。