预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共63页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第五章线形代数方程组的解法学习目标5.1线形代数方程组的直接解法 n阶线形方程组: (5.1) 矩阵形式: 其中要求A非奇异.解的判断数值求解方法有以下三条途径(三种框架) 直接法:利用Gauss消元或矩阵分解,通过有限次运算 可求出精确解。高斯消元法是一个古老的直接法,由它改进得到的选主元法,是目前计算机上常用于求低阶稠密矩阵方程组的有效方法,其特点就是通过消元将一般线性方程组的求解问题转化为三角方程组的求解问题。5.1.1高斯消去法 思想:把矩阵A化为一个上三角矩阵,从而将原方程组约化为容易求解的等价三角方程组,再通过回代过程既可逐一求出各未知数. 方法:逐列消元. 例: 矩阵形式:增广矩阵: 对A的第一列消元,进行行变换把A21,A31化为零: 对A的第二列消元,进行行变换把A32化为零:进一步: 计算x, 对于n阶方程组,增广矩阵为: 对第一列消元: 重新记为: 对第二列消元得到:继续消元过程,最后得到: 计算x的值:或者写成: 注1:在消元过程中所有不能为零. MATLAB程序: functionx=gauss1(A,B) %gauss消去法解线性方程组Ax=B n=length(B); C=[AB]; fori=1:n ifC(i,i)~=0 C(i,:)=C(i,:)/C(i,i); forj=i+1:n C(j,:)=C(j,:)-C(j,i)*C(i,:); end else error('对角线元素为零'); end end x(n)=C(n,n+1); fori=n-1:(-1):1 ss=C(i,i+1:end-1)*x(i+1:end)'; x(i)=C(i,n+1)-ss; end>>A=[231;111;1-2-1]; >>B=[9;4;-4]; >>x=gauss1(A,B) x= 121 >>A=[031;111;1-2-1]; >>x=gauss1(A,B) ???Errorusing==>gauss1 对角线元素为零注2:在消元过程中,若相对于该列中对角线以下的元素相比,其绝对值很小时,尽管消去运算可以进行下去,但是用其作除数,即使很小的舍入误差也会引起计算结果的严重扩散和失真。 例: 其准确到小数点后第9位的解为 但是若按照高斯消去法且在编程计算过程中采用4位浮点数求解,用第一个方程消去第二个方程的,得 回代以后解得 与我们的精确结果相比较,结果严重失真。其主要原因是除数太小,导致舍入误差增大,有效数字失效。若我们在消元前交换两个方程的位置,变为: 对上述方程组消元得到三角方程组 回代得解5.1.2高斯列主元消去法 优点: 解决直接消去法中的问题. 提高计算精度. 方法:消元过程中取该列中(尚未消元的行)绝对值最大的作为主元进行消元. 例:增广矩阵: 对第一列找主元‘381’进行行变换: 消元:对第二列选主元,消元 计算x在消元过程中不会出现待消的某列全为零的情况,否则A奇异.如: 方程: 得: >>A=[1e-162;11]; >>B=[2;3]; >>x=gauss1(A,B) x= 4.00001.0000 >>A\B ans= 2.0000 1.0000高斯列主元消去法程序: functionx=gauss2(A,B) %gauss列主元消去法解线性方程组Ax=B n=length(B); C=[A,B]; fori=1:n c=abs(C(i:end,i)); k=find((c-max(c))==0); k=k(1)+i-1; Ci=C(i,:); C(i,:)=C(k,:); C(k,:)=Ci;ifC(i,i)~=0 C(i,:)=C(i,:)/C(i,i); forj=i+1:n C(j,:)=C(j,:)-C(j,i)*C(i,:); end else error('矩阵A奇异'); end end x(n)=C(n,n+1); fori=n-1:(-1):1 ss=C(i,i+1:end-1)*x(i+1:end)'; x(i)=C(i,n+1)-ss; endfind()函数:找出非零元素. k=find(x)返回向量x的非零元素下标. [i,j]=find(X)返回矩阵X的非零元素下标. [i,j,v]=find(X)返回矩阵X的非零元素下标,同时返回非零元素的值. >>x=[11033055]; >>k=find(x) k= 135 >>y=x(find(x)) y= 113355>>find(x==0) ans= 24 >>x==0 ans= 01010 >>find(x>20) ans= 35>>M=[123;040] M= 123 040