雅可比(Jacobi)迭代法解线性方程组的Matlab实现
代码
迭代法解线性方程组的基本思想是构造一串收敛到解的序列,即建立一种从已有近似解计算新的近似解的规则,有不同的计算规则得到不同的迭代法。
本文是常用的迭代法之一:Jacobi迭代法解线性方程组的matlab实现。
关于Jacobi迭代法的具体内容和算法见《数值计算方法》—丁丽娟,P65-66
书中算法如下:
程序中所用算法和书中的一致。
Matlab代码如下。
// 输入量:
A: 线性方程组的系数矩阵(n*n,非奇异)
b: 方程组右边的常数项列向量
n: 方程组维数
x0: 初始值
tol: 精度上限值
N: 最大迭代次数
//迭代终止标准
已达精度上限值或者到达最大迭代次数
//输出量:
x:线性方程组的解
// An highlighted block
function x=jacobi_fun(A,b,n,x0,tol,N)
x=zeros(n,1); % 给x赋值
k=0;
while k<N
for i=1:n
x(i)=(b(i)-A(i,[1:i-1,i+1:n])*x0([1:i-1,i+1:n]))/A(i,i);
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
运行
运行示例的线性方程组是《数值计算方法》—丁丽娟 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-6;
>> N=500;
// 输入后,调用函数
>> x=jacobi_fun(A,b,n,x0,tol,N)
运行结果如下:
可看出迭代16次之后得到精确值。
若输入N=9,运行结果如下:
迭代的中间过程其中一小部分见下图:
注: 判断时否到达精度上限用的是范数,此处选用2范数,实际上选用1范数,inf范数均可,若想选用其他范数,调用norm(A,p)即可。