Gauss顺序消去法解线性方程组报告

Gauss 顺序消去法解线性方程组

制作人:陈静

Gauss 消去法是解线性方程组的一种直接方法,有时也称为精确法,这种算法只包含有限四次运算,并且在每一步运算过程都不会发生舍入误差的假设下,计算的结果就是方程组的精确解。但实际计算中不可避免舍入误差的存在和影响,所以这种方法只能求得线性方程组的近似解。

一.实验目的:

学会用Gauss 顺序消去法解线性方程组。

二.实验要求:

(k -1) 线性方程组中a kk ≠0.

三.顺序消去法解方程组原理:

(1) 消元计算:对k=1,2, ,n-1

(k ) ⎧a ik (k ) ⎪l ik =a kk ⎪(k +1) (k ) (k ) =a ij -l ik a kj ⎨a ij ⎪b (k +1) =b (k ) -l b (k )

i ik k ⎪i

⎩(i =k +1, , n ) (i , j =k +1, , n ) (i =k +1, , n )

(2) 回代计算:

(n ) (n ) ⎧x n =b n a nn ⎪n ⎨(i ) (i ) (i ) x i =(b i -∑a ij x j ) a ii ⎪j =i +1⎩(i =n -1, , 2, 1)

四.顺序消去法解方程组的解题步骤:

设有线性代数方程组

Ax = b

其中

⎡a 11⎢a 21 A = ⎢⎢... ⎢⎣a n 1a 12a 22... a n 2... a 1n ⎤⎡x 1⎤⎡b 1⎤⎢x ⎥⎢b ⎥... a 2n ⎥2⎥,x = ⎢⎥,b = ⎢2⎥. ⎢ ⎥⎢ ⎥... ... ⎥⎥⎢⎥⎢⎥... a nn ⎦x ⎣n ⎦⎣b n ⎦

为了清晰起见,将方程组写成如下形式

(1) (1) ) (1) ⎧a 11x 1+a 12x 2+ +a 1(1x =b n n 1, ⎪(1) (1) (1) (1) ⎪a 21x 1+a 22x 2+ +a 2n x n =b 2, ⎨ ⎪

(1) (1) (1) (1) ⎪⎩a n 1x 1+a n 2x 2+ +a nn x n =b n .

第一步 设a 11≠0,首先计算乘数 1) (1) l i 1=a i (1(i=2,3, ,n ). a 11(1)

用-l i 1乘上述方程组的第一个方程,再加到第i 个(i=2,3, ,n )方程上,消 去上述方程组的第二个方程到第n 个方程中的未知数x 1,得与上述方程组等价的方程组

(1) ⎡a 11⎢

⎢⎢⎢⎢⎣(1) a 12(2) a 22 (2) a n 2) (1) x ⎤⎡⎤ a 1(1b ⎡⎤1n 1⎢(2) ⎥(2) ⎥⎢x ⎥ a 2b 2⎥n ⎥⎢2⎥ = ⎢ ⎥⎢⎥⎢⎥ ⎥⎢⎥(2) ⎢(2) ⎥x a nn ⎥⎢⎦⎣n ⎦⎣b n ⎥⎦

简记为A (2) x =b (2) ,其中A (2) 、b (2) 的元素计算公式为

(2) (1) ⎧a ij =a ij -l i 1a 1(1j ) , j =2, , n , i =2 , n , ⎨ (2) (1) (1) b i =b i -l i 1b 1, i =2, 3, , n . ⎩

第二步 仿照第一步的做法以此类推,到第n 步便得到与上述方程组等价的方程组

(1) ⎡a 11⎢

⎢⎢⎢⎢⎣(1) a 12(2) a 22) ⎤⎡x 1⎤⎡b 1(1) ⎤ a 1(1n ⎢2) ⎥⎥(2) ⎥⎢x a 22n ⎥⎢⎥ = ⎢b 2⎥ ⎢ ⎥ ⎥⎢ ⎥⎢n ) ⎥⎥(n ) ⎥⎢x a nn ⎥⎢⎦⎣n ⎦⎣b n ⎥⎦

以上两步为高斯顺序消去法的消去过程。

第三步 将上述得到的方程组通过原理中的回代计算法: (n ) (n ) ⎧x n =b n a nn ⎪n ⎨(i ) (i ) (i ) x i =(b i -∑a ij x j ) a ii ⎪j =i +1⎩(i =n -1, , 2, 1)

得到方程组的解x i (i=1,2, ,n )。

这步为高斯顺序消去法的回代过程。

五.流程图如下:

六.源程序如下:

#include "stdio.h"

#include "math.h"

#define N 20

main()

{

float A[N][N];

float b[N];

float x[N];

float S,temp;

int i,j,k;

int n;

printf("\t\t\tgauss列主元消去法解方程组\n\n"); printf("\t\t\t\t制作人:陈静\n");

printf("\t\t\t\t指导老师:金力老师\n");

printf(" 请输入方程组的个数:");

scanf("%d", &n);

printf("n=%d\n",n);

printf("\n");

printf(" 请输入每行方程组的系数:\n"); //输入方程组的系数矩阵A[][]

for (i=0;i

{

for (j=0;j

{

scanf("%f", &A[i][j]);

}

}

printf(" 请输入每行方程组的y 值:\n"); //输入方程组的结果矩阵b[]

for (i=0;i

{

scanf("%f", &b[i]);

}

//输出方程组的系数矩阵A[][]

printf(" 刚输入的矩阵A[][]:\n"); for (i=0;i

{

for (j=0;j

printf("%f ",A[i][j]);

printf("\n");

}

//输入方程组的结果矩阵b[] printf(" 刚输入的矩阵b[]:\n");

for (i=0;i

printf("%f ",b[i]);

printf("\n\n");

//gauss消去法的求解过程

for (k=0;k

{

printf(" 第%d次消去后的矩阵:\n",k +1); for (i=0;i

{

for (j=0;j

printf("%f ",A[i][j]);

printf("\n");

}

if (! A[k][k])

return -1;

//消去过程

for (i=k +1;i

{

temp =A[i][k]/A[k][k];

for (j=k;j

{

A[i][j]=A[i][j]-temp *A[k][j]; }

b[i]=b[i]-temp *b[k];

}

}

//消去的结果

printf(" 消去后的最终结果A[]:\n"); for (i=0;i

{

for (j=0;j

printf("%f ",A[i][j]);

printf("\n");

}

printf(" 消去后的最终结果b[]:\n"); for (i=0;i

printf("%f ",b[i]);

printf("\n\n");

//回代过程

x[n-1]=b[n-1]/A[n-1][n-1]; for (k=n -2;k >=0;k --)

{

S =b[k];

for (j=k +1;j

{

S =S -A[k][j]*x[j]; }

x[k]=S /A[k][k];

}

//输出结果

printf("x 的值为:\n");

for (i=0;i

printf("x%d=%f ",i +1,x[i]); printf("\n");

return 0;

}

七.例题验证:

书本题目P211

方程组如下

⎧-3x 1+2x 2+6x 3=4, ⎪⎨10x 1-7x 2=7,

⎪5x -x +5x =6, 123⎩

代入程序结果如下:

书本题目P211

Gauss 顺序消去法解线性方程组

制作人:陈静

Gauss 消去法是解线性方程组的一种直接方法,有时也称为精确法,这种算法只包含有限四次运算,并且在每一步运算过程都不会发生舍入误差的假设下,计算的结果就是方程组的精确解。但实际计算中不可避免舍入误差的存在和影响,所以这种方法只能求得线性方程组的近似解。

一.实验目的:

学会用Gauss 顺序消去法解线性方程组。

二.实验要求:

(k -1) 线性方程组中a kk ≠0.

三.顺序消去法解方程组原理:

(1) 消元计算:对k=1,2, ,n-1

(k ) ⎧a ik (k ) ⎪l ik =a kk ⎪(k +1) (k ) (k ) =a ij -l ik a kj ⎨a ij ⎪b (k +1) =b (k ) -l b (k )

i ik k ⎪i

⎩(i =k +1, , n ) (i , j =k +1, , n ) (i =k +1, , n )

(2) 回代计算:

(n ) (n ) ⎧x n =b n a nn ⎪n ⎨(i ) (i ) (i ) x i =(b i -∑a ij x j ) a ii ⎪j =i +1⎩(i =n -1, , 2, 1)

四.顺序消去法解方程组的解题步骤:

设有线性代数方程组

Ax = b

其中

⎡a 11⎢a 21 A = ⎢⎢... ⎢⎣a n 1a 12a 22... a n 2... a 1n ⎤⎡x 1⎤⎡b 1⎤⎢x ⎥⎢b ⎥... a 2n ⎥2⎥,x = ⎢⎥,b = ⎢2⎥. ⎢ ⎥⎢ ⎥... ... ⎥⎥⎢⎥⎢⎥... a nn ⎦x ⎣n ⎦⎣b n ⎦

为了清晰起见,将方程组写成如下形式

(1) (1) ) (1) ⎧a 11x 1+a 12x 2+ +a 1(1x =b n n 1, ⎪(1) (1) (1) (1) ⎪a 21x 1+a 22x 2+ +a 2n x n =b 2, ⎨ ⎪

(1) (1) (1) (1) ⎪⎩a n 1x 1+a n 2x 2+ +a nn x n =b n .

第一步 设a 11≠0,首先计算乘数 1) (1) l i 1=a i (1(i=2,3, ,n ). a 11(1)

用-l i 1乘上述方程组的第一个方程,再加到第i 个(i=2,3, ,n )方程上,消 去上述方程组的第二个方程到第n 个方程中的未知数x 1,得与上述方程组等价的方程组

(1) ⎡a 11⎢

⎢⎢⎢⎢⎣(1) a 12(2) a 22 (2) a n 2) (1) x ⎤⎡⎤ a 1(1b ⎡⎤1n 1⎢(2) ⎥(2) ⎥⎢x ⎥ a 2b 2⎥n ⎥⎢2⎥ = ⎢ ⎥⎢⎥⎢⎥ ⎥⎢⎥(2) ⎢(2) ⎥x a nn ⎥⎢⎦⎣n ⎦⎣b n ⎥⎦

简记为A (2) x =b (2) ,其中A (2) 、b (2) 的元素计算公式为

(2) (1) ⎧a ij =a ij -l i 1a 1(1j ) , j =2, , n , i =2 , n , ⎨ (2) (1) (1) b i =b i -l i 1b 1, i =2, 3, , n . ⎩

第二步 仿照第一步的做法以此类推,到第n 步便得到与上述方程组等价的方程组

(1) ⎡a 11⎢

⎢⎢⎢⎢⎣(1) a 12(2) a 22) ⎤⎡x 1⎤⎡b 1(1) ⎤ a 1(1n ⎢2) ⎥⎥(2) ⎥⎢x a 22n ⎥⎢⎥ = ⎢b 2⎥ ⎢ ⎥ ⎥⎢ ⎥⎢n ) ⎥⎥(n ) ⎥⎢x a nn ⎥⎢⎦⎣n ⎦⎣b n ⎥⎦

以上两步为高斯顺序消去法的消去过程。

第三步 将上述得到的方程组通过原理中的回代计算法: (n ) (n ) ⎧x n =b n a nn ⎪n ⎨(i ) (i ) (i ) x i =(b i -∑a ij x j ) a ii ⎪j =i +1⎩(i =n -1, , 2, 1)

得到方程组的解x i (i=1,2, ,n )。

这步为高斯顺序消去法的回代过程。

五.流程图如下:

六.源程序如下:

#include "stdio.h"

#include "math.h"

#define N 20

main()

{

float A[N][N];

float b[N];

float x[N];

float S,temp;

int i,j,k;

int n;

printf("\t\t\tgauss列主元消去法解方程组\n\n"); printf("\t\t\t\t制作人:陈静\n");

printf("\t\t\t\t指导老师:金力老师\n");

printf(" 请输入方程组的个数:");

scanf("%d", &n);

printf("n=%d\n",n);

printf("\n");

printf(" 请输入每行方程组的系数:\n"); //输入方程组的系数矩阵A[][]

for (i=0;i

{

for (j=0;j

{

scanf("%f", &A[i][j]);

}

}

printf(" 请输入每行方程组的y 值:\n"); //输入方程组的结果矩阵b[]

for (i=0;i

{

scanf("%f", &b[i]);

}

//输出方程组的系数矩阵A[][]

printf(" 刚输入的矩阵A[][]:\n"); for (i=0;i

{

for (j=0;j

printf("%f ",A[i][j]);

printf("\n");

}

//输入方程组的结果矩阵b[] printf(" 刚输入的矩阵b[]:\n");

for (i=0;i

printf("%f ",b[i]);

printf("\n\n");

//gauss消去法的求解过程

for (k=0;k

{

printf(" 第%d次消去后的矩阵:\n",k +1); for (i=0;i

{

for (j=0;j

printf("%f ",A[i][j]);

printf("\n");

}

if (! A[k][k])

return -1;

//消去过程

for (i=k +1;i

{

temp =A[i][k]/A[k][k];

for (j=k;j

{

A[i][j]=A[i][j]-temp *A[k][j]; }

b[i]=b[i]-temp *b[k];

}

}

//消去的结果

printf(" 消去后的最终结果A[]:\n"); for (i=0;i

{

for (j=0;j

printf("%f ",A[i][j]);

printf("\n");

}

printf(" 消去后的最终结果b[]:\n"); for (i=0;i

printf("%f ",b[i]);

printf("\n\n");

//回代过程

x[n-1]=b[n-1]/A[n-1][n-1]; for (k=n -2;k >=0;k --)

{

S =b[k];

for (j=k +1;j

{

S =S -A[k][j]*x[j]; }

x[k]=S /A[k][k];

}

//输出结果

printf("x 的值为:\n");

for (i=0;i

printf("x%d=%f ",i +1,x[i]); printf("\n");

return 0;

}

七.例题验证:

书本题目P211

方程组如下

⎧-3x 1+2x 2+6x 3=4, ⎪⎨10x 1-7x 2=7,

⎪5x -x +5x =6, 123⎩

代入程序结果如下:

书本题目P211


相关内容

  • 迭代法实验
  • 实验五 线性方程组的迭代法实验 一. 实验目的 (1)深入理解线性方程组的迭代法的设计思想,学会利用系数矩阵的性质以保证迭 代过程的收敛性,以及解决某些实际的线性方程组求解问题. (2)熟悉Matlab编程环境,利用Matlab解决具体的方程求根问题. 二. 实验要求 建立Jacobi迭代公式.Ga ...

  • 高斯消元实验报告
  • 实验报告一 Gauss消去法求解线性方程组实验 一.实验内容 分别用顺序Gauss消去法和列选主元gauss消去法求解方程组 = 二.算法原理 对一般的形如的线性方程组,记增广矩阵.Guass消去法包括消元过程和回代过程,消去过程实际上是把通过有限步的初等变换(即把的某行的一个倍数加到另一行或变换的 ...

  • 数值分析讲义--线性方程组的解法
  • 第三章 线性方程组的解法 3.0 引 言 重要性:解线性代数方程组的有效方法在计算数学和科学计算中具有特 殊的地位和作用. 如弹性力学.电路分析.热传导和振动.以及社会科学及定量分析商业经济中的各种问题. 分类:线性方程组的解法可分为直接法和迭代法两种方法. (a) 直接法:对于给定的方程组,在没有 ...

  • 高斯消去法高斯塞德尔迭代法
  • 数值计算 高斯消去法和高斯-塞德尔迭代法 摘要 虽然已学过加减消元法.代入消元法.矩阵变换法和Cramer 法则等,但是无法满足实际计算需要,故在此讨论在计算机上实现的有效而实用的解法.线性方程组的解法大致分2类:直接法(高斯消去法)和迭代法(高斯-赛德尔迭代法),在此对着此类算法进行比较分析. 一 ...

  • 计算方法实验报告_列主元高斯消去法
  • 计 算 方 法 实 验 报 告 动力与机械学院 08级自动化3班 唐禹 [1**********]78 2010.11.08 实验一 :使用列主元消去法求解线性方程组 列主元消去法是在Gauss消去法的基础上改进而得的一种比较快速和合理的求解线性方程组的方法.它的主要思路是通过对每次消元过程中主元的 ...

  • 浅谈矩阵的LU分解和QR分解及其应用
  • 浅谈矩阵的LU 分解和QR 分解及其应用 基于理论研究和计算的需要,往往有必要把矩阵分解为具有某种特性的矩阵之积,这就是我们所说的矩阵分解. 本文将介绍两种常用的矩阵分解方法,以及其在解线性方程组及求矩阵特征值中的应用. 1. 矩阵的LU 分解及其在解线性方程组中的应用 1.1 高斯消元法 通过学习 ...

  • 数值计算基础
  • 数值计算基础 实验指导书 2010年 目录 实验一 直接法解线性方程组的 ................................ 1 实验二 插值方法 ........................................... 10 实验三 数值积分 ............. ...

  • 线性方程组的直接解法
  • 线性方程组的直接解法 §1线性方程组的条件数 我们曾对一个矩阵计算问题的病态性这个概念作了概略的定性说明.现在我们来考虑如何对线性方程组的病态程度做出定量估计. 设ARnn是非奇异的,bR.我们来考虑线性方程组 Axb, (1) n 之解x对数据A和b的微小扰动的敏感程度.为此,考虑如下的含 ...

  • 科学和工程计算复习题及答案
  • 科学和工程计算基础复习题 一. 填空题: 1. :2. 计算机计费的主要依据有两项:一是使用 要由 算数运算的次数决定; 二是占据存储器的空间, 3. 用计算机进行数值计算时, 4. 5. 6. 7. 8. 9. 10. 11. 敛的充分必要条件是选代矩阵B 的 谱半径ρ(B ) (n +1) (x ...