共轭梯度法程序及调试结果分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、设计题目
用共轭梯度法求二次函数的极小点及极小值。
2、运行与程序
(1)运行:打开matlab,确定conjugate_grad_2d.m文件夹为当前目录。
在命令窗中输入:f=conjugate_grad_2d([1,1],0.001)
选择不同的初始点坐标[0,0],[0,1],[1,0],和迭代精度0.01,0.0001,
进行运行时,需要多次调用conjugate_grad_2d函数。
(2)程序及说明:
function f=conjugate_grad_2d(x0,t)
%用共轭梯度法求已知函数f(x1,x2)=x1^2+2*x2^2-4*x1-2*x1*x2的极值点
%已知初始点坐标:x0
%已知收敛精度:t
%求得已知函数的极值:f
x=x0;
syms xi yi a; %定义自变量,步长为符号变量
f=xi^2+2*yi^2-4*xi-2*xi*yi; %创建符号表达式f
fx=diff(f,xi); %求表达式f对xi的一阶求导
fy=diff(f,yi); %求表达式f对yi的一阶求导
fx=subs(fx,{xi,yi},x0); %代入初始点坐标计算对xi的一阶求导实值
fy=subs(fy,{xi,yi},x0); %代入初始点坐标计算对yi的一阶求导实值
fi=[fx,fy]; %初始点梯度向量
count=0; %搜索次数初始为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); %构造一元搜索的一元函数φ(a)
f1=diff(f); %对函数φ(a)进行求导
f1=solve(f1); %得到最佳步长a
if f1~=0
ai=double(f1); %强制转换数据类型为双精度数值
else
break %若a=0,则直接跳出循环,此点即为极值点
end
x=subs(x,a,ai); %得到一次搜索后的点坐标值
f=xi^2+2*yi^2-4*xi-2*xi*yi;
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; %搜索次数加1
fx=fxi;
fy=fyi; %搜索后终点坐标变为下一次搜索的始点坐标
end
x,f=subs(f,{xi,yi},x),count %输出极值点,极小值以及搜索次数
3、运行结果及分析
选择不同的初始点坐标[0,0],[0,1],[1,0],和迭代精度0.01,0.0001,
(1)f=conjugate_grad_2d([1,1],0.001)
此程序运行1秒后终止,结果如下:
X =[ 4, 2] %极小点坐标
f = -8 %极小值数值
count = 2 %迭代次数
f =-8
(2)f=conjugate_grad_2d([0,1],0.001)
此程序运行1秒后终止,结果如下:
X =[ 4, 2] %极小点坐标
f = -8 %极小值数值
count = 2 %迭代次数
f =-8
分析可得:
(1)由结果看出,程序经过2次迭代,得到二次函数的极小值坐标[4,2],极小值-8;
表明共轭梯度法收敛速度较快,计算量较小,稳定性高。
(2)选择不同的初始点坐标[0,0],[0,1],[1,0],[1,1],都是经过2次迭代得到一致
的结果;表明共轭梯度法初始点的选择不影响收敛结果。
(3)选择迭代精度0.0001,程序将近运行4秒才结束;可知迭代精度越高时,程序
运行的时候越长,所以在实际应用中选择适当的迭代精度,有利于提高计算的
效率。
(4)从共轭梯度法的计算过程可以看出,第一个搜索方向取作负梯度方向,这就是
最速下降法。其余各步的搜索方向是将负梯度偏转一个角度,也就是对负梯度
进行修正。所以共轭梯度法实质上是对最速下降法进行的一种改进,故它又被
称作旋转梯度法。