实验目的
通过实验理解列选主元 LU 分解,理解线性方程组的雅可比迭代法和高斯-赛德尔迭代法的算法思想,学会做收敛性分析,掌握两个迭代法 Matlab 程序的编写和使用。
实验要求
- 根据表格写出对应的线性方程组;
- 判断利用不选主元的 LU 分解法求解该线性方程组是否可行;
- 用列选主元的 LU 分解法求解该线性方程组,并给出残差范数;
- 调整线性方程组,分别应用雅克比迭代和高斯赛德尔迭代求解该线性方程组并分析其收敛性;
- 分析实验结果。
实验原理
1.不选主元 LU 分解法原理
2. 矩阵的列选主元 LU 分解法
3. 雅可比迭代法
4. Gauss-Seidel 迭代法
实验过程原始记录
(一)首先,通过分析题目,根据表格数据可显然得出题目线性方程。
实验结果分析
部分代码
雅可比迭代法
function jacobi(A,b,x0,e,n)
%输入 A为系数矩阵,b为常数的列向量,x0为迭代初始向量,e为精度, n为最大迭代次数.
clc
format short;
D=diag(diag(A));
L=(-1).*tril(A,-1);
U=(-1).*triu(A,1);
k=0;
x=D\(L+U)*x0+D\b;
disp('迭代次数 x_k的分量元素 x_k的范数 x_k对应的剩余范数')
while norm(x-x0)>=e
x0=x;
x=D\(L+U)*x0+D\b;
k=k+1;
if k>n
break;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h1(k)=norm(x); %计算x的2范数
h2(k)=norm(b-A*x); %计算剩余向量的2范数
%%%%记录并输出每次迭代步的数据%%%%%%%%%%
aa=sprintf('%3d',k);
bb=sprintf('\t%4.4f',x);
cc=sprintf('\t\t%3.4f',h1(k));
dd=sprintf('\t\t%14.4e',h2(k));
disp([aa,' ',bb,' ',cc,' ',dd]);
end
列选主元LU分解法
[L,U,P]=lu(A);%对 A 进行列选主元 LU
>> y=L\P*b;
>> x=U\y;
E=norm(b-A*x) %求范数误差