重 庆 大 学
学 生 实 验 报 告
实验课程名称 计算方法
开课实验室 DS1421
学 院 年级 专业
学 生 姓 名 学 号
开 课 时 间 至 学年 第 学期
总 成 绩 教师签名
1.实验目的
(1)高斯列主元消去法求解线性方程组的过程 (2)熟悉用迭代法求解线性方程组的过程
(3)设计出相应的算法,编制相应的函数子程序
2.实验内容
分别用高斯列主元消去法 ,Jacobi迭代法,Gauss--Saidel迭代法,超松弛迭代法求解线性方程组
0?3??x1??10??210??3?4?1213??x??5????2???? ?123?4??x3???2???????4149?13???x4??7?3.实验过程
解:(1)高斯列主元消去法
编制高斯列主元消去法的M文件程序如下: %高斯列主元消元法求解线性方程组Ax=b %A为输入矩阵系数,b为方程组右端系数 %方程组的解保存在x变量中
format long;%设置为长格式显示,显示15位小数 A=[2,10,0,-3;-3,-4,-12,13;1,2,3,-4;4,14,9,-13] b=[10,5,-2,7]' [m,n]=size(A); %先检查系数正确性 if m~=n
error('矩阵A的行数和列数必须相同'); return; end
if m~=size(b)
error('b的大小必须和A的行数或A的列数相同'); return; end
%再检查方程是否存在唯一解 if rank(A)~=rank([A,b])
error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解'); return; end c=n+1;
A(:,c)=b; %(增广) for k=1:n-1
[r,m]=max(abs(A(k:n,k))); %选主元 m=m+k-1; %修正操作行的值 if(A(m,k)~=0) if(m~=k)
A([k m],:)=A([m k],:); %换行 end
A(k+1:n, k:c)=A(k+1:n, k:c)-(A(k+1:n,k)/ A(k,k))*A(k, k:c); %消去 end end
x=zeros(length(b),1); %回代求解 x(n)=A(n,c)/A(n,n); for k=n-1:-1:1
x(k)=(A(k,c)-A(k,k+1:n)*x(k+1:n))/A(k,k); end
disp('X='); disp(x);
format short;%设置为默认格式显示,显示5位 运行,结果如下所示:
(2)Jacobi迭代法
编制迭代计算的M文件程序如下:
%Jacobi迭代法求解
% A为方程组的增广矩阵 clc;
A=[2,10,0,-3,10;-3,-4,-12,13,5;1,2,3,-4,-2;4,14,9,-13,7] MAXTIME=50;%最多进行50次迭代 eps=1e-5;%迭代误差 [n,m]=size(A);
x=zeros(n,1);%迭代初值 y=zeros(n,1); k=0;
%进入迭代计算
disp('迭代过程X的值情况如下:') disp('X='); while 1
disp(x'); for i=1:1:n s=0.0; for j=1:1:n if j~=i
s=s+A(i,j)*x(j); end
y(i)=(A(i,n+1)-s)/A(i,i); end end
for i=1:1:n
maxeps=max(0,abs(x(i)-y(i))); %检查是否满足迭代精度要求 end
if maxeps<=eps%小于迭代精度退出迭代 for i=1:1:n
x(i)=y(i);%将结果赋给x end return; end
for i=1:1:n%若不满足迭代精度要求继续进行迭代 x(i)=y(i); y(i)=0.0; end k=k+1;
if k>MAXTIME%超过最大迭代次数退出 error('超过最大迭代次数,退出'); return; end end
运行该程序结果如下:
(3)Gauss--Saidel迭代法