雅可比迭代法
雅可比迭代法-高斯-赛德尔迭代法求线性方程组
- 求解方程组
- matlab程序实现
function [x,k] = Fjacobi(A,b,x0,nm,eps)
%用雅可比迭代法求解方程组Ax=b
%输入:A为方程组的系数矩阵,b为方程组右端的列向量,
%输入:x0为迭代初值构成的列向量,nm为最大迭代次数,eps为误差精度
%输出:x为求得的方程组的解构成的列向量,k为迭代次数
D = diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=D\(L+U);
d=D\b;
k=1;
disp('雅可比迭代法');
while k<=nm
x=B*x0+d; %雅可比迭代式
if norm(x-x0)<eps
disp('迭代次数为');k
disp('方程组的解为');x
return;
end
x0=x;
k=k+1;
end
%下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)
disp('在最大迭代次数内不收敛!');
disp('最大迭代次数后的结果为');x
function [x,k] = Fgseid(A,b,x0,nm,eps)
%用高斯-塞德尔迭代法法求解方程组Ax=b
%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,eps为误差精度
%输出: x为求得的方程组的解构成的列向量,k为迭代次数
D = diag(diag(A));
L = -tril(A,-1);
U = -triu(A,1);
G = (D-L)\U;
d = (D-L)\b;
k = 1;
disp('高斯-塞德尔迭代法');
while k<=nm
x = G * x0 + d;%计算迭代矩阵
if norm(x-x0)<eps
disp('迭代次数为');k
disp('方程组的解为');x
return;
%上面:达到精度要求就结束程序,输出迭代次数和方程组的解
end
x0 = x;
k = k + 1;
end
%下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)
disp('在最大迭代次数内不收敛!');
disp('最大迭代次数后的结果为');x
- 求解函数;
a = [5 -1 -1 -1; -1 10 -1 -1; -1 -1 5 -1; -1 -1 -1 10];
b = [ 4 13 8 34]';
x0 = [0 0 0 0]';
nm = 100;
eps = 0.0001;
[x,k] = Fjacobi(a,b,x0,nm,eps);
[x,k] = Fgseid(a,b,x0,nm,eps);
结果: