智能优化算法作业.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
智能优化算法作业智能优化算法作业

一、优化算法及其应用 1.简介 共轭梯度法(Conjugate Gradient)是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。 2.算法原理 共轭梯度法是利用目标函数梯度逐步产生共轭方向作为线搜索方向的方法,每次搜索方向都是在目标函数梯度的共轭方向,搜索步长通过一维极值算法确定。 设二次函数为,其中为常数,为维列向量,为对称正定矩阵,用共轭梯度法求的极小点: 共轭梯度法探索的第一步是沿负梯度方向。即点按方向找到,然后沿着与上一次探索方向相共轭的方向进行探索直达到最小点。 令。 上式的意义就是以原来的负梯度的一部分即,加上新的负梯度,构造。 在上式中的选择,应使维欧氏空间中的两个非零向量与关于矩阵共轭。即 因 ,故有 若令 二式相减,得 设在第次迭代中 代入上式,得 式中为第次迭代的最优步长。 由式和式 ,得 将式和式代入上式,得 因为是一正交系,故有或 故上式可简化为 得 用一维探索最优化方法确定,即求 或用解析法,使 求得。 或由式,得 即 又由于进行一维最优化搜索,故有 由上两式可求得 如此,即可得到共轭梯度法的一组计算公式为 3.算法步骤 用共轭梯度法求无约束多维极值问题的算法步骤如下: 给定初始点,及精度; 若,停止,极小值点为,否则转步骤(3); 取,且置; 用一维搜索法求,使得,令,,转步骤5; 若,停止,极小值点为,否则转步骤(6); 若,令,转步骤(3),否则转步骤(7); 令,,置,转步骤(4)。 4.算法的MATLAB实现 在MATLAB中编程实现的共轭梯度法函数为: 功能:用共轭梯度法求解多维函数的极值。 调用格式: 其中,:目标函数; :初始点; :自变量向量; :目标函数取最小值时的自变量值; :目标函数的最小值。 共轭梯度法的MATLAB程序代码如下: function [x,minf]=minGETD(f,x0,var,eps) %目标函数:f; %初始点:x0; %自变量向量:var; %目标函数取最小值时的自变量值:x; %目标函数的最小值:minf; format long; if nargin==3 eps=1.0e-6; end x0=transpose(x0); n=length(var); syms l; gradf=jacobian(f,var); %梯度方向 v0=Funval(gradf,var,x0); p=-transpose(v0); k=0; while 1 v=Funval(gradf,var,x0); tol=norm(v); if tol=eps x=x0; break; end y=x0+l*p; yf=Funval(f,var,y); [a,b]=minJT(yf,0,0.1); xm=minHJ(yf,a,b); x1=x0+xm*p; vk=Funval(gradf,var,x1); tol=norm(vk); if tol=eps x=x1; break; end if k+1==n x0=x1; continue; else lamda=dot(vk,vk)/dot(v,v); p=-transpose(vk)+lamda*p; %共轭方向 k=k+1; x0=x1; end end minf=Funval(f,var,x); format short; 4.例题 例1.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

您可能关注的文档

文档评论(0)

enxyuio + 关注
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档