数值分析列主元消去法的实验报告

合集下载

Gauss列主元素消去法实验

Gauss列主元素消去法实验

Lab06.Gauss 列主元素消去法实验【实验目的和要求】1.使学生深入理解并掌握Gauss 消去法和Gauss 列主元素消去法步骤; 2.通过对Gauss 消去法和Gauss 列主元素消去法的程序设计,以提高学生程序设计的能力;3.对具体问题,分别用Gauss 消去法和Gauss 列主元素消去法求解。

通过对结果的分析比较,使学生感受Gauss 列主元素消去法优点。

【实验内容】1.根据Matlab 语言特点,描述Gauss 消去法和Gauss 列主元素消去法步骤。

2.编写用不选主元的直接三角分解法解线性方程组Ax=b 的M 文件。

要求输出Ax=b 中矩阵A 及向量b ,A=LU 分解的L 与U ,det A 及解向量x 。

3.编写用Gauss 列主元素消去法解线性方程组Ax=b 的M 文件。

要求输出Ax=b 中矩阵A 及向量b 、PA=LU 分解的L 与U 、det A 及解向量x ,交换顺序。

4.给定方程组(1) ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--11134.981.4987.023.116.427.199.103.601.3321x x x(2) ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----15900001.582012151********.23107104321x x x x 先用编写的程序计算,再将(1)中的系数3.01改为3.00,0.987改为0.990;将(2)中的系数2.099999改为2.1,5.900001改为9.5,再用Gauss 列主元素消去法解,并将两次计算的结果进行比较。

【实验仪器与软件】1.CPU 主频在1GHz 以上,内存在128Mb 以上的PC ;2.Matlab 6.0及以上版本。

实验讲评:实验成绩:评阅教师:200 年 月 日Lab06.Gauss 列主元素消去法实验第一题:1、算法描述:Ⅰ、Gauss 消去法由书上定理5可知 设Ax=b ,其中A ∈R^(n(1)如果()0(1,2,....,1)k kka k n ≠=-,则可通过高斯消去法将Ax=b 约化为等价的 角形线性方程组,且计算公式为:① 消元计算(k=1,2,….,n-1)()()(1)()()(1)()()/,1,...,,,,1,...,,,1,...,.k k ik ik kk k k k ij ij ik kj k k k iiik k m a a i k n a a m a i j k n b b m b i k n ++==+=-=+=-=+② 回带公式()()()()()1/,()/,1,...,2,1.n n n n nn ni i i i iii j ii j i x b a x ba x a i n =+==-=-∑(2)如果A 为非奇异矩阵,则可通过高斯消去法将方程组Ax=b 约化方程组为上三角矩阵以上消元和回代过程总的乘除法次数为332333nn nn +-≈,加减法次数为32353263nnn n+-≈以上过程就叫高斯消去法。

Gauss列主元消去法实验

   Gauss列主元消去法实验

<数值计算方法>实验报告1.实验名称实验2 Gauss 列主元消去法2.实验题目用Gauss 列主元消去法求解线性方程组。

0.0011 2.0002 3.0003 1.0001.0001 3.7122 4.6233 2.0002.0001 1.0722 5.6433 3.000x x x x x x x x x ++=⎧⎪-++=⎨⎪-++=⎩3.实验目的加深自己对Gauss 列主元消去法的理解和认识,并且通过做实验或做练习来加强自己Gauss 列主元消去法的掌握,学会并灵活运用Gauss 列主元消去法来求解方程组。

4.基础理论-------Gauss 列主元消去法1.Gauss 列主元消去法的基本思想是:在进行第k (k=1,2,...,n-1)步消元时,从第k 列的kk a 及以下的各元素中选取绝对值最大的元素,然后通过行变换将它交换到主元素kk a 的位置上,再进行消元。

2.Gauss 列主元消去法的优点:当kk a (k=1,2,...,n-1)的绝对值很小时,用Gauss 列主元消去法来求解方程组时,可以避免所的数值结果产生较大误差或失真。

5.实验环境实验系统:Win 7实验平台:VisualC++语言6.实验过程写出算法→编写程序→计算结果Gauss 列元消去法的算法Input:方程组未知量的个数n;增广矩阵()()1,2,...,T ij A a A A An ==,其中i=1,2,…,n; j=1,2,…,n+1Output:方程组的解x1,x2,…,xn,或失败信息。

1. for i ←1ton-1 do;2. temp ←|ii a |;3. p ←I;4. for j ←i+1 to n do5. if ||ji a >temp then6. p ←j;8. end9. end10. if temp=0 then11. |return False;12. end13. if p ≠I then14. p A ⇔i A ;//i,p 两行交换15. end//列选主元16. for j ←i+1 to n do17.*j ji i A m A -ji m ←/ji ii a a ;18. j A ←*j ji i A m A -;//消元19. end7.实验结果原方程组的解为:X1=-0.490396 , x2=-0.051035 ,x3=0.3675208.附录程序清单#include<iostream.h> #include"stdio.h"#include"math.h"void main ( ){ int n=3,i,j,k,p;doubleA[10][10]={{0.001,2.000,3.000,1.000},{-1.000,3.712,4.623,2.000},{-2.0 00,1.072,5.643,3.000}},temp,m,x[100];for(i=0;i<n;i++){ //选主元temp=fabs(A[i][i]); p=i;for(k=i+1;k<n;k++)if(fabs(A[k][i])>temp){temp=fabs(A[k][i]); p=k;}if(temp==0){ printf("\n无法求解:");return;}if(p!=i)for(j=0;j<n+1;j++){ temp=A[i][j];A[i][j]=A[p][j];A[p][j]=temp;}//消元for(k=i+1;k<n;k++){ m=A[k][i]/A[i][i];for(j=i+1;j<=n;j++)A[k][j]=A[k][j]-m*A[i][j];}}//回代for(i=n-1;i>=0;i--){x[i]=A[i][n];for(j=i+1;j<n;j++)x[i]=x[i]-A[i][j]*x[j];x[i]=x[i]/A[i][i];}printf("\nx=\n");for(i=0;i<n;i++)printf("%f \n",x[i]);}。

高斯列主元消去法实验报告

高斯列主元消去法实验报告

《数值计算方法》实验报告专业:年级:学号:姓名:成绩:1.实验名称实验2高斯列主元消去法2. :用Gauss列主消去法求解线性方程组0.001*X1+2.000*X2+3.000*X3=1.000-1.000*X1+3.217*X2+4.623*X3=2.000-2.000*X1+1.072*X2+5.643*X3=3.0003.实验目的a.熟悉运用已学的数值运算方法求解线性方程—Gauss列主消去法;b.加深对计算方法技巧的认识,正确使用计算方法来求解方程;c.培养用计算机来实现科学计算和解决问题的能力。

4.基础理论列主元消去法:a.构造增广矩阵b.找到每列绝对值的最大数;c.行变换;d.消去;e.回代5.实验环境Visual C++语言6.实验过程实现算法的流程图:7.结果分析a.实验结果与理论一致;b.由于数值设置成双精度浮点型,所以初值对计算结果影响不大;c.运用程序能更好的实现计算机与科学计算的统一和协调。

8. 附录程序清单#include<stdio.h>#include<math.h>int main(){int n=3,i,j,k,p;double a[4][4];double b[4];double x[4];double m[4][4];double temp;a[1][1]=0.001; a[1][2]=2.000; a[1][3]=3.000; b[1]=1.000;a[2][1]=-1.000; a[2][2]=3.1712; a[2][3]=2.000; b[2]=2.000;a[3][1]=-2.000; a[3][2]=1.072; a[3][3]=5.643; b[3]=3.000;for(i=1;i<=n-1;i++){temp=a[i][i];p=i;for(j=i+1;j<=n;j++)if(fabs(a[j][i])>temp){temp=a[j][i];p=j;}if(temp==0)return 0;if(p!=i) //换行{for(j=1;j<=n;j++)a[0][j]=a[i][j];for(j=1;j<=n;j++)a[i][j]=a[p][j];for(j=1;j<=n;j++)a[p][j]=a[0][j];b[0]=b[i];b[i]=b[p];b[p]=b[0];}for(j=i+1;j<=n;j++){m[j][i]=a[j][i]/a[i][i];for(k=i;k<=n;k++)a[j][k]=a[j][k]-m[j][i]*a[i][k];}}if(a[n][n]==0)return 0;x[n]=b[n]/a[n][n];for(i=n-1;i>=1;i--)//回代{temp=0;for(j=i+1;j<=n;j++)temp=temp+a[i][j]*x[j];temp=b[i]-temp;x[i]=temp/a[i][i];}for(i=1;i<=n;i++)//输出结果{printf("输出结果为:x[%d]=%lf ",i,x[i]);}printf("\n");return 0;}。

列主元消去法解方程组

列主元消去法解方程组

数值分析上机实验报告(二)一、问题描述:利用列主元消去法求解下列方程组2X1+5X2+3X3 - 2X4=72X1- 2X2+3X3+5X4=-1X1+3X2+2X3+3X4=0X1+2X2+ X3 - 2X4=4二、算法原理:由高斯消去法知道,在消去过程中可能出现a kk(k)=0的情况,这时候消去法将无法进行,所以最好选取系数矩阵(或消元后的低阶矩阵)中绝对值最大的元素作为主元,以使高斯消去法具有较好的数值稳定性。

三、实验步骤:1、det 1;2、对于k=1,2,···,n-1(1)按列选主元|a ik.k|=max|a ik|(2)如果a i.k=0,则计算停止(det(A)=0)(3)如果i k=k则转(4)换行:a kj a ik·j(j=k,k+1,···,n)b k b ikdet -det(4)消元计算对于i=k+1,···,n○1am ik=a ik/a kk○2对于j=k+1,···,n a ij a ij—m ik*a kj○3b i b i-m ik*b ik(5)det a kk*det3、如果则计算停止(det(A)=0)4、回代求解(1)b n b n/a nn(2)对于i=n-1···,2,1bi(bi-∑aij*bj)/aii5.det ann*det四、实验框图五、源程序# include <stdio.h># include<math.h># define n 4main(){int i,j,k,l;float A[n][n],b[n],x[n],max;//输入系数矩阵及右端项for(i=0;i<n;i++)for(j=0;j<n;j++){printf("A[%d][%d]=",i,j);scanf("%f;",&A[i][j]);}for(i=0;i<n;i++){printf("b[%d]=",i);scanf("%f;",&b[i]);}//列主元消去过程for(k=0;k<n-1;k++){max=abs(A[k][k]);l=k;for(i=k+1;i<n;i++)if(abs(A[i][k])>max){max=abs(A[i][k]);l=i;} if(l>k){for(j=k;j<n;j++){max=A[k][j];A[k][j]=A[l][j];A[l][j]=max;}max=b[k];b[k]=b[l];b[l]=max;}for(i=k+1;i<n;i++){max=A[i][k]/A[k][k];for(j=k+1;j<n;j++)A[i][j]=A[i][j]-max*A[k][j];b[i]=b[i]-max*b[k];}}//回代过程x[n-1]=b[n-1]/A[n-1][n-1];for(k=1;k<n;k++){i=n-k-1;x[i]=b[i];for(j=i+1;j<n;j++)x[i]=x[i]-A[i][j]*x[j];x[i]=x[i]/A[i][i];}//输出解for(i=0;i<n;i++)printf("x[%d]=%f;",i,x[i]);getchar();}六、运行结果。

数值分析实验

数值分析实验

一、列主元消去法1.方法简介:列主元素消去法是为控制舍入误差而提出来的一种算法,在Gauss 消去法的消元过程中,若出现a=0,则消元无法进行,即使其不为0,但很小,把它作为除数,就会导致其他元素量级的巨大增长和舍入误差的扩散,最后使计算结果不可靠.使用列主元素消去法计算,基本上能控制舍入误差的影响,并且选主元素比较方便。

步骤:例如第1步消元——在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b)做初等行变换使原方程组转化为如下形式:第2步消元——在增广矩阵(A,b)中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:第3步消元——在增广矩阵(A,b)中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第三行交换,再对(A,b)做初等行变换使原方程组转化为:按x4 → x3→ x2→ x1 的顺序回代求解出方程组的解。

2.源代码:这里用MATLAB来写clearA=input('输入系数矩阵A:');b=input('输入b向量(按行向量):');B=[A b'];n=length(b);RA=rank(A);RB=rank(B);zhica=RB-RA;if zhica>0,disp('请注意:因为RA~=RB,所以此方程组无解.\n')returnendif RA==RBif RA==nfprintf('请注意:因为RA=RB=%d,所以此方程组有唯一解.\n',n)X=zeros(n,1);for p=1:n-1t=find(abs(B(p:end,p))==max(abs(B(p:end,p))))+p-1;if abs(B(t,p))~=abs(B(p,p))l=B(t,:);B(t,:)=B(p,:);B(p,:)=l;end%列主元判断for k=p+1:nm= B(k,p)/ B(p,p);B(k,p:n+1)= B(k,p:n+1)-m* B(p,p:n+1);endend%把方程组系数矩阵A化为同解的上三角矩阵b=B(1:n,n+1);A=B(1:n,1:n);X(n)=b(n)/A(n,n);for q=n-1:-1:1X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);endelsedisp('请注意:因为RA=RB<n,所以此方程组有无穷多解.')returnendenddisp('方程组的解为:');X ;3.实例:求解方程组:⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--000.3000.2000.1643.5072.1000.2623.4712.3000.1000.3000.2001.0321x x x运行代码,得:按要求输入A,得:输入b ,得到结果:4.感想:用MA TLAB 来写列主元消去法可以很方便的解决很多问题。

数值分析实验,用程序实现列主元消去法解方程组

数值分析实验,用程序实现列主元消去法解方程组

《数值分析》实验报告实验序号:实验二 实验名称: 列主元消去法解方程组 学号: 姓名:任课教师: 专业班级:)1、 实验目的:用列主元Gauss 消元法解n 阶线性代数方程组:⎪⎪⎩⎪⎪⎨⎧=+⋯++⋯⋯⋯⋯⋯=+⋯++=+⋯++nn nn 2n21n12n 2n 2221211n 1n 212111b a a a b a a a b a a a x x x x x x x x x 其基本做法是把上述方程组通过列主元Gauss 消元转化为一个等价的三角形方程组,然后再进行回代就可以求出方程组的解。

列主元消元的基本做法是选取系数矩阵的每一列中绝对值最大的作为主元,然后采取和顺序Gauss 消元法相同的步骤进行 ,求得方程组的解。

要求显示出每一个列主元以及每一大步消元后的系数矩阵),...,2,1(n k =(k )A 和常数项),...,2,1(n k =(k )b ,最后显示出方程组的解),...,2,1(n i x i =。

2、 实验内容:(1)实验分析:1. 列主元Gauss 消元法的算法思想:1. 输入增广矩阵B ;。

2. 对k =1,2,…,n ,循环:(a ) 按列选主元||:max ik ni j a a ≤≤=保存主元所在行的指标k i 。

(b ) 若a=0,则系数矩阵奇异,计算停止;否则,顺序进行。

(c ) 若k i =k 则转向(d );否则换行ki kj i b b nj a a k j k ↔=↔,...,2,1 ,(d ) 计算乘子.,...,1,/n k i a a a m ik kk ik ik +=⇒=(e ) 消元: nk i b m b b nk j i a m a a k ik i i kj ij ij ij ,...,1;:,...,1,;:+=-=+=-=3. 回代 1,...,1, ,/:1-=⎪⎪⎭⎫ ⎝⎛-=∑+=n n i a b a b b ii n i j j ij i i 用右端项b 来存放解x 。

数值分析实验报告高斯消元法和列主消元法

数值分析实验报告高斯消元法和列主消元法

《计算方法》实验指导书 实验三、高斯消元法和列主消元法一、实验目的:1. 通过matlab 编程解决高斯消元发和列主消元发来解方程组的问题, 加强编程能力和编程技巧,要熟练应用matlab 程序来解题,练习从数值分析的角度看问题进而来解决问题。

更深一步体会这门课的重要性,练习动手能力,同时要加深对数值问题的理解,要熟悉matlab 编程环境。

二、实验要求:用matlab 编写代码并运行高斯消元法和列主消元发来解下面的方程组的问题,并算出结果。

三、实验内容:用高斯消元法和列主消元法来解题。

1.实验题目:用高斯消元法和列主消元法来解下列线性方程组。

⎪⎪⎩⎪⎪⎨⎧−=+−−−=+−−=+−−=−+−.142,16422,0,13143214321432432x x x x x x x x x x x x x x x 2.实验原理高斯消元法:就是把方程组变成上三角型或下三角形的解法。

上三角形是从下往上求解,下三角形是从上向下求解,进而求得结果。

而列主消元法是和高斯消元法相类似,只不过是在开始的时候找出x1的系数的最大值放在方程组的第一行,再化三角形再求解。

3.设计思想高斯消元法:先把方程组的第一行保留,再利用第一行的方程将其余几行的含有x1的项都消去,再保留第二行,同理利用第二行的方程把第二行以下的几行的含有x2项的都消去,以此类推。

直到最后一行只含有一个未知数,化为上三角形,求得最后一行的这个未知数的值,再回带到倒数第二个方程求出另一个解,再依次往上回带即可求出这个方程组的值。

而列主消元法与高斯消元法类似,只不过在最开始时找出x1项系数的最大值与第一行交换再进行与高斯算法相似的运算来求出方程组的解。

4.源代码高斯消元法的程序:f unction [RA,RB,n,X]=gaus(A,b)B=[A b]; n=length(b); RA=rank(A);RB=rank(B);zhica=RB-RA;if zhica>0,disp('请注意:因为RA~=RB,所以此方程组无解.')returnendif RA==RBif RA==ndisp('请注意:因为RA=RB=n,所以此方程组有唯一X=zeros(n,1); C=zeros(1,n+1);for p= 1:n-1for k=p+1:nm= B(k,p)/ B(p,p);B(k,p:n+1)= B(k,p:n+1)-m*B(p,p:n+1);endendb=B(1:n,n+1);A=B(1:n,1:n);X(n)=b(n)/A(n,n);for q=n-1:-1:1X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);endelsedisp('请注意:因为RA=RB<n,所以此方程组有无穷多解.')endend在工作窗口输入程序:A=[1 -1 1 -3; 0 -1 -1 1;2 -2 -4 6;1 -2 -4 1];b=[1;0; -1;-1]; [RA,RB,n,X] =gaus (A,b)请注意:因为RA=RB=n,所以此方程组有唯一解.运行结果为:RA =4RB =4n =4X =-0.50000.5000.列主消元发的程序:function [RA,RB,n,X]=liezhu(A,b)B=[A b]; n=length(b); RA=rank(A);RB=rank(B);zhica=RB-RA;if zhica>0,disp('请注意:因为RA~=RB,所以此方程组无解.')returnendif RA==RBif RA==ndisp('请注意:因为RA=RB=n,所以此方程组有唯一解.')X=zeros(n,1); C=zeros(1,n+1);for p= 1:n-1[Y,j]=max(abs(B(p:n,p))); C=B(p,:);B(p,:)= B(j+p-1,:); B(j+p-1,:)=C;for k=p+1:nm= B(k,p)/ B(p,p);B(k,p:n+1)= B(k,p:n+1)-m*B(p,p:n+1);endendb=B(1:n,n+1);A=B(1:n,1:n);X(n)=b(n)/A(n,n);for q=n-1:-1:1X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);endelsedisp('请注意:因为RA=RB<n,所以此方程组有无穷多解.')endend在工作窗口输入程序:A=[1 -1 1 -3; 0 -1 -1 1;2 -2 -4 6;1 -2 -4 1];b=[1;0; -1;-1]; [RA,RB,n,X]=liezhu(A,b)请注意:因为RA=RB=n,所以此方程组有唯一解.运行结果为:RA =4RB =4n =4X =-0.50000.5000实验体会:通过这次实验我了解了高斯消元法和列主消元方法的基本思想,虽然这两个程序的编写是有点困难的,但运行起来还是比较容易的,解决了不少实际问题的计算。

列主元消去法

列主元消去法

实验二 列主元消去法一.实验目的:1. 了解列主元消去法的算法2. 可以正确地从给出的矩阵中选取列主元3. 会使用列主元消去法求线性代数方程组二.算法介绍:列主元素消去法是为控制舍入误差而提出来的一种算法,在Gauss 消去法的消元过程中,若出现a kk k )(=0,则消元无法进行,即使其不为0,但很小,把它作为除数,就会导致其他元素量级的巨大增长和舍入误差的扩散,最后使计算结果不可靠.使用列主元素消去法计算,基本上能控制舍入误差的影响,并且选主元素比较方便.1. 输入系数矩阵A,右端项b,阶n.2. 对k=1,2,…n-1,循环.a.按列选主元 a:=max ni k ≤≤︳a ik ︴,保留主元所在行的指标i k 。

b.若a=0,则系数矩阵奇异,计算停止;否则,顺序进行。

c.若i k =k ,则转向(d ),否则执行ai j k ,与a k j 互换,b i k与b k 互换。

d.计算算子m ik =a ik /a kk e .消元:b m b b a m a a kik i kjik ij ij i -==-:: i ,j=k+1,……,n 3.回代:a b a b b ii j ni j ij i i /)(:1∑+=-=,i=n.n-1, (1)三.程序代码:#include <iostream>#include <iomanip> #include<cmath>using namespace std;double a[100][100];//存储矩阵的二维数组int n; //阶数全局变量double result[100]; //存放解的数组double b[100]; //存放常数的数组double sum;void tip() //选择操作函数{cout<<"1、输入矩阵"<<endl;cout<<"2、退出运行"<<endl;}double input() //输入矩阵{ int i,k,j,x;cout<<"请输入矩阵阶数:"<<endl;cin>>n;cout<<"请输入增广矩阵:"<<endl;for(i=1;i<=n;i++){for(j=1;j<=n+1;j++){cin>>a[i][j];}}}double output(int k){int i,j,r;int f;double max,t;double result[50];max=a[n][k];for(i=n;i>=k;i--){if(fabs(max)<=fabs(a[i][k])) //选择列主元{r=i;max=a[r][k];}}cout<<"主元为"<<max<<endl;cout<<"所在坐标位置为("<<r<<","<<k<<")"<<endl;if(fabs(max)<0.01){cout<<"主元接近于零,方法失效!"<<endl;return 0;}else{if(max!=a[k][k]){for(j=k;j<=n+1;j++){t=a[k][j];a[k][j]=a[r][j];a[r][j]=t;}}}double m=0;for(i=k+1;i<=n;i++){m=a[i][k]/a[k][k]; //每一次两个方程间变量的值for(j=k+1;j<=n+1;j++){a[i][j]=a[i][j]-m*a[k][j];}}for(j=1;j<=k;j++){for(i=k+1;i<=n;i++){a[i][j]=0;}}for(i=1;i<=n;i++){for(j=1;j<=n+1;j++){cout<<setw(12)<<a[i][j];}cout<<endl;}cout<<resetiosflags(ios::left)<<endl; //输出格式为左对齐}double huidai(int n){int i,j;result[n]=a[n][n+1]/a[n][n];for(i=n-1;i>=1;i--){ sum=0;for(j=i+1;j<=n;j++){sum=a[i][j]*result[j]+sum;}result[i]=(a[i][n+1]-sum)/a[i][i];}}double root(int n){int i;cout<<"该方程组的解为"<<endl; //输出for(i=1; i<=n-1; i++){cout<<"X("<<i<<")="<<result[i]<<", ";}cout<<"X("<<n<<")="<<result[n]<<"."<<endl;}void sj(){int t=0;while(cin>>t&&(t==1)){input(); //调用输入函数int i;for(i=1;i<n;i++) //控制每完成一大步消元后得到的结果{cout<<"消元第"<<i<<"大步后矩阵变为:"<<'\n';output(i); //调用输出函数cout<<endl;}}}int main(){ tip();int t=0,i;while(cin>>t&&(t==1)){input(); // 调用输入函数for(i=1;i<n;i++){cout<<"消元第"<<i<<"大步后矩阵变为:"<<endl;output(i); // 调用输出函数}huidai(n); // 调用回代函数root(n); // 调用输出根函数tip();}system("pause");}四.运算结果(截屏)五.算法分析:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一 列主元消去法
【实验内容】
1.掌握列主元消去法的基本思路和迭代步骤
2.并能够利用列主元的高斯消去法解任意阶数的线性方程组;
3、从课后题中选一题进行验证,得出正确结果,交回实验报告与计算结果。

【实验方法与步骤】
1.列主元消去法基本思路
设有线性方程组Ax b =,设A 是可逆矩阵。

列主元消去法的基本思想就是通过列主元的选取将初等行变换作用于方程组的增广矩阵[]|B A b =,将其中的A 变换成一个上三角矩阵,然后求解这个三角形方程组。

2.列主元高斯消去法算法描述
将方程组用增广矩阵[]()(1)|ij n n B A b a ⨯+==表示。

步骤1:消元过程,对1,2,,1k n =-L
(1) 选主元,找{},1,,k i k k n ∈+L 使得
,max k i k ik k i n
a a ≤≤= (2) 如果,0k i k a =,则矩阵A 奇异,程序结束;否则执行(3);
(3) 如果k i k ≠,则交换第k 行与第k i 行对应元素位置,k kj i j a a ↔,
,,1j k n =+L ;
(4) 消元,对,,i k n =L ,计算/,ik ik kk l a a =对1,,1j k n =++L ,计算
.ij ij ik kj a a l a =-
步骤 2:回代过程:
(1) 若0,nn a =则矩阵奇异,程序结束;否则执行(2);
(2) ,1/;n n n nn x a a +=对1,,2,1i n =-L ,计算
,11/n i i n ij j ii j i x a a x a +=+⎛⎫=- ⎪⎝⎭

[实验程序]
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<conio.h>
#define NUMBER 20
#define Esc 0x1b
#define Enter 0x0d
using namespace std;
float A[NUMBER][NUMBER+1] ,ark;
int flag,n;
void exchange(int r,int k);
float max(int k);
void message();
void main()
{
float x[NUMBER];
int r,k,i,j;
char celect;
void clrscr();
printf("\n\nUse Gauss.");
printf("\n\n1.Jie please press Enter.");
printf("\n\n2.Exit press Esc.");
celect=getch();
if(celect==Esc)
exit(0);
printf("\n\n input n=");
scanf("%d",&n);
printf(" \n\nInput matrix A and B:");
for(i=1;i<=n;i++)
{
printf("\n\nInput a%d1--a%d%d and b%d:",i,i,n,i);
for(j=1;j<=n+1;j++) scanf("%f",&A[i][j]); }
for(k=1;k<=n-1;k++)
{
ark=max(k);
if(ark==0)
{
printf("\n\nIt’s wrong!");message();
}
else if(flag!=k)
exchange(flag,k);
for(i=k+1;i<=n;i++)
for(j=k+1;j<=n+1;j++)
A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k]; }
x[n]=A[n][n+1]/A[n][n];
for( k=n-1;k>=1;k--)
{
float me=0;
for(j=k+1;j<=n;j++)
{
me=me+A[k][j]*x[j];
}
x[k]=(A[k][n+1]-me)/A[k][k];
}
for(i=1;i<=n;i++)
{
printf(" \n\nx%d=%f",i,x[i]);
}
message();
}
void exchange(int r,int k)
{
int i;
for(i=1;i<=n+1;i++)
A[0][i]=A[r][i];
for(i=1;i<=n+1;i++)
A[r][i]=A[k][i];
for(i=1;i<=n+1;i++)
A[k][i]=A[0][i];
}
float max(int k)
{
int i;
float temp=0;
for(i=k;i<=n;i++)
if(fabs(A[i][k])>temp)
{
temp=fabs(A[i][k]);
flag=i;
}
return temp;
}
void message() {
printf("\n\n Go on Enter ,Exit press Esc!"); switch(getch())
{
case Enter: main();
case Esc: exit(0);
default:{printf("\n\nInput error!");message();} }
}
【实验结果】。

相关文档
最新文档