没有合适的资源?快使用搜索试试~ 我知道了~
智能优化算法作业.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 16 浏览量
2022-05-30
13:29:55
上传
评论
收藏 353KB DOC 举报
温馨提示
试读
24页
智能优化算法作业.doc
资源推荐
资源详情
资源评论
一、优化算法及其应用
1.简介
共轭梯度法(Conjugate Gradient)是介于最速下降法与牛顿法之间的一个
方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免
了牛顿法需要存储和计算 Hesse 矩阵并求逆的缺点,共轭梯度法不仅是解决大
型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。
在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,
具有步收敛性,稳定性高,而且不需要任何外来参数。
2.算法原理
共轭梯度法是利用目标函数梯度逐步产生共轭方向作为线搜索方向的方法 ,
每次搜索方向都是在目标函数梯度的共轭方向,搜索步长通过一维极值算法确
定。
设二次函数为 ,其中 为常数, 为 维列向
量, 为对称正定矩阵,用共轭梯度法求 的极小点:
共轭梯度法探索的第一步是沿负梯度方向。即 点按 方
向找到 ,然后沿着与上一次探索方向 相共轭的方向 进行探索直达
到最小点 。
令 。
上式的意义就是以原来的负梯度 的一部分即 ,加上
新的负梯度 ,构造 。
在上式中 的选择,应使 维欧氏空间 中的两个非零向量 与 关
于矩阵 共轭。即
因
,故有
若令
二式相减,得
1
设在第 次迭代中
代入上式,得
式中 为第 次迭代的最优步长。
由式 和式
,得
将式 和式 代入上式,
得
因为 是一正交系,故有 或
故上式可简化为
得
用一维探索最优化方法确定,即求
或用解析法,使
求得 。
或由式 ,得
2
即
又由于进行一维最优化搜索,故有
由上两式可求得
如此,即可得到共轭梯度法的一组计算公式为
3.算法步骤
用共轭梯度法求无约束多维极值问题 的算法步骤如下:
(1) 给定初始点 ,及精度 ;
(2) 若 ,停止,极小值点为 ,否则转步骤(3);
(3) 取 ,且置 ;
(4) 用 一 维 搜 索 法 求 , 使 得 , 令 ,
,转步骤 5;
(5) 若 ,停止,极小值点为 ,否则转步骤(6);
(6) 若 ,令 ,转步骤(3),否则转步骤( 7);
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;
4
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
s=-fi;
if count<=0
s=-fi;
5
剩余23页未读,继续阅读
资源评论
omyligaga
- 粉丝: 53
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功