⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcg.m

📁 % SSOR预处理的共轭梯度法求解方程Ax=b % 输入参数说明 % A 正定矩阵[n*n] % b 右边向量 % omega SSOR预处理参数(0--2) % Times 迭代次数 %
💻 M
字号:
function [NewX,avgerr]=pcg(A,b,omiga,Times,errtol)
% SSOR预处理的共轭梯度法求解方程Ax=b
% 输入参数说明
%  A     正定矩阵[n*n]
%  b     右边向量
%  omega SSOR预处理参数(0--2)
%  Times 迭代次数
%  errtol 给定误差终止条件
%
%输出参数
%  NewX  方程Ax=b的x近似解
%  avgerr 求解的当前平均绝对误差

%omiga=1;
%tic;   %计时器开始,与计算无关
[cols,rows]=size(b);
if cols > rows
   x=ones(cols,1);% x的初始值
else 
   x=ones(rows,1);% x的初始值
   b=b';
end;
[D,L,U]=dlu(A);% 对A进行分解子函数,见下面
M=(D-omiga*L)*inv(D)*(D-omiga*U)/(omiga*(2-omiga));%计算ssor预处理矩阵M

%下面为pcg方法的计算过程,完全翻译,所以不做标注
r=b-A*x;
invm=inv(M);
z=invm*r;
p=z;
x0=x-1;
k=1;
Error = x-x0; 
avgerr = 99999;
while (k<=Times)&&(max(abs(Error))>errtol)
    zr=z'*r;
    alpha=zr/(p'*(A*p));
    x0=x;
    x=x+alpha*p;
    r=r-alpha*A*p;
    z=invm*r;
    beta=(z'*r)/zr;
    p=z+beta*p;
    Error = x-x0; 
    ErrR=b-A*x;
    MSEError=sum(abs(ErrR))/length(x); % 求平均绝对误差
    if MSEError < avgerr
        avgerr = MSEError;
        NewX=x;
    end;
    k=k+1;
end
%maxerr=max(abs(x-x0))
%minerr=min(abs(x-x0))
%avgerr=sum(abs(OldError))/length(NewX);
%disp(['迭代次数k=',num2str(k)]);%先是迭代次数k和耗时
%disp(['pcg method 耗时(s) :',num2str(toc)]);

 

function [D,L,U]=dlu(A) %dlu分解子函数
D=zeros(size(A));
L=D;
U=D;
for i=1:size(A,1)
    D(i,i)=A(i,i);
end
for i=1:size(A,1)
    for j=1:size(A,2)
        L(i,j)=-(i<j)*A(i,j);
        U(i,j)=-(i>j)*A(i,j);
    end
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -