使用列主元消元法解方程组 c语言代码

合集下载

高斯列主元消去法解线性方程组VC++课程设计报告

高斯列主元消去法解线性方程组VC++课程设计报告

课程设计报告一.课程设计目的:采用高斯列主元消去法解线性方程组。

用C 语言或C ++设计一个程序来通过高斯列主元消去法解线性方程组AX=b 的解。

二.课程设计的内容1. 课程设计的题目及简介题目:高斯列主元消去法解线性方程组。

简介:对线性方程组AX =b 等价于⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n n nn n n n n b b b x x x a a a a a a a a a 2121212222111211方法说明(以4阶为例):(1)第1步消元——在增广矩阵(A ,b )第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A ,b )做初等行变换使原方程组的第一列元素除了第一行的全变为0;(2)第2步消元——在增广矩阵(A ,b )中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为: ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡******00**00***0****4321x x x x 注:*代表非零的数。

(3)第3步消元——在增广矩阵(A ,b )中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为: ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡*****000**00***0****4321x x x x(4)按x4 → x3→ x2→ x1 的顺序回代求解出方程组的解。

此方法即高斯列主元消去法,若在变换的过程中没有选出绝对值最大的数放在最前面进行消元而求出未知数的方法就叫高斯消去法。

高斯消去法有一很明显的缺点,即在消元的过程中可能出现小主元,这种小主元可能导致解的不稳定,为了避免小主元的出现正是高斯列主元消去法的主要目的。

而通过每次消元之前的调换方程的次序也正是计算机实现高斯列主元消去法的关键。

《数值计算方法》试题集及答案 (2)

《数值计算方法》试题集及答案 (2)

《数值计算方法》复习试题一、填空题:1、⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡----=410141014A ,则A 的LU 分解为A ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦。

答案:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=15561415014115401411A 3、1)3(,2)2(,1)1(==-=f f f ,则过这三点的二次插值多项式中2x 的系数为 ,拉格朗日插值多项式为 。

答案:-1,)2)(1(21)3)(1(2)3)(2(21)(2--------=x x x x x x x L4、近似值*0.231x =关于真值229.0=x 有( 2 )位有效数字;5、设)(x f 可微,求方程)(x f x =的牛顿迭代格式是( );答案)(1)(1n n n n n x f x f x x x '---=+6、对1)(3++=x x x f ,差商=]3,2,1,0[f ( 1 ),=]4,3,2,1,0[f ( 0 );7、计算方法主要研究( 截断 )误差和( 舍入 )误差;8、用二分法求非线性方程 f (x )=0在区间(a ,b )内的根时,二分n 次后的误差限为( 12+-n a b );10、已知f (1)=2,f (2)=3,f (4)=5.9,则二次Newton 插值多项式中x 2系数为( 0.15 ); 11、 解线性方程组A x =b 的高斯顺序消元法满足的充要条件为(A 的各阶顺序主子式均不为零)。

12、 为了使计算32)1(6)1(41310---+-+=x x x y 的乘除法次数尽量地少,应将该表达式改写为11,))64(3(10-=-++=x t t t t y ,为了减少舍入误差,应将表达式19992001-改写为199920012+ 。

13、 用二分法求方程01)(3=-+=x x x f 在区间[0,1]内的根,进行一步后根的所在区间为 0.5,1 ,进行两步后根的所在区间为 0.5,0.75 。

列主元消去法解方程组实验报告

列主元消去法解方程组实验报告

实验名称:列主元消去法解方程组1 引言我们知道,高斯消去法是一个古老的解线性方程组的方法。

而在用高斯消去法解Ax=b时,其中设A为非奇异矩阵,可能出现的情况,这时必须进行带行交换的高斯消去法。

但在实际计算中即使但其绝对值很小时,用作除数,会导致中间结果矩阵元素数量级严重增长和舍入误差的扩散,使得最后的结果不可靠。

因此,小主元可能导致计算的失败,我们应该避免采用绝对值很小的主元素。

为此,我们在高斯消去法的每一步应该在系数矩阵或消元后的低阶矩阵中选取绝对值最大的元素作为主元素,保持乘数,以便减少计算过程中舍入误差对计算解的影响。

一种方式是完全主元消去法,这种消去法是在每次选主元时,选择为主元素。

这种方法是解低阶稠密矩阵方程组的有效方法,但这种方法在选取主元时要花费一定的计算机时间。

实际计算中我们常采用部分选主元的的消去法。

列主元消去法即在每次选主元时,仅依次按列选取绝对值最大的元素作为主元素,且仅交换两行,再进行消元计算。

2 实验目的和要求运用matlab编写一个.m文件,要求用列主元消去法求解方程组(实现PA=LU):要求输出以下内容:(1)计算解x;(2) L,U;(3)整形数组IP(i)(i=1,2,…,n-1)(记录主行信息)3 算法原理与流程图(1)算法原理设有线性方程组Ax=b,其中设A为非奇异矩阵。

方程组的增广矩阵为第1步(k=1):首先在A的第一列中选取绝对值最大的元素,作为第一步的主元素:,然后交换(A,b)的第1行与第i1行元素,再进行消元计算。

设列主元素消去法已经完成第1步到第k-1步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组第k步计算如下:对于k=1,2,…,n-1(1)按列选主元:即确定ik使(2)如果,则A为非奇异矩阵,停止计算。

(3)如果ik≠k,则交换[A,b]第ik行与第k行元素。

(4)消元计算消元乘数满足:(5)回代求解计算解在常数项b(n)内得到。

高斯列主元消元法的VC语言代码

高斯列主元消元法的VC语言代码

【这是自己编写的程序,请自己阅读着使用。

】/*shuzhi1*/#include <stdio.h>#define C 3void main(){float A[C][C];float b[C];float X[C];float t,r,s;int i,j,k,m,n;printf("Please input A:\n");for(i=0;i<=C-1;i++){for(j=0;j<=C-1;j++)scanf("%f",&A[i][j]);}printf("The data in the computer is:\nA=\n");for(i=0;i<=C-1;i++){for(j=0;j<=C-1;j++)printf("%4.4f ",A[i][j]);printf("\n");} /*A数据的输入与检验*/printf("Is there any mistake? Press 1 for yes,Press 0 for no! ");scanf("%d",&k);for(;k==1;){printf("Please input the adress(i,j) of the error data: ");scanf("%d",&i);scanf("%d",&j);printf("Please input the right data: ");scanf("%f",&t);A[i-1][j-1]=t;printf("The data in the computer is:\nA=\n");for(i=0;i<=C-1;i++){for(j=0;j<=C-1;j++)printf("%4.4f ",A[i][j]);printf("\n");}printf("Is there any mistake? Press 1 for yes,Press 0 for no! ");scanf("%d",&k);} /*修改出错数据*/printf("Please input b:\n");for(i=0;i<=C-1;i++)scanf("%f",&b[i]);printf("The data in the computer is:\nb=\n");for(i=0;i<=C-1;i++)printf("%4.4f ",b[i]); /*b数据的输入与检验*/printf("\nIs there any mistake? Press 1 for yes,Press 0 for no! ");scanf("%d",&k);for(;k==1;){printf("Please input the adress(i) of the error data: ");scanf("%d",&i);printf("Please input the right data: ");scanf("%f",&t);b[i-1]=t;for(i=0;i<=C-1;i++)printf("%4.4f ",b[i]);printf("\nIs there any mistake? Press 1 for yes,Press 0 for no! ");scanf("%d",&k);} /*修改出错数据*//*选择主元*/for(i=0;i<=C-2;i++){for(j=i+1;j<=C-1;j++){if(A[i][i]<=0)r=-A[i][i];elser=A[i][i];if(A[j][i]<=0)s=-A[j][i];elses=A[j][i];if (r<s){for(k=0;k<=C-1;k++){t=0;t=A[j][k];A[j][k]=A[i][k];A[i][k]=t; /*交换A[i]与A[j]*/}t=0;t=b[j];b[j]=b[i];b[i]=t; /*交换b*/}}printf("After %d change,the the A and b are:\n\n",i+1);for(m=0;m<=C-1;m++){for(n=0;n<=C-1;n++)printf("%4.4f ",A[m][n]);printf("b[%d]=%4.4f ",m+1,b[m]);printf("\n");}printf("\n"); /*打印变化后的数组*/for(m=i+1;m<=C-1;m++){t=(-A[m][i]);for(n=0;n<=C-1;n++)A[m][n]=A[m][n]+(A[i][n]/A[i][i])*t;b[m]=b[m]+b[i]/A[i][i]*t;}for(m=0;m<=C-1;m++){for(n=0;n<=C-1;n++)printf("%4.4f ",A[m][n]);printf("b[%d]=%4.4f ",m+1,b[m]);printf("\n");}printf("\n");} /*主元消零并打印当前数组*//*迭代求X[C]*/for(i=0;i<=C-1;i++)X[i]=0;for(i=C-1;i>=0;i--){t=0;for(j=i+1;j<=C-1;j++)t=t+A[i][j]*X[j];X[i]=(b[i]-t)/A[i][i];}printf("The answer of 'Ax=b' is:\n");for(i=0;i<=C-1;i++)printf("X[%d]=%4.4f ",i,X[i]);printf("\n");/*程序结束*/}。

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

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

《数值分析》实验报告实验序号:实验二 实验名称: 列主元消去法解方程组 学号: 姓名:任课教师: 专业班级:)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 。

c语言解方程组

c语言解方程组

c语言解方程组C语言是一种广泛使用的编程语言,被广泛应用于硬件控制、嵌入式系统、操作系统、网络通信等领域。

但是,C语言也可以用来解方程组,本文将详细介绍如何利用C语言进行方程组求解。

第一步:了解方程组的基本概念方程组是数学中的一个概念,它由若干个方程式组成,并且这些方程式都包含有若干个未知数。

例如,下面是一个方程组的例子:3x + 2y = 84x - 3y = 1在这个方程组中,有两个未知数x和y,分别代表两个变量。

同时,方程组有两个方程式,每个方程式都包含两个未知数。

第二步:利用高斯-若尔当消元法进行方程组求解高斯-若尔当消元法是一种求解线性方程组的方法,它可以有效地将方程组化简为一个上三角矩阵,从而求出方程组的解。

下面是解方程组的具体步骤:1. 将方程组写成增广矩阵的形式,例如上述例子可以写成如下形式:3 2 | 84 -3 | 1其中,第一列和第二列是方程组中未知数的系数,第三列是等式右边的常数项。

2. 通过列主元素消去法将增广矩阵化成上三角矩阵的形式。

具体方法是:(1)如果第一行的主元素为0,则交换第一行和下面的某一行,使得主元素不为0。

(2)对第一列以下的行,将它们的第一列系数变为0。

具体方法是:对于第k行,将第k行的所有元素乘以第一行的第一个元素,然后将得到的结果从第一行中对应的元素上减去。

(3)用相同的方法对第二列以下的行重复操作,得到一个上三角矩阵。

3. 回代求解。

从最后一行开始,依次求出各个未知数的值。

具体方法是:对于第k个未知数(从最后一个开始),先求出它在第k行中的取值,然后代入到第k-1行中计算第k-1个未知数的取值,以此类推。

第三步:用C语言实现高斯-若尔当消元法在C语言中,可以用二维数组来表示增广矩阵。

例如,上述例子可以写成如下形式:int matrix[2][3] = {{3, 2, 8},{4, -3, 1}};接下来,可以编写C语言代码来实现高斯-若尔当消元法。

课程设计报告-高斯列主元消元法解线性方程组

课程设计报告-高斯列主元消元法解线性方程组

《计算机数值方法》课程设计报告题目高斯列主元消元法解线性方程组学生姓名班级学号成绩指导教师学号:姓名:题目:用高斯列主元消元法解线性方程组内容用C 语言编写软件完成以下任务:用高斯列主元消元法解下列线性方程组:⎪⎩⎪⎨⎧=++=++=++53367435522321321321x x x x x x x x x指导教师和学生签字指导教师:____ ____ 学生签名:_____ ___成绩:教师评语:目录一、程序设计题目 (1)二、需求分析(高斯列主元消元法) (1)三、程序流程图 (3)四、核心技术的实现方法及程序段 (7)五、个人总结 (9)六、参考文献 (9)七、源程序 (10)一、程序设计题目用C 语言编写软件完成以下任务:用高斯列主元消元法解下列线性方程组:⎪⎩⎪⎨⎧=++=++=++53367435522321321321x x x x x x x x x二、需求分析(高斯列主元消元法)⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n n nn n n n n b b b x x x a a a a a a a a a 2121212222111211方法说明(以4阶为例):第1步消元——在增广矩阵(A ,b )第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A ,b )做初等行变换使原方程组转化为如下形式:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡*******0***0***0****4321x x x x第2步消元——在增广矩阵(A ,b )中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡******00**00***0****4321x x x x第3步消元——在增广矩阵(A ,b )中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡*****000**00***0****4321x x x x按x 4 → x 3→ x 2→ x 1 的顺序回代求解出方程组的解 附:下面三种变换称为初等行变换: ① 对调两行;② 以数k ≠0乘某一行中的所有元素;③ 把某一行所有元素的k 倍加到另一行对应的元素上去。

高斯列主消元法求解方程 c语言程序报告

高斯列主消元法求解方程  c语言程序报告

HUNAN UNIVERSITY 程序设计训练报告专业班级材料科学与工程四班指导老师院长 (系主任)2012 年6 月30 日目录1 软件开发平台 (1)2 软件功能说明 (1)2.1 功能分析说明 (1)2.2 功能说明图 (4)3 软件设计详细内容 (5)3.1 采用的主要数据结构类型 (5)3.2 流程图 (5)4 软件测试 (11)4.1 软件测试用例 (11)4.2 软件测试报告 (16)5 总结和致谢 (16)6 附录 (17)6.1 源码 (17)6.2 二人分工说明 (22)6.3 参考文献 (22)1软件开发平台Visul C++ 6.02软件功能说明用高斯列主消元法求解方程个数不超过15个的线性方程组2.1 功能分析说明线性方程组可以表示为以下形式:通解于:方程等价于AX=b对其增广矩阵进行初等行换不改变方程组的解,从而将其化为简单形式来求解方程组。

|A|= (-1)21(j j t)3jn j a11j a22j…a njn&calculate(intn,int m)功能:quanpailie_A()功能: 计算一个全排列(-1)21(j j t )3jn j a 11j a 22j …a njn 的值gauss_row_xiaoqu()功能: 将增广矩阵通过交换两行的方法使得第一列中a 11绝对值最大第二行各元素分别减去第一行对应元素的a 21/a 11倍,使得a 21化为零; 第三行各元素分别减去第一行对应元素的a 31/a 11倍,使得a 31化为零; 同理将a 31,a 41…a 1n 都化为零;通过交换两行的方法使得第一列中a 22绝对值最大第三行各元素分别减去第二行对应元素的a 32/a 22倍,使得a 32化为零; 第四行各元素分别减去第二行对应元素的a 42/a 22倍,使得a 42化为零; 同理将a 32,a 42…a 2n 都化为零;以此类推,可将主对角线下的元素全化为零,变为上三角矩阵。

《计算方法》复习题参考答案

《计算方法》复习题参考答案

《计算方法》练习题一练习题第1套参考答案一、填空题1. 14159.3=π的近似值3.1428,准确数位是( )。

2.满足d b f c a f ==)(,)(的插值余项=)(x R ( )。

3.设)}({x P k 为勒让德多项式,则=))(),((22x P x P ( )。

4.乘幂法是求实方阵( )特征值与特征向量的迭代法。

5.欧拉法的绝对稳定实区间是( )。

二、单选题1.已知近似数,,b a 的误差限)(),(b a εε,则=)(ab ε( )。

A .)()(b a εε B.)()(b a εε+ C.)()(b b a a εε+ D.)()(a b b a εε+ 2.设x x x f +=2)(,则=]3,2,1[f ( )。

A.1 B.2 C.3 D.43.设A=⎥⎦⎤⎢⎣⎡3113,则化A为对角阵的平面旋转=θ( ). A.2πB.3πC.4π D.6π4.若双点弦法收敛,则双点弦法具有( )敛速.A.线性 B.超线性 C.平方 D.三次5.改进欧拉法的局部截断误差阶是( ).A .)(h o B.)(2h o C.)(3h o D.)(4h o三、计算题1.求矛盾方程组:⎪⎩⎪⎨⎧=-=+=+2423212121x x x x x x 的最小二乘解。

2.用4=n 的复化梯形公式计算积分⎰211dx x ,并估计误差。

3.用列主元消元法解方程组:⎪⎩⎪⎨⎧=++=++=++426453426352321321321x x x x x x x x x 。

4.用雅可比迭代法解方程组:(求出)1(x )。

c语言 多元一次方程组

c语言 多元一次方程组

c语言多元一次方程组多元一次方程组是数学中一个重要的概念,它涉及到多个未知数和多个方程的关系。

在计算机科学和工程领域中,解决多元一次方程组的问题也是非常常见的。

本文将介绍多元一次方程组的基本概念、求解方法以及在实际问题中的应用。

一、多元一次方程组的定义和特点多元一次方程组是由多个未知数和多个线性方程组成的方程组。

它的一般形式可以表示为:a1x1 + a2x2 + ... + anxn = b1a1'x1 + a2'x2 + ... + an'xn = b2...a1''x1 + a2''x2 + ... + an''xn = bn其中,x1, x2, ..., xn为未知数,a1, a2, ..., an为系数,b1, b2, ..., bn为常数。

多元一次方程组的特点是:1. 方程个数和未知数个数相等。

2. 方程中的各个项的指数都为1,即多元一次方程组是线性方程组的特例。

二、多元一次方程组的求解方法1. 列主元消元法列主元消元法是求解多元一次方程组的常用方法,它的基本思想是通过消元和代入的方式逐步求解未知数。

具体步骤如下:a. 将方程组写成增广矩阵的形式。

b. 选取一个主元,通常选择系数绝对值最大的方程的首项系数作为主元。

c. 通过消元操作,将其他方程的首项系数变为0。

d. 重复上述步骤,直到得到上三角形式的矩阵。

e. 通过回代得到未知数的解。

2. 矩阵求逆法矩阵求逆法是另一种求解多元一次方程组的方法,它基于矩阵的逆运算。

具体步骤如下:a. 将方程组写成矩阵的形式。

b. 计算矩阵的行列式,如果行列式为0,则矩阵不存在逆矩阵,方程组无解。

c. 如果行列式不为0,计算矩阵的逆矩阵。

d. 将逆矩阵与常数矩阵相乘,得到未知数的解。

三、多元一次方程组的应用多元一次方程组在实际问题中有着广泛的应用,如物理学、经济学、工程学等领域。

以下是一些多元一次方程组的实际应用案例:1. 电路分析在电路分析中,常常需要解决电路中的电流和电压分布问题。

列主元素消去法求解方程组

列主元素消去法求解方程组

列主元素消去法求解方程组[摘 要]在自然科学和工程中有很多问题的解决归结为求解线性方程组或者非线性方程组的数学问题。

例如,电学中的网络问题,用最小二乘法求实验数据的曲线拟合问题,三次样条的插值问题等等。

求解线性方程组的直接法主要有选主元高斯消去法、平方根法、追赶法等。

列主元素消去法既是选主元高斯消去法的一种,也是实际计算中常用的部分选主元消去法。

本文即是讨论利用列主元素消去法求解线性方程组问题。

[关键词]按列选主元 交换 消元 回代一 列主元素消去法背景在科学研究和工程技术中有许多问题可归结为求解线性代数方程组,其中所产生的线性方程组,其系数矩阵大致可分为两种:一种是低阶稠密矩阵;另一类是大型稀疏矩阵(此类矩阵阶数高,但零元素较多)。

对于这两种矩阵,我们可以把线性代数方程组的数值解法大致的分为两类:直接法和迭代法。

迭代法一般用来求解大型稀疏矩阵方程组(本文不予讨论);直接法是目前计算机上解低阶稠密矩阵的有效方法,如果计算过程中没有舍入误差,则此种方法通过有限步四则运算可求的方程组的精确解,但实际计算中由于舍入误差的存在和影响,这种方法也只能求得方程组的近似解。

直接法主要有选主元素高斯消去法、平方根法、追赶法等。

本文所要讨论的列主元素消去法就是选主元素高斯消去法中的一种。

高斯消去法是一个古老的求解线性方程组的方法,也是解线性方程组问题中较为常见的一种数值方法。

但在采取高斯消去法解方程组时,当采用绝对值很小的主元素时,可能导致计算结果的失败,故在消去法中应避免采用绝对值很小的主元素。

对于一般的线性方程组,需要引进选主元的技巧,即在高斯消去法的每一步应该在系数矩阵或消元后的低价矩阵中选取绝对值最大的元素作为主元素,保持乘数1 ik m ,以便减少计算过程中舍入误差对计算解的影响。

选主元素消元法则是对高斯消去法的改进,是解低价稠密矩阵方程组的有效方法。

选主元素消元法则避免了采用绝对值很小的主元素。

选主元素消去法主要有完全主元素消去法与列主元素消去法两种。

数值分析计算实习题列主元高斯消去法解线性方程组

数值分析计算实习题列主元高斯消去法解线性方程组

数值分析计算实习题第5章解线性方程组的直接方法【选题列主元高斯消去法解线性方程组。

书上的计算实习题1、2、3都要求用列主元高斯消去法解线性方程组,所以考虑写一个普适的程序来实现。

对于线性方程组Ax二b,程序允许用户从文件读入矩阵数据或直接在屏幕输入数据。

文件输入格式要求:(1)第一行为一个整数n (2<=n<=100),表示矩阵阶数。

(2)第2~n+l行为矩阵A各行列的值。

(3)第n+2~n+n+2行为矩阵b各行的值。

屏幕输入:按提示输入各个数据。

输出:A. b、det(A).列主元高斯消去计算过程、解向量X。

【算法说明】设有线性方程组Ax=b,其中设A为非奇异矩阵。

方程组的增广矩阵为«12«21[Nb] =第1步(k=l ):首先在A的第一列中选取绝对值最大的元素®I,作为第一步的主元素:«|| H0然后交换(A, b)的第1行与第I行元素,再进行消元计算。

设列主元素消去法已经完成第1步到第k・l步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组 A(k)x=b(k)4? …4;)…唸)•忒••輕■[A.b]T[A ⑹,b")] = ••■咲■■■■■* *■〃伏)・• - %■第k步计算如下: 对于 k=l, 2, •…,0-1(1)按列选主元:即确定t使(2)如果tHk,则交换[A, b]第t行与第k行元素。

(3)消元计算54* J 叫=一鱼(=^ + 1,…,H)% 吗 <-«y + 〃如伽 (fJ = R + l,…/)b- <-勺+加汝仇, (i = /c + l,…,《)消元乘数mik 满足:n (%-D 内)X1 < ------ -- ---- 9(j = « 一 1,«一2■…J)tk M 1,(,=斤 +1, •••,«)fet e(4)回代求解【程序】/*【普适列主元消去法解线性方程组】对于线性方程组:Ax=b 输入:[选择屏幕直接输入]1.A的行阶数n(l <= 11<= 100)2.A的值3.b的值[选择读取文件1文件名(和主程序同级文件夹下)输出:I.A2・b3・ det(A)4解向疑X */#inciude <stdio.h>#include <stdlibJi>#include <niath.h> double A[1051(J05LA_B[I05][105Lb[105].x[105];double det A:int n.mark = 1;〃读入数据void input(){int ij:char ch[20],name[ 100];HLE *f;printf("\iv-An是否从文件读取数据(Y/N):”); scanf(”%st&ch);if(ch[0] = Y II ch[0] = y)( prinif(“请输入文件名(包括扩展需):"); scanf("%s".name):f = fop cn(namc「T');fscanfCf/'%d'\&n);ford = 0:i < n;i 卄) for(j = 0;j < nJ ++) fscanf(f,'*%ir\&A[i]|j)):for(i = 0:i < n;i卄)fscanf(「%F・&b[i]);else{prin氓”请输入A的阶数:”);scanf( '%d %d\&n): prinifC请输入A的值:”);for(i = 0:i V n:i ++)for(j = 0;j < n:j ++) scanf("%lf\&A[i]U]);phnifC请输入b的值:”);for(i = 0:i < n;i 卄)scanf(''%lf\&b[i]):〃讣算行列式的值double det{double s[105](105] jni m){int z.jkdouble b[105][105Klotal = 0.r; /*b[Nl[N]用于存放,在矩阵s[Nl[N冲元素s[0]的余子式灯if(m>2){for(z = 0:z V m:z++){for(j = 0;j V m ・ 1 j ++)for(k = 0:k vn卜l;k ++)if(k >= z)bUKk] = sU+l](k+l];elsebLi][k] = s[j+l][k];if(z % 2==0)r=s[0)⑵ * dcKb.m - 1):/*递归调用制elser= (-1) * s[0](z] * det(b.m -1);total = total + r;else if(m == 2)total = s[0][0] *s(l][l]-s[0](l] *s[l][01:else if(m == 1)total =s[0][0];return total;// 输出A^llb和dcl(A)void ouipui_l(){ int i j;primlTAW);for(i = 0;i < n:i ++){ for(j = 0:j < n:j ++)p rintf('-%15.4f\A[i]lj]);prinif(W);prinlf(5b = \rf);for{i = 0;i < n:i ++)prinif("%15.4l\iV\b[i]):printf("\ndet(A) = %・4f\n”・dclA);//主il•算函数void couni_x(){int ij,k:int max; double tmpjnik;〃构造增广矩阵for{i = 0;i<n:i++){for。

使用列主元消元法解方程组c语言代码

使用列主元消元法解方程组c语言代码

使用列主元消元法解方程组c语言代码使用列主元消元法解方程组c语言代码# include# include# define N 3main(){int i,j,k,h,s,m,n,z;float max(float *y);float A[N][N+1],B[N],ma,t,M[N]={0},X;float x[N];/*输入系数矩阵*/for(i=0;i<n;i++)< p="">for(j=0;j<n+1;j++)< p="">scanf("%f",&A[i][j]);printf("向命令窗口输入的曾广矩阵是:\n");for(i=0;i<n;i++)< p="">{for(j=0;j<n+1;j++)< p="">printf("%2.1f ",A[i][j]);printf("\n");}/*正消过程*/for (i=0;i<n-1;i++)< p="">{/*找出每行最大的值*/for (j=i;j<n;j++)< p="">B[j-i]=A[j][i];ma=max(B);for (s=0;s<n;s++)< p="">B[s]=0;/* 交换最大值行和当前行*/if(ma!=0){for (k=i;k<n;k++)< p="">if (A[i][i]!=ma && A[k][i]==ma && ma!=0) {for (h=0;h<n+1;h++)< p="">{t=A[i][h];A[i][h]=A[k][h];A[k][h]=t;}}}else{ printf("A是非奇异矩阵!\n");break;}/* 消去过程*/for (m=i+1;m<n;m++)< p="">M[m]=A[m][i]/A[i][i];for (n=i+1;n<n;n++)< p="">{for (z=0;z<n+1;z++)< p="">A[n][z]=A[n][z]-M[n]*A[i][z];}for (m=0;m<n;m++)< p="">M[m]=0;}/*输出三角矩阵*/printf("通过高斯列主元消去法化成的上三角曾广矩阵是:\n"); for(i=0;i<n;i++)< p="">{for(j=0;j<n+1;j++)< p="">printf("%2.1f ",A[i][j]);printf("\n");}/*回带过程*/x[N-1]=A[N-1][N]/A[N-1][N-1];for(i=N-2;i>0 || i==0;i--){for(j=N-1;j>i;j--)X=X+A[i][j]*x[j];x[i]=(A[i][N]-X)/A[i][i];X=0;}/*将方程的解输出*/printf("该方程组的解依次为:\n"); for(i=0;i<n;i++){< p="">printf("x[%d]=%2.1f ",i+1,x[i]); }}/*计算最大值函数*/float max(float *y){int w;float max=y[0];for (w=0;w<n;w++)< p=""> if (fabs(y[w])>fabs(max)) max=y[w];return max;}</n;w++)<></n;i++){<></n+1;j++)<></n;i++)<></n;m++)<></n+1;z++)<></n;n++)<></n;m++)<></n+1;h++)<></n;k++)<></n;s++)<></n;j++)<></n-1;i++)<></n+1;j++)<></n;i++)<></n+1;j++)<></n;i++)<>。

列主元素消去法解方程组

列主元素消去法解方程组

#include<math.h>#include<stdio.h>#include<iostream.h>#define NUMBER 20float A[NUMBER][NUMBER+1],ark;int flag,n;void exchange(int r,int k);float max(int k);void message();int main(){float x[NUMBER];int r,k,i,j;char celect;cout<<"列主元素消去法解方程"<<endl;cout<<"制作:armahc"<<endl;cout<<endl;cout<<"输入操作符解方程请输入字母e"<<endl;cin>>celect;cout<<"输入方程维数n=";cin>>n;cout<<"输入系数矩阵A和向量B"<<endl;for(i=1;i<=n;i++){printf("输入a%d1--a%d%d系数和向量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){cout<<"不合法输入"<<endl;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();return 0;}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(){char asd;cout<<endl;cout<<"继续解方程请输入字母e"<<endl;cin>>asd;switch(asd){case 'e': main();default:{cout<<"不合法输入"<<endl;message();}}}。

顺序消元与列主元消元C++

顺序消元与列主元消元C++

一.实验题目用下列方法解线性方程组⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡9237.164231.183941.65342.90147.06721.109998.42371.13142.17643.89317.44129.35435.15330.27875.15301.04017.3651.118326.31348.14321x x x x 并比较计算结果精度(1)顺序消元法;(2)列主元消元法二.实验代码1.顺序消元法#include<iostream>using namespace std;#define N 4//方程阶数void main(){double a[N][N]={{1.1348,3.8326,1.1651,3.4017},{0.5301,1.7875,2.5330,1.5435},{3.4129,4.9317,8.7643,1.3142},{1.2371,4.9998,10.6721,0.0147}};double b[N]={9.5342,6.3941,18.4231,16.9237};double m[N][N]; double x[N];int k,i,j;//消元计算,将方程组约化为三角形方程组for(k=0;k<=N;k++){for(i=k+1;i<N;i++){m[i][k]=a[i][k]/a[k][k];for(j=k+1;j<N;j++){a[i][j]-=m[i][k]*a[k][j];}b[i]-=m[i][k]*b[k];}}for(i=0;i<N;i++){for(j=0;j<N;j++){cout<<a[i][j]<<" ";}cout<<endl;}for(i=0;i<N;i++)cout<<b[i]<<endl;//回代求解double t=0.0;x[N-1]=b[N-1]/a[N-1][N-1];for(i=N-2;i>=0;i--){x[i]=b[i];for(j=i+1;j<N;j++){x[i]-=a[i][j]*x[j];}x[i]/=a[i][i];}//输出方程组的解cout<<"方程的解依次为"<<endl; for(i=0;i<N;i++){cout<<"x["<<i+1<<"]="<<x[i]<<endl;}}2.列主元消元法#include<iostream>#include<cmath>using namespace std;#define N 4//方程阶数void display(double (*a)[N],double *b) {for(int i=0;i<N;i++){for(int j=0;j<N;j++){cout<<a[i][j]<<" ";}cout<<b[i]<<endl;}}void main(){double a[N][N]={{1.1348,3.8326,1.1651,3.4017}, {0.5301,1.7875,2.5330,1.5435},{3.4129,4.9317,8.7643,1.3142},{1.2371,4.9998,10.6721,0.0147}};double b[N]={9.5342,6.3941,18.4231,16.9237};double m[N][N];double x[N];int k,i,j,l;double max;double p;for(k=0;k<N-1;k++){max=a[k][k];l=k;for(i=k+1;i<N;i++)//选主元{if(fabs(a[i][k])>fabs(max)){max=a[i][k];l=i;}}if(fabs(max)*100000<1)cout<<"det A=0"<<endl;else{if(l!=k)//交换行{p=b[l];b[l]=b[k];b[k]=p;for(j=0;j<N;j++){p=a[l][j];a[l][j]=a[k][j];a[k][j]=p;}display(a,b);cout<<endl;}for(i=k+1;i<N;i++)//消元计算,将方程组约化为三角形方程组{m[i][k]=a[i][k]/a[k][k];for(j=k+1;j<N;j++){a[i][j]-=m[i][k]*a[k][j];}b[i]-=m[i][k]*b[k];}display(a,b);cout<<endl;}}if(fabs(a[N-1][N-1])*100000<1)cout<<"det A=0"<<endl;else{//回代求解x[N-1]=b[N-1]/a[N-1][N-1];for(i=N-2;i>=0;i--){x[i]=b[i];for(j=i+1;j<N;j++){x[i]-=a[i][j]*x[j];}x[i]/=a[i][i];}}//输出方程组的解cout<<"方程的解依次为"<<endl;for(i=0;i<N;i++){cout<<"x["<<i+1<<"]="<<x[i]<<endl;}}三.实验结果及分析1.顺序消元法2.列主元消元法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*输入系数矩阵*/
for(i=0;i<N;i++)
for(j=0;j<N+1;j++)
scanf("%f",&A[i][j]);
printf("向命令窗口输入的曾广矩阵是:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N+1;j++)
printf("%2.1f ",A[i][j]);
int w;
float max=y[0];
for (w=0;w<N;w++)
if (fabs(y[w])>fabs(max))
max=y[w];
return max;
}
使用列主元消元法解方程组c语言代码
# include<stdio.h>
# include<math.h>பைடு நூலகம்
# define N 3
main(){
int i,j,k,h,s,m,n,z;
float max(float *y);
float A[N][N+1],B[N],ma,t,M[N]={0},X;
float x[N];
M[m]=A[m][i]/A[i][i];
for (n=i+1;n<N;n++)
{
for (z=0;z<N+1;z++)
A[n][z]=A[n][z]-M[n]*A[i][z];
}
for (m=0;m<N;m++)
M[m]=0;
}
/*输出三角矩阵*/
printf("通过高斯列主元消去法化成的上三角曾广矩阵是:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N+1;j++)
printf("%2.1f ",A[i][j]);
printf("\n");
}
/*
回带过程
*/
x[N-1]=A[N-1][N]/A[N-1][N-1];
for(i=N-2;i>0 || i==0;i--)
{
for(j=N-1;j>i;j--)
X=X+A[i][j]*x[j];
x[i]=(A[i][N]-X)/A[i][i];
X=0;
}
/*
将方程的解输出
*/
printf("该方程组的解依次为:\n");
for(i=0;i<N;i++){
printf("x[%d]=%2.1f ",i+1,x[i]);
}
}
/*
计算最大值函数
*/
float max(float *y){
printf("\n");
}
/*正消过程*/
for (i=0;i<N-1;i++)
{
/*找出每行最大的值*/
for (j=i;j<N;j++)
B[j-i]=A[j][i];
ma=max(B);
for (s=0;s<N;s++)
B[s]=0;
/*交换最大值行和当前行*/
if(ma!=0){
for (k=i;k<N;k++)
if (A[i][i]!=ma && A[k][i]==ma && ma!=0)
{
for (h=0;h<N+1;h++)
{
t=A[i][h];
A[i][h]=A[k][h];
A[k][h]=t;
}
}
}
else
{ printf("A是非奇异矩阵!\n");
break;
}
/*消去过程*/
for (m=i+1;m<N;m++)
相关文档
最新文档