迭代法解线性方程组的基本思想是构造一串收敛到解的序列,即建立一种从已有近似解计算新的近似解的规则,有不同的计算规则得到不同的迭代法。
迭代法:求解大型稀疏线性方程组的常用方法,保持矩阵的稀疏性。
本文是常用的迭代法之一:Gauss-Seidel 迭代法解线性方程组的matlab实现。
关于Jacobi迭代法的具体内容和算法见《数值计算方法》—丁丽娟,P67-68
书中算法如下:
代码编写同上图
代码
// 输入量:
A: 线性方程组的系数矩阵(n*n,非奇异)
b: 方程组右边的常数项列向量
n: 方程组维数
x0: 初始值
tol: 精度上限值
N: 最大迭代次数
//迭代终止标准
已达精度上限值或者到达最大迭代次数
//输出量:
x:线性方程组的解
// 程序
function x=Gauss_Seidel_fun(A,b,n,x0,tol,N)
x=zeros(n,1); % 给x赋值
k=1;
while k<N
for i=1:n
if i==1
x(1)=(b(1)-A(1,2:n)*x0(2:n))/A(1,1);
elseif i==n
x(n)=(b(n)-A(n,1:n-1)*x(1:n-1))/A(n,n);
else
x(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i)
end
end
if norm(x-x0)<tol
break;
end
x0=x;
k=k+1;
disp(['when k=',num2str(k)])
disp('x=');
disp(x); %输出中间结果
end
if k==N
disp('迭代次数已到达上限!');
end
disp(['迭代次数 k=',num2str(k)])
end
代码可以看出G-S迭代法和Jacobi迭代法区别只在于G-S迭代时用旧分量代替新分量,计算时须按顺序进行。
运行
运行示例的线性方程组:《数值计算方法》—丁丽娟 P-66 例一
// Command Window 中输入
>> A=[10 -1 -2;-1 10 -2;-1 -1 5];
>> b=[72;83;42];
>> n=3;
>> x0=[0;0;0];
>> tol=1e-4;
>> N=500;
// 输入后,调用函数
>>x=jacobi_fun(A,b,n,x0,tol,N)
运行结果如下:
迭代的中间过程其中一小部分见下图:
注:选取tol精度上限值不同,迭代次数略有变化。
手算例题
维数低,迭代次数少时,可以直接手算,如下:
G-S:减少了存储量,但要求顺序计算