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