一、问题描述
求解系数矩阵A是对称正定矩阵的线性方程组 或求解二次函数
的极小值点。
二、算法
共轭梯度法,步骤如下:
1 任意给定初始点及精度
2
3 对于,作
1)
2)
3) ,或
4) 若或
,则输出
,
,取
作为
的解,否则
5)
6) .
MATLAB代码:
function CGM_main()
A = [10 1 2 3 4
1 9 -1 2 -3
2 -1 7 3 -5
3 2 3 12 -1
4 -3 -5 -1 15];
b=[12 -27 14 -17 12]';
x0=[0 0 0 0 0]';
max_iter=10000;
fprintf('\n');
fprintf('共轭梯度法:\n');
fprintf('==========================\n');
[y,iter]=cgm (A,b,x0,max_iter);
fprintf('\n');
fprintf('迭代次数:\n %d \n',iter);
fprintf('方程的解: \n');
fprintf('%10.6f',y);
fprintf('\n\n=========================\n\n');
end
function [x,iter] = cgm (A,b,x0,max_iter)
x=x0;
epsilon=1.0e-6;
fprintf('\n x0= ');
fprintf(' %10.6f',x0);
r=b-A*x;
d=r;
for k=0:max_iter
alpha=(r'*r)/(d'*A*d);
xx=x+alpha*d;
rr=b-A*xx;
if (norm(rr,2)/norm(b,2))<= epsilon
fprintf('\n 找到啦~');
iter = k+1;
x=xx;
r=rr;
fprintf('\n x%d = ',k+1);
fprintf(' %10.6f',x);
fprintf('\n r%d = ',k+1);
fprintf(' %10.6f',r);
return
end
beta=(rr'*rr)/(r'*r);
d=rr+beta*d;
x=xx;
r=rr;
fprintf('\n x%d = ',k+1);
fprintf(' %10.6f',x);
end
iter = max_iter;
return
end
运行结果:
共轭梯度法:
==========================
x0= 0.000000 0.000000 0.000000 0.000000 0.000000
x1 = 1.073560 -2.415510 1.252487 -1.520877 1.073560
x2 = 1.305605 -2.627981 2.146636 -1.694270 0.442393
x3 = 1.446618 -2.225384 2.448048 -1.970691 0.620722
x4 = 1.086550 -2.063574 2.792911 -2.101645 0.836386
找到啦~
x5 = 1.000000 -2.000000 3.000000 -2.000000 1.000000
r5 = 0.000000 0.000000 -0.000000 -0.000000 0.000000
迭代次数:
5
方程的解:
1.000000 -2.000000 3.000000 -2.000000 1.000000
=====================
注:编写MATLAB程序时主函数一定请放在最前面...
参考文献:
[1] MATLAB R2014官方手册
[2] 近代优化方法,徐成贤,陈志平,李乃成编著.科学出版社,2002.
[3] 最优化方法(第二版).孙文瑜,徐成贤,朱德通编著.高等教育出版社,2010.