用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

原文地址:https://www.cnblogs.com/kmliang/p/2667858.html