用Matlab实现CGNR算法
在利用Matlab对大型稀疏矩阵的方程组的求解--实现的原理可以参考东北大学博士论文《大型线性方程组的迭代解法》(作者 邵新慧)P18,关于CGNR的描述
其matlab的代码如下:
%目标:求解Ax=b %采用的方法:CGNR---参考文献-大型线性方程组的迭代解法 function y=CGNR(A,b) TOF=0.0001; for i=1:length(b) x(i,1)=1; end %x(:,1)=[1 2 5]; k=1; r(:,1)=b-A*x(:,1); while(norm(r(:,k),2)>TOF) k=k+1; if(k==2) p(:,2)=A'*r(:,1); else beta(:,k)=(A'*r(:,k-1))'*(A'*r(:,k-1))/((A'*r(:,k-2))'*(A'*r(:,k-2))); p(:,k)=A'*r(:,k-1)+beta(:,k)*p(:,k-1); end alpha(:,k)=(A'*r(:,k-1))'*(A'*r(:,k-1))/((A'*p(:,k))'*(A'*p(:,k))); x(:,k)=x(:,k-1)+alpha(:,k)*p(:,k); r(:,k)=r(:,k-1)-alpha(:,k)*A*p(:,k); end y=x(:,k); %disp(y)
在matlab命令窗口,输入测试算例:
>> A=[1 2 3;2 5 2;3 1 5]; >> b=[14 18 20]' >> CGNR(A,b)
结果为 1.0001 2.0000 2.9999