MATLAB实现最速下降法_和牛顿法和共轭梯度法

MATLAB实现最速下降法_和牛顿法和共轭梯度法
MATLAB实现最速下降法_和牛顿法和共轭梯度法

MATLAB实现最速下降法_和牛顿法和共轭梯度法最速下降法:

题目:f=(x-2)^2+(y-4)^2

M文件:

function [R,n]=steel(x0,y0,eps) syms x;

syms y;

f=(x-2)^2+(y-4)^2;

v=[x,y];

j=jacobian(f,v);

T=[subs(j(1),x,x0),subs(j(2),y,y0)]; temp=sqrt((T(1))^2+(T(2))^2); x1=x0;y1=y0;

n=0;

syms kk;

while (temp>eps)

d=-T;

f1=x1+kk*d(1);f2=y1+kk*d(2);

fT=[subs(j(1),x,f1),subs(j(2),y,f2)];

fun=sqrt((fT(1))^2+(fT(2))^2);

Mini=Gold(fun,0,1,0.00001);

x0=x1+Mini*d(1);y0=y1+Mini*d(2);

T=[subs(j(1),x,x0),subs(j(2),y,y0)];

temp=sqrt((T(1))^2+(T(2))^2);

x1=x0;y1=y0;

n=n+1;

end

R=[x0,y0]

调用黄金分割法:

M文件:

function Mini=Gold(f,a0,b0,eps) syms x;format long; syms kk;

u=a0+0.382*(b0-a0);

v=a0+0.618*(b0-a0);

k=0;

a=a0;b=b0;

array(k+1,1)=a;array(k+1,2)=b; while((b-a)/(b0-a0)>=eps) Fu=subs(f,kk,u);

Fv=subs(f,kk,v);

if(Fu<=Fv)

b=v;

v=u;

u=a+0.382*(b-a);

k=k+1;

elseif(Fu>Fv)

a=u;

u=v;

v=a+0.618*(b-a);

k=k+1;

end

array(k+1,1)=a;array(k+1,2)=b; end

Mini=(a+b)/2;

输入:

[R,n]=steel(0,1,0.0001)

R = 1.99999413667642 3.99999120501463 R = 1.99999413667642

3.99999120501463 n = 1

牛顿法:

题目:f=(x-2)^2+(y-4)^2

M文件:

syms x1 x2;

f=(x1-2)^2+(x2-4)^2;

v=[x1,x2];

df=jacobian(f,v);

df=df.';

G=jacobian(df,v);

epson=1e-12;x0=[0,0]';g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)});G1=subs (G,{x1,x2},{x0(1,1),x0(2,1)});k=0;mul_count=0;sum_count=0;

mul_count=mul_count+12;sum_count=sum_count+6; while(norm(g1)>epson) p=-G1\g1;

x0=x0+p;

g1=subs(df,{x1,x2},{x0(1,1),x0(2,1)});

G1=subs(G,{x1,x2},{x0(1,1),x0(2,1)});

k=k+1;

mul_count=mul_count+16;sum_count=sum_count+11;

end;

k

x0

mul_count

sum_count

结果::k = 1

x0 =

2

4

mul_count = 28

sum_count = 17 共轭梯度法:

题目:f=(x-2)^2+(y-4)^2

M文件:

function f=conjugate_grad_2d(x0,t)

x=x0;

syms xi yi a

f=(xi-2)^2+(yi-4)^2; fx=diff(f,xi);

fy=diff(f,yi);

fx=subs(fx,{xi,yi},x0); fy=subs(fy,{xi,yi},x0); fi=[fx,fy]; count=0;

while double(sqrt(fx^2+fy^2))>t

s=-fi;

if count<=0

s=-fi;

else

s=s1;

end

x=x+a*s;

f=subs(f,{xi,yi},x);

f1=diff(f);

f1=solve(f1);

if f1~=0

ai=double(f1);

else

break

x,f=subs(f,{xi,yi},x),count end

x=subs(x,a,ai);

f=xi-xi^2+2*xi*yi+yi^2;

fxi=diff(f,xi);

fyi=diff(f,yi);

fxi=subs(fxi,{xi,yi},x);

fyi=subs(fyi,{xi,yi},x);

fii=[fxi,fyi];

d=(fxi^2+fyi^2)/(fx^2+fy^2); s1=-fii+d*s;

count=count+1;

fx=fxi;

fy=fyi;

end

x,f=subs(f,{xi,yi},x),count 输入:conjugate_grad_2d([0,0],0.0001) 结果:

x = 0.24998825499785 -0.24999998741273

f = 0.12499999986176

count = 10

ans = 0.12499999986176

最新16梯度法和共轭梯度法基本原理和特点

16梯度法和共轭梯度法基本原理和特点

16梯度法和共轭梯度法基本原理和特点? 梯度法又称最速下降法,基本原理是在迭代点附近采用使目标函数值下降最快的负梯度方向作为搜索方向, 求目标函数的极小值,特 点;迭代计算简单,只需求一阶偏导数,所占的存储单 元少,对初始点的要求不 高,在接近极小点位置时收敛速度很慢,共轭的特点为 在梯度法靠近极值点收敛速度放慢时,它可以构造共轭方向使其收敛速度加快, 迭代计算比较简单,效果 好,在每一步迭代过程中都要构造共轭的、方向,比较繁琐。17迭代终止准则有哪三种? 1)当设计变量在相邻两点之间的移动距离充分小时,可用相邻两点的矢量差的模作为终止的判据, 2)当相邻两点目标函数值之差达到充分小时,可 用两次迭代的目标函数之 差作为终止判据。 3)当迭代点逼近极值点时,目标函数在该点的梯度已达到充分小时,可用梯度的模作为 终止判据。

18 .无约束设计法,1)powell法,它是在下降迭代过 运算中只需计算和比较目标函数值的大小,不需计算偏导数的方法,是较好的一种直接搜索 算法。 2)梯度法,又称最速下降法,它是采用使目标 函数值下降最快的负梯度方向作为搜索方向来求目标函数的极小值。 3)共轭梯度法,又称FR法,是利用目标函数的 梯度确定共轭方向,使得计算简便而效 果好,只需利用相邻两点的梯度就可以构造一个共轭方向,这种方式产生共轭方 向并进行迭代的算法称为 共轭梯度法。 4)变尺度法,又称DFP法,为了得到既有快速收敛的性质,又能避免计算二阶导数矩阵及逆矩阵,减少计算工作量。迭代公式X=X+aS, 19有约束设计法? 1)复合形法,在可行域中选取k个设计点作为 初始复合形的顶点,然后比较复合形个各项目标函数值的大小,其中目标函数值最大的点为坏点,以坏

数学实验“线性方程组的最速下降法与共轭梯度法解法”实验报告(内含matlab程序代码)

西京学院数学软件实验任务书

实验五实验报告 一、实验名称:最速下降法与共轭梯度法解线性方程组。 二、实验目的:进一步熟悉理解掌握最速下降法与共轭梯度法解法思路,提高matlab 编程能力。 三、实验要求:已知线性方程矩阵,应用最速下降与共轭梯度法在相关软件编程求解线性方程组的解。 四、实验原理: 1.最速下降法: 从某个初始点)0(X 出发,沿)(X f 在点)0(X 处的负梯度方向 )0()0()0()(AX b X f r -=-?= 求得)(X f 的极小值点)1(X , 即 )(min )0()0(0 r X f λλ+> 然后从)1(X 出发,重复上面的过程得到)2(X 。如此下去,得到序列{)(k X } )(...)()()()1()0(k X f X f X f >>> 可以证明,从任一初始点)0(X 出发, 用最速下降法所得到的序列{)(k X }均收敛于问题使X 最小化)(X f 的解,也就是方程组b AX =的解。其收敛速度取决于 1 1 λλλλ+-n n ,其中1λ ,n λ分别

为A 的最小,最大特征值。最速下降法迭代格式:给定初值)0(X , )(k X 按如下方法决定: ()) ()(1)(k )()()()(k ) ()(X ,,)(k k k k T k k T k k k k r X Ar r r r AX b X f r λλ+=> <><=-=-?=+ 2.共轭梯度法 其基本步骤是在点)(k X 处选取搜索方向)(k d , 使其与前一次的搜索方向)1(-k d 关于A 共轭,即 (1)()(1),0k k k d d Ad --<>= 然后从点)(k X 出发,沿方向)(k d 求得)(X f 的极小值点 )1(+k X , 即 )(min )() ()(0 )1(k d X f X f k k λλ+=>+ 如此下去, 得到序列{)(k X }。不难求得0,)1()(>=<-k k Ad d 的解为 ) () 1()1()()() () 1(,,k k k k k k k d Ad d d AX b X X > <>-<+=--+ 注意到)(k d 的选取不唯一,我们可取

用MATLAB实现共轭梯度法求解实例

用MATLAB 实现共轭梯度法求解实例 康福 1 一.无约束优化方法 1.1 无约束优化方法的必要性 一般机械优化设计问题,都是在一定的限制条件下追求某一指标为最小,它 们都属于约束优化问题。但是为什么要研究无约束优化问题? (1)有些实际问题,其数学模型本身就是一个无约束优化问题。 (2)通过熟悉它的解法可以为研究约束优化问题打下良好的基础。 (3)约束优化问题的求解可以通过一系列无约束优化方法来达到。所以无约束优 化问题的解法是优化设计方法的基本组成部分,也是优化方法的基础。 (4)对于多维无约束问题来说,古典极值理论中令一阶导数为零,但要求二阶可 微,且要判断海赛矩阵为正定才能求得极小点,这种方法有理论意义,但无 实用价值。和一维问题一样,若多元函数F(X)不可微,亦无法求解。但古典 极值理论是无约束优化方法发展的基础。 1.2共轭梯度法 目前已研究出很多种无约束优化方法,它们的主要不同点在于构造搜索方向 上的差别。 (1)间接法——要使用导数,如梯度法、(阻尼)牛顿法、变尺度法、共轭梯度 法等。 (2)直接法——不使用导数信息,如坐标轮换法、鲍威尔法单纯形法等。 用直接法寻找极小点时,不必求函数的导数,只要计算目标函数值。这类方 法较适用于解决变量个数较少的(n ≤20)问题,一般情况下比间接法效率低。间接法除要计算目标函数值外,还要计算目标函数的梯度,有的还要计算其海赛矩阵。 搜索方向的构成问题乃是无约束优化方法的关键。 共轭梯度法是沿着共轭方向进行搜索,属于共轭方向法中的一种,该方法中 每一个共轭向量都是依赖于迭代点处的负梯度而构造出来。共轭梯度法作为一种实用的迭代法,它主要有下面的优点: (1)算法中,系数矩阵A的作用仅仅是用来由已知向量P 产生向量W=AP ,这不仅 可充分利用A的稀疏性,而且对某些提供矩阵A较为困难而由已知向量P 产 生向量W=AP 又十分方便的应用问题是很有益的。 (2)不需要预先估计任何参数就可以计算,这一点不像SOR 等; (3)每次迭代所需的计算,主要是向量之间的运算,便于并行化。 共轭梯度法原理的知识较多,请详见《机械优化设计》第四章的第四、五节。 图1为共轭梯度法的程度框图 1(0,1,2,) k k k k s k α+=+=x x

最优化课程设计--共轭梯度法算法分析与实现

最优化课程设计--共轭梯度法算法分析与实现(设计程序) 题目共轭梯度法算法分析与实现 班级 / 学号 14140101/2011041401011 学生姓名黄中武指导教师王吉波王微微 课程设计任务书 课程名称最优化方法课程设计院(系) 理学院专业信息与计算科学 课程设计题目共轭梯度法算法分析与实现课程设计时间: 2014 年 6月 16日至 2014 年 6月 27日 课程设计的要求及内容: [要求] 1. 学习态度要认真,要积极参与课程设计,锻炼独立思考能力; 2. 严格遵守上机时间安排; 3. 按照MATLAB编程训练的任务要求来编写程序; 4. 根据任务书来完成课程设计论文; 5. 报告书写格式要求按照沈阳航空航天大学“课程设计报告撰写规范”; 6. 报告上交时间:课程设计结束时上交报告; 7. 严禁抄袭行为,一旦发现,课程设计成绩为不及格。 一、运用共轭梯度法求解无约束最优化问题 要求:1)了解求解无约束最优化问题的共轭梯度法; 2)绘出程序流程图; 3)编写求解无约束最优化问题的共轭梯度法MATLAB程序; 4)利用编写文件求解某无约束最优化问题;

5)给出程序注释。 指导教师年月日 负责教师年月日 学生签字年月日 沈阳航空航天大学 课程设计成绩评定单 课程名称最优化理论与算法课程设计院(系) 理学院专业信息与计算科学课程设计题目共轭梯度法算法分析与实现学号 2011041401011 姓名黄中武指导教师评语: 课程设计成绩 指导教师签字 年月日 最优化方法课程设计沈阳航空航天大学课程设计用纸目录 目录 一、正 文 (1) 二、总结 ............................................................... 8 参考文 献 ............................................................... 9 附录 .. (10) 第 I 页 最优化方法课程设计沈阳航空航天大学课程设计用纸正文 一、正文 一无约束最优化问题的共轭梯度法

(修改稿)一种新的修正DY共轭梯度法的全局收敛性

一种修正的DY 共轭梯度法的全局收敛性 敖卫斌 (重庆师范大学 数学学院,重庆 401331) 摘要:本文提出了一种新的非线性修正的DY 共轭梯度算法(MDYCG ),该算法得到的搜索方向为下降方向,它既不受线搜索规则的影响,也不受目标函数的凸性影响。在精确线搜索下,MDYCG 算法化归为标准的DY 共轭梯度算法。证明了该方法在Armijo 型线搜索下的全局收敛性,给出了初步的数值结果。 关键词:无约束优化;共轭梯度法;Armijo 型线搜索;全局收敛性 中图分类号:0182.1 1. 引言 考虑无约束优化问题: min (),,n f x x R ∈ (1) 其中:n f R R →为连续可微函数,其梯度向量记为() g x ,简记为g 。 共轭梯度法是求解大规模无约束优化问题的有效算法之一,它像最速下降法一样在每步迭代中不需要存储和计算矩阵,其迭代格式为: 1k k k k x x d α+=+ (2) 1,1;,1, k k k k k g k d g d k β--=?=?-+>? (3) 其中,()k k g f x =?,k d 为搜索方向,k α是通过一维线搜索获得的步长,k β为标量。不同的k β对应着不同的共轭梯度算法。1964, Fletcher 和 Reeves 首先提出非线性共轭梯度法参数k β,它定义为 22 1 k FR k k g g β-= ([2]). 还有其他著名的k β,比如 1 2 1 T PRP k k k k g y g β --= ( [3-4]), 111T HS k k k T k k g y d y β ---=([5]), 111 T LS k k k T k k g y d g β---=-([6]), 2 11 k DY k k k g d y βT --= ([7]), 2 11 k CD k k k g d g βT --=- ([8]); 收稿日期:2013-05-07; 作者简介: 敖卫斌(1987-),男,重庆九龙坡人,硕士研究生,主要从事最优化理论与研究.

作业4-FR共轭梯度法

最优化方法第四次作业 题目:利用FR-共轭梯度法求解无约束优化问题222 12122min ()44412x R f x x x x x x ∈=+--。初始点(0)(0.5,1).T x =- () ()T k k T k k k k k k k g g g g k d g k g d 111110.0,;0,-----=???≥+-=-=ββ 一、程序 function [x,val,k]=frcg(fun,gfun,x0) %功能:用FR 共轭梯度法求解无约束问题min f (x ) %输入:x0是初始点,fun,gfun 分别是求目标函数和梯度 %输出:x,val 分别是近似最优点和最优值,k 是迭代次数 maxk=5000; rho=0.6; sigma=0.4; k=0; epsilon=1e-4; n=length(x0); while (k=0.0) d=-g; end end if (norm(d)

while (m<20) %用Armijo 搜索求步长 if (feval(fun,x0+rho^m*d)> x0=[-0.5,1]'; >> [x,val,k]=frcg('fun','gfun',x0) x = 1.0000 2.0000 val = -12.0000 k = 10 即22212122min ()44412x R f x x x x x x ∈=+--的极小值点x=[1;2];minf(x)= -12。

用MATLAB实现共轭梯度法求解实例(精编文档).doc

【最新整理,下载后即可编辑】 用MATLAB 实现共轭梯度法求解实例 康福 201103710031 一.无约束优化方法 1.1 无约束优化方法的必要性 一般机械优化设计问题,都是在一定的限制条件下追求某一指标为最小,它们都属于约束优化问题。但是为什么要研究无约束优化问题? (1)有些实际问题,其数学模型本身就是一个无约束优化问题。 (2)通过熟悉它的解法可以为研究约束优化问题打下良好的基础。 (3)约束优化问题的求解可以通过一系列无约束优化方法来达 到。所以无约束优化问题的解法是优化设计方法的基本组成部分,也是优化方法的基础。 (4)对于多维无约束问题来说,古典极值理论中令一阶导数为零, 但要求二阶可微,且要判断海赛矩阵为正定才能求得极小点,这种方法有理论意义,但无实用价值。和一维问题一样,若多元函数F(X)不可微,亦无法求解。但古典极值理论是无约束优化方法发展的基础。 1.2共轭梯度法 目前已研究出很多种无约束优化方法,它们的主要不同点在于构造搜索方向上的差别。 (1)间接法——要使用导数,如梯度法、(阻尼)牛顿法、变尺 度法、共轭梯度法等。 (2)直接法——不使用导数信息,如坐标轮换法、鲍威尔法单纯形法等。 用直接法寻找极小点时,不必求函数的导数,只要计算目标函数值。这类方法较适用于解决变量个数较少的(n ≤20)问题,一般情况下比间接法效率低。间接法除要计算目标函数值外,还要计算目标函数的梯度,有的还要计算其海赛矩阵。 1(0,1,2,)k k k k s k α+=+=x x

搜索方向的构成问题乃是无约束优化方法的关键。 共轭梯度法是沿着共轭方向进行搜索,属于共轭方向法中的一种,该方法中每一个共轭向量都是依赖于迭代点处的负梯度而构造出来。共轭梯度法作为一种实用的迭代法,它主要有下面的优点: (1)算法中,系数矩阵A的作用仅仅是用来由已知向量P产生向量W=AP,这不仅可充分利用A的稀疏性,而且对某些提供 矩阵A较为困难而由已知向量P产生向量W=AP又十分方便 的应用问题是很有益的。 (2)不需要预先估计任何参数就可以计算,这一点不像SOR等;(3)每次迭代所需的计算,主要是向量之间的运算,便于并行化。 共轭梯度法原理的知识较多,请详见《机械优化设计》第四章的第四、五节。 图1为共轭梯度法的程度框图

共轭梯度法

最速下降法 1.最速下降方向 函数f(x)在点x处沿方向d的变化率可用方向导数来表示。对于可微函数,方向导数等于梯度与方向的内积,即: Df(x;d) = ▽f(x)T d, 因此,求函数f(x)在点x处的下降最快的方向,可归结为求解下列非线性规划: min ▽f(x)T d s.t. ||d|| ≤ 1 当 d = -▽f(x) / ||▽f(x)|| 时等号成立。因此,在点x处沿上式所定义的方向变化率最小,即负梯度方向为最速下降方向。 2.最速下降算法 最速下降法的迭代公式是 x(k+1) = x(k) + λk d(k) , 其中d(k)是从x(k)出发的搜索方向,这里取在x(k)处的最速下降方向,即 d = -▽f(x(k)). λk是从x(k)出发沿方向d(k)进行一维搜索的步长,即λk满足 f(x(k) + λk d(k)) = min f(x(k)+λd(k)) (λ≥0). 计算步骤如下: (1)给定初点x(1) ∈ R n,允许误差ε> 0,置k = 1。 (2)计算搜索方向d = -▽f(x(k))。 (3)若||d(k)|| ≤ε,则停止计算;否则,从x(k)出发,沿d(k)进行一维搜索,求λk,使 f(x(k) + λk d(k)) = min f(x(k)+λd(k)) (λ≥0). (4)令x(k+1) = x(k) + λk d(k),置k = k + 1,转步骤(2)。 共轭梯度法 1.共轭方向 无约束问题最优化方法的核心问题是选择搜索方向。 以正定二次函数为例,来观察两个方向关于矩阵A共轭的几何意义。 设有二次函数: f(x) = 1/2 (x - x*)T A(x - x*) , 其中A是n×n对称正定矩阵,x*是一个定点,函数f(x)的等值面 1/2 (x - x*)T A(x - x*) = c 是以x*为中心的椭球面,由于 ▽f(x*) = A(x - x*) = 0, A正定,因此x*是f(x)的极小点。 设x(1)是在某个等值面上的一点,该等值面在点x(1)处的法向量 ▽f(x(1)) = A(x(1) - x*)。

实验2 最速下降法和共轭梯度法的程序设计

实验2 最速下降法和共轭梯度法的程序设计 一、实验目的 1、熟悉无约束优化问题的最速下降算法和共轭梯度法。 2、培养matlab 编程与上机调试能力。 二、实验课时:2个课时 三、实验准备 1、预习无约束优化问题的最速下降算法和共轭梯度法。 2、熟悉matlab 软件的基本操作及程序编写。 四、实验内容 课堂实验演示 根据最速下降法编写程序,求函数 21222121342)(min x x x x x x x f -++-= 的极小值,其中初始点为()01,1T x = 算法步骤如下: Step1::给出初始点0x ,和精度1;0k ε<<=; Step2:计算()k f x ?,如果()k f x ε?≤,则停止迭代,输出结果;否则转step3; Step3:令下降方向()k k d f x =-?,计算步长因子k λ使得0()min ()k k k k k f x d f x d λλλ≥+=+,令1,1k k k k x x d k k λ+=+=+,转step2。 其程序如下: function [x,iter,val,dval] = Steepest_Descent_Method(x,eps) k = 1; dy = grad_obj(x); x_mat(:,1) = x;%存储每一次迭代得到的点x while norm(dy)>eps d = -dy; % 搜索方向 lambda = line_search(x,d);%步长 x = x + d*lambda; k = k + 1; x_mat(:,k) = x; dy = grad_obj(x); end iter = k - 1; val = obj(x);%目标函数在极值点处的函数值

MATLAB实现最速下降法_和牛顿法和共轭梯度法

MATLAB实现最速下降法_和牛顿法和共轭梯度法最速下降法: 题目:f=(x-2)^2+(y-4)^2 M文件: function [R,n]=steel(x0,y0,eps) syms x; syms y; f=(x-2)^2+(y-4)^2; v=[x,y]; j=jacobian(f,v); T=[subs(j(1),x,x0),subs(j(2),y,y0)]; temp=sqrt((T(1))^2+(T(2))^2); x1=x0;y1=y0; n=0; syms kk; while (temp>eps) d=-T; f1=x1+kk*d(1);f2=y1+kk*d(2); fT=[subs(j(1),x,f1),subs(j(2),y,f2)]; fun=sqrt((fT(1))^2+(fT(2))^2); Mini=Gold(fun,0,1,0.00001); x0=x1+Mini*d(1);y0=y1+Mini*d(2); T=[subs(j(1),x,x0),subs(j(2),y,y0)]; temp=sqrt((T(1))^2+(T(2))^2); x1=x0;y1=y0;

n=n+1; end R=[x0,y0] 调用黄金分割法: M文件: function Mini=Gold(f,a0,b0,eps) syms x;format long; syms kk; u=a0+0.382*(b0-a0); v=a0+0.618*(b0-a0); k=0; a=a0;b=b0; array(k+1,1)=a;array(k+1,2)=b; while((b-a)/(b0-a0)>=eps) Fu=subs(f,kk,u); Fv=subs(f,kk,v); if(Fu<=Fv) b=v; v=u; u=a+0.382*(b-a); k=k+1; elseif(Fu>Fv) a=u; u=v; v=a+0.618*(b-a); k=k+1;

最优化—基于matlab的共轭梯度法

共轭梯度算法程序: function f=conjugate_gradient(x0,t) x=x0; syms xi yi a f=(xi-2)^2+(yi-4)^2; fx=diff(f,xi); fy=diff(f,yi); fx=subs(fx,{xi,yi},x0); fy=subs(fy,{xi,yi},x0); fi=[fx,fy]; n=0; while double(sqrt(fx^2+fy^2))>t s=-fi; if n<=0 s=-fi; else s=s1; end x=x+a*s; f=subs(f,{xi,yi},x); f1=diff(f); f1=solve(f1); if fi~=0 ai=double(f1);

else break x,f=subs(f,{xi,yi},x),n end x=subs(x,a,ai); f=xi-xi^2+2*xi*yi+yi^2; fxi=diff(f,xi); fyi=diff(f,yi); fxi=subs(fxi,{xi,yi},x); fyi=subs(fyi,{xi,yi},x); fii=[fxi,fyi]; d=(fxi^2+fyi^2)/(fx^2+fy^2); s1=-fii+d*s; n=n+1; fx=fxi; fy=fyi; end x,f=subs(f,{xi,yi},x),n 运行结果为: >> conjugate_gradient([0 0],0.0001) x = 0.2500 -0.2500

f = 0.1250 n = 10 ans = 0.1250

共轭梯度法matlab实例

clear all;close all;clc; syms x1x2t; f=2*x1^2+x2^2-x1*x2; f_grad=[diff(f,x1);diff(f,x2)]; X0=[1;1]; n=10; epsonal=0.01; fx=inline(f); fx_grad=inline(f_grad); X=X0; fx0=fx(X(1),X(2)); fx0_grad=fx_grad(X(1),X(2)); while 1 if fx0_grad.'*fx0_grad<=epsonal break; end P0=-fx0_grad; k=0; while 1 Xk=X+t*P0; fx1=fx(Xk(1),Xk(2)); [tk,y]=equation_extremum(fx1,t,-1,5,epsonal); Xk=X+tk*P0; fx0_k=fx(Xk(1),Xk(2)); fx0_grad_k=fx_grad(Xk(1),Xk(2)); if fx0_grad_k.'*fx0_grad_k<=epsonal fx0_grad=fx0_grad_k; break; end if k+1==n X=X; else lamdak=fx0_grad_k.'*fx0_grad_k/(fx_grad(X(1),X(2)).'*fx_grad(X(1),X(2))); P0=-fx0_grad_k+lamdak*P0; X=Xk; k=k+1; end end end Xk fx0_k 运行结果: Xk = 1.0e-03 *

0.0486 0.5350 fx0_k = 2.6495e-07

用MATLAB实现最速下降法-牛顿法和共轭梯度法求解实例

题目和要求 最速下降法是以负梯度方向最为下降方向的极小化算法,相邻 两次的搜索方向是互相直交的。牛顿法是利用目标函数)(x f 在迭代点k x 处的Taylor 展开式作为模型函数,并利用这个二次模型函数的极小 点序列去逼近目标函数的极小点。共轭梯度法它的每一个搜索方向是互相共轭的,而这些搜索方向k d 仅仅是负梯度方向k g -与上一次接待 的搜索方向1-k d 的组合。 运行及结果如下: 最速下降法: 题目:f=(x-2)^2+(y-4)^2 M 文件: function [R,n]=steel(x0,y0,eps) syms x ; syms y ; f=(x-2)^2+(y-4)^2; v=[x,y]; j=jacobian(f,v); T=[subs(j(1),x,x0),subs(j(2),y,y0)]; temp=sqrt((T(1))^2+(T(2))^2); x1=x0;y1=y0; n=0; syms kk ; while (temp>eps) d=-T; f1=x1+kk*d(1);f2=y1+kk*d(2); fT=[subs(j(1),x,f1),subs(j(2),y,f2)]; fun=sqrt((fT(1))^2+(fT(2))^2); Mini=Gold(fun,0,1,0.00001); x0=x1+Mini*d(1);y0=y1+Mini*d(2); T=[subs(j(1),x,x0),subs(j(2),y,y0)]; temp=sqrt((T(1))^2+(T(2))^2); x1=x0;y1=y0; n=n+1;

end R=[x0,y0] 调用黄金分割法: M文件: function Mini=Gold(f,a0,b0,eps) syms x;format long; syms kk; u=a0+0.382*(b0-a0); v=a0+0.618*(b0-a0); k=0; a=a0;b=b0; array(k+1,1)=a;array(k+1,2)=b; while((b-a)/(b0-a0)>=eps) Fu=subs(f,kk,u); Fv=subs(f,kk,v); if(Fu<=Fv) b=v; v=u; u=a+0.382*(b-a); k=k+1; elseif(Fu>Fv) a=u; u=v; v=a+0.618*(b-a); k=k+1; end array(k+1,1)=a;array(k+1,2)=b; end Mini=(a+b)/2; 输入: [R,n]=steel(0,1,0.0001) R = 1.99999413667642 3.99999120501463 R = 1.99999413667642 3.99999120501463 n = 1 牛顿法: 题目:f=(x-2)^2+(y-4)^2 M文件:

最优化牛顿法最速下降法共轭梯度法matlab代码

牛顿法 迭代公式:(1)2()1()[()]()k k k k x x f x f x +-=-?? Matlab 代码: function [x1,k] =newton(x1,eps) hs=inline('(x-1)^4+y^2'); 写入函数 ezcontour(hs,[-10 10 -10 10]); 建立坐标系 hold on; 显示图像 syms x y 定义变量 f=(x-1)^4+y^2; 定义函数 grad1=jacobian(f,[x,y]); 求f 的一阶梯度 grad2=jacobian(grad1,[x,y]); 求f 的二阶梯度 k=0; 迭代初始值 while 1 循环 grad1z=subs(subs(grad1,x,x1(1)),y,x1(2)); 给f 一阶梯度赋初值 grad2z=subs(subs(grad2,x,x1(1)),y,x1(2)); 给f 二阶梯度赋初值 x2=x1-inv(grad2z)*(grad1z)'; 核心迭代公式 if norm(x1-x2)

end end end 优点:在极小点附近收敛快 缺点:但是要计算目标函数的hesse 矩阵 最速下降法 1. :选取初始点xo ,给定误差 2. 计算一阶梯度。若一阶梯度小于误差,停止迭代,输出 3. 取()()()k k p f x =? 4. 10 t ()(), 1.min k k k k k k k k k k t f x t p f x tp x x t p k k +≥+=+=+=+进行一维搜索,求,使得令转第二步 例题: 求min (x-2)^4+(x-2*y)^2.初始值(0,3)误差为0.1 (1)编写一个目标函数,存为f.m function z = f( x,y ) z=(x-2.0)^4+(x-2.0*y)^2; end (2)分别关于x 和y 求出一阶梯度,分别存为fx.m 和fy.m function z = fx( x,y ) z=2.0*x-4.0*y+4.0*(x-2.0)^3; end 和 function z = fy( x,y )

MATLAB实现最速下降法

%最速下降法 clear all; close all; clc; tic; format longe disp('请输入参数'); K=input('维数K='); tic A=hilb(K);% A元素是0-100 % for i=1:K % A(i,i)=sum(abs(A(i,:)))+20*rand(1); %对角占优的量为0~20 % end b=zeros(K,1); for i=1:K; x=0; for r=1:K; x=x+A(i,r); end b(i,1)=x; end%产生b矩阵,b中的元素为A中对应行的和,目的是使方程解全为 1 jd=input('控制精度jd='); x0=zeros(K,1); %初始迭代矩阵 r=b-A*x0; %剩余向量 ak=dot(r,r)/dot(A*r,r); y1=x0+ak*r; %迭代公式 s1=1; %迭代次数 while norm(y1-x0)>=jd x0=y1; r=b-A*x0; %剩余向量 ak=(r'*r)/((A*r)'*r); y1=x0+ak*r; %迭代公式 s1=s1+1; %迭代次数+1 end s1 toc; x0=zeros(K,1); %初始迭代矩阵 r=b-A*x0;%剩余向量 p=r;

ak=dot(r,r)/dot(p,A*p); y=x0+ak*p; %迭代公式 r1=r-ak*A*p; bk=dot(r1,r1)/dot(r,r); p1=r1+bk*p; s=1; %迭代次数 while norm(y-x0)>=jd; %迭代条件 x0=y; p=p1; r=r1; ak=dot(r,r)/dot(p,A*p); y=x0+ak*p; %迭代公式 r1=r-ak*A*p; bk=dot(r1,r1)/dot(r,r); p1=r1+bk*p; s=s+1; end s toc; t=1:K; yy1=abs(y1'-1)/1; yy2=abs(y'-1)/1; plot(t,yy1,'r'); hold on plot(t,yy2,'b'); hold on title('绝对误差图') legend('最速下降法','共轭梯度法')

共轭梯度实验报告

竭诚为您提供优质文档/双击可除 共轭梯度实验报告 篇一:共轭梯度法实验报告 数值代数实验报告 一、实验名称:用共轭梯度法解线性方程组。 二、实验目的:进一步熟悉理解掌握共轭梯度法解法思路,提高matlab编程能力。三、实验要求:已知线性方程 矩阵,应用共轭梯度法在相关软件编程求解线性方程组的解。 四、实验原理: 1.共轭梯度法: 考虑线性方程组 Ax?b 的求解问题,其中A是给定的n阶对称正定矩阵,b是 给定的n维向量,x是待求解的n维向量.为此,定义二次泛 函 ?(x)?xTAx?2bTx. 定理1设A对称正定,求方程组Ax?b的解,等价于求二次泛函?(x)的极小值点.定理1表明,求解线性方程组问题

就转化为求二次泛函?(x)的极小值点问题.求解二次函数极 小值问题,通常好像盲人下山那样,先给定一个初始向量x0,确定一个下山方向p0,沿着经过点x0而方向为p0的直线 x?x0??p0找一个点 x1?x0??0p0, 使得对所有实数?有 ??x0??0p0????x0??p0?, 即在这条直线上x1使?(x)达到极小.然后从x1出发, 再确定一个下山的方向p1,沿着直 线x?x1??p1再跨出一步,即找到?1使得??x?在 x2?x1??1p1达到极小: ??x1??1p1????x1??p1?. 重复此步骤,得到一串 ?0,?1,?2, x?xk??pk上确定步长?k使 和p0,p1,p2, , 称pk为搜索方向,?k为步长.一般情况下,先在xk点 找下山方向pk,再在直线 ??xk??kpk????xk??pk?, 最后求出xk?1?xk??kpk.然而对不同的搜索方向和步长,得到各种不同的算法.

用MATLAB实现共轭梯度法求解实例

康福 0031 一.无约束优化方法 无约束优化方法的必要性 一般机械优化设计问题,都是在一定的限制条件下追求某一指标为最小,它们都属于约束优化问题。但是为什么要研究无约束优化问题? (1)有些实际问题,其数学模型本身就是一个无约束优化问题。 (2)通过熟悉它的解法可以为研究约束优化问题打下良好的基础。 (3)约束优化问题的求解可以通过一系列无约束优化方法来达到。所以无约束优 化问题的解法是优化设计方法的基本组成部分,也是优化方法的基础。 (4)对于多维无约束问题来说,古典极值理论中令一阶导数为零,但要求二阶可 微,且要判断海赛矩阵为正定才能求得极小点,这种方法有理论意义,但无实用价值。和一维问题一样,若多元函数F(X)不可微,亦无法求解。但古典极值理论是无约束优化方法发展的基础。 共轭梯度法 目前已研究出很多种无约束优化方法,它们的主要不同点在于构造搜索方向上的差别。 (1)间接法——要使用导数,如梯度法、(阻尼)牛顿法、变尺度法、共轭梯度 法等。 (2)直接法——不使用导数信息,如坐标轮换法、鲍威尔法单纯形法等。 用直接法寻找极小点时,不必求函数的导数,只要计算目标函数值。这类方法较适用于解决变量个数较少的(n ≤20)问题,一般情况下比间接法效率低。 间接法除要计算目标函数值外,还要计算目标函数的梯度,有的还要计算其海赛 矩阵。 搜索方向的构成问题乃是无约束优化方法的关键。 1(0,1,2,) k k k k s k α+=+=L x x

共轭梯度法是沿着共轭方向进行搜索,属于共轭方向法中的一种,该方法中每一个共轭向量都是依赖于迭代点处的负梯度而构造出来。共轭梯度法作为一种实用的迭代法,它主要有下面的优点: (1)算法中,系数矩阵A的作用仅仅是用来由已知向量P 产生向量W=AP ,这不仅 可充分利用A的稀疏性,而且对某些提供矩阵A较为困难而由已知向量P 产生向量W=AP 又十分方便的应用问题是很有益的。 (2)不需要预先估计任何参数就可以计算,这一点不像SOR 等; (3)每次迭代所需的计算,主要是向量之间的运算,便于并行化。 共轭梯度法原理的知识较多,请详见《机械优化设计》第四章的第四、五节。 图1为共轭梯度法的程度框图 图1为共轭梯度法的程度框图 二.设计题目及要求 设计题目 用共轭梯度法求二次函数 2 21212 112(,)242f x x x x x x x =+-- 的极小点及极小值。 设计要求 (1)使用matlab 编写程序,熟练撑握matlab 编程方法。 (2)学习并撑握共轭梯度法的原理、方法及应用,并了解不同无约束优化方法的 区别、优缺点及特殊要求。 (3)编写程序,计算出二次函数的极小点及极小值,并适当选取不同的初始点及 迭代精度精度,分析比较结果。

数值计算方法matlab程序

function [x0,k]=bisect1(fun1,a,b,ep) if nargin<4 ep=1e-5; end fa=feval(fun1,a); fb=feval(fun1,b); if fa*fb>0 x0=[fa,fb]; k=0; return; end k=1; while abs(b-a)/2>ep x=(a+b)/2; fx=feval(fun1,x); if fx*fa<0 b=x; fb=fx; else a=x; fa=fx; k=k+1; end end x0=(a+b)/2; >> fun1=inline('x^3-x-1'); >> [x0,k]=bisect1(fun1,1.3,1.4,1e-4) x0 = 1.3247 k = 7 >> 简单迭代法 function [x0,k]=iterate1(fun1,x0,ep,N) if nargin<4 N=500; end if nargin<3 ep=1e-5; end x=x0; x0=x+2*ep;

while abs(x-x0)>ep & k> fun1=inline('(x+1)^(1/3)'); >> [x0,k]=iterate1(fun1,1.5) x0 = 1.3247 k = 7 >> fun1=inline('x^3-1'); >> [x0,k]=iterate1(fun1,1.5) x0 = Inf k = 9 >> Steffesen加速迭代(简单迭代法的加速)function [x0,k]=steffesen1(fun1,x0,ep,N) if nargin<4 N=500; end if nargin<3 ep=1e-5; end x=x0; x0=x+2*ep; k=0; while abs(x-x0)>ep & k

数学实验“线性方程组的最速下降法与共轭梯度法解法”实验报告(内含matlab程序代码)

西京学院数学软件实验任务书 课程名称数学软件实验班级数0901 学号0912020107姓名李亚强 实验课题线性方程组的最速下降法与共轭梯度法 实验目的熟悉线性方程组的最速下降法与共轭梯度法 实验要求 运用Matlab/C/C++/Java/Maple/Mathematica等其中 一种语言完成 实验内容线性方程组的最速下降法线性方程组的共轭梯度法 成绩教师

实验五实验报告 一、实验名称:最速下降法与共轭梯度法解线性方程组。 二、实验目的:进一步熟悉理解掌握最速下降法与共轭梯度法解法思路,提高matlab 编程能力。 三、实验要求:已知线性方程矩阵,应用最速下降与共轭梯度法在相关软件编程求解线性方程组的解。 四、实验原理: 1.最速下降法: 从某个初始点)0(X 出发,沿)(X f 在点)0(X 处的负梯度方向 ) 0()0()0()(AX b X f r -=-?=求得)(X f 的极小值点)1(X ,即 )(min )0()0(0 r X f λλ+>然后从)1(X 出发,重复上面的过程得到)2(X 。如此下去, 得到序列{)(k X } ) (...)()()()1()0(k X f X f X f >>>可以证明,从任一初始点)0(X 出发,用最速下降法所得 到的序列{)(k X }均收敛于问题使X 最小化)(X f 的解,也就是方程组b AX =的解。其收敛速度取决于1 1λλλλ+-n n ,其中1λ,n λ分别

为A 的最小,最大特征值。最速下降法迭代格式:给定初值)0(X ,)(k X 按如下方法决定: ()) ()(1)(k )()()()(k ) ()(X ,,)(k k k k T k k T k k k k r X Ar r r r AX b X f r λλ+=> <><=-=-?=+2.共轭梯度法 其基本步骤是在点)(k X 处选取搜索方向)(k d ,使其与前一次的搜索方向)1(-k d 关于A 共轭,即 (1)()(1),0 k k k d d Ad --<>=然后从点)(k X 出发,沿方向)(k d 求得)(X f 的极小值点)1(+k X ,即 ) (min )()()(0)1(k d X f X f k k λλ+=>+如此下去,得到序列{)(k X }。不难求得0,)1()(>=<-k k Ad d 的解为 )()1()1()()() ()1(,,k k k k k k k d Ad d d AX b X X ><>-<+=--+注意到)(k d 的选取不唯一,我们可取

共轭梯度法 MATLAB程序

%conjugate gradient methods %method:FR,PRP,HS,DY,CD,WYL,LS %精确线搜索,梯度终止准则 function [ m,k,d,a,X,g1,fv] = conjgradme( G,b,c,X,e,method) if nargin<6 error('输入参数必须为6'); end n=length(G); if n==2 format long e%rat syms x1x2 f=1/2*[x1,x2]*G*[x1;x2]+b'*[x1;x2]+c; g=[diff(f,x1);diff(f,x2)]; g1=subs(subs(g,x1,X(1,1)),x2,X(2,1)); d=-g1; a=-(d'*g1)/(d'*G*d);% a=-((X(:,1)'*G*d+b'*d)/(d'*G*d)); a=g1(:,1)'*g1(:,1)/(d(:,1)'*G*d(:,1)); X(:,2)=X(:,1)+a*d; g1=[g1 subs(subs(g,x1,X(1,2)),x2,X(2,2))]; m1=norm(g1(:,1)); m=norm(g1(:,2)); i=2; k=zeros(1); switch method case'FR' while m>=e k(i-1)=(m/m1)^2; d(:,i)=-g1(:,i)+k(i-1)*d(:,i-1); a(i)=-(d(:,i)'*g1(:,i))/(d(:,i)'*G*d(:,i)); %a1(i)=-((X(:,i)'*G*d(:,i)+b'*d(:,i))/(d(:,i)'*G*d(:, i)));a(i)=g1(:,i)'*g1(:,i)/(d(:,i)'*G*d(:,i)); X(:,i+1)=X(:,i)+a(i)*d(:,i); g1=[g1 subs(subs(g,x1,X(1,i+1)),x2,X(2,i+1))]; m1=m; m=norm(g1(:,i+1)); i=i+1; end case'PRP' while m>=e k(i-1)=g1(:,i)'*(g1(:,i)-g1(:,i-1))/(norm(g1(:,i-1)))^2; d(:,i)=-g1(:,i)+k(i-1)*d(:,i-1); a(i)=-(d(:,i)'*g1(:,i))/(d(:,i)'*G*d(:,i)); X(:,i+1)=X(:,i)+a(i)*d(:,i);

相关文档
最新文档