题目
随机生成一个n阶方阵与n阶向量构成Ax=b
1、分别判断J法和GS法的收敛性
• 是否能收敛
• 报告中应生成部分不收敛的矩阵
• 估计J法和GS法收敛速度哪个更快
2、实现用J法和GS法解该方程组
3、实验判断J法和GS法的收敛速度,并与理论估计作对比
代码
main.m
%% A*x = b ,J法和GS法求解x
clear all %初始化,清空变量
close all
clc %清空窗口命令
%% 随机生成方阵和矩阵
n=3; %阶数
A=rand(n); %方阵
disp('A=');
disp(A);
b=rand(n,1); %向量
%雅可比迭代法
fprintf('**********雅可比迭代法**********\n');
x=Jacobi(A,b,n,1e-4,500);
%高斯-塞德尔迭代法
fprintf('**********高斯-塞德尔迭代法**********\n');
x=Gauss(A,b,n,1e-4,500);
Jacobi.m
function x=Jacobi(A,b,n,ep,maxN)
%%雅可比迭代法解线性方程组Ax=b
%A为系数矩阵,b为右端向量,x0为初始解向量
%ep为精度,maxN为最大迭代次数,x返回近似解向量
x0=zeros(n,1); %初值
x=zeros(n,1); %给x赋值
k=0;
while(k<maxN)
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)<ep
break;
end
x0=x;
k=k+1;
end
if k==maxN
disp('迭代次数已到达上限!');
else
disp(['迭代次数 k=',num2str(k)]);
disp('x='); %输出结果
disp(x); %输出结果
end
Gauss.m
function x=Gauss(A,b,n,ep,maxN)
%高斯-塞德尔迭代法解线性方程组Ax=b
%A为系数矩阵,b为右端向量,x0为初始解向量
%ep为精度,maxN为最大迭代次数,x返回近似解向量
x0=zeros(n,1); %初值
x=zeros(n,1); %给x赋值
k=0;
while k<maxN
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)<ep
break;
end
x0=x;
k=k+1;
end
if k==maxN
disp('迭代次数已到达上限!');
else
disp(['迭代次数 k=',num2str(k)]);
disp('x='); %输出结果
disp(x);
end
结果
1、第一次
(1)草稿纸计算雅可比迭代法下的谱半径为0.592,高斯-塞德尔迭代法下的谱半径为0.354,因为后者更小,所以GS法收敛速度更快。
(2)解方程组的结果如上。
(3)由实验结果可知GS法迭代次数为7,小于J法的迭代次数19,所以收敛更快,与理论估计一致。
2、第二次
(2)草稿纸计算雅可比迭代法下的谱半径为5.424,高斯-塞德尔迭代法下的谱半径为28.1114,都大于1,所以两个方法都不收敛。
(2)解方程组的结果如上。
(3)由实验结果可知J法和GS法都不收敛,与理论估计一致。
3、第三次
(3)草稿纸计算雅可比迭代法下的谱半径为0.743,高斯-塞德尔迭代法下的谱半径为0.533,因为后者更小,所以GS法收敛速度更快。
(2)解方程组的结果如上。
(3)由实验结果可知GS法迭代次数为7,小于J法的迭代次数32,所以收敛更快,与理论估计一致。
4、第四次
(4)草稿纸计算雅可比迭代法下的谱半径为1.448,高斯-塞德尔迭代法下的谱半径为2.133,都大于1,所以两个方法都不收敛。
(2)解方程组的结果如上。
(3)由实验结果可知J法和GS法都不收敛,与理论估计一致。