高斯消元法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高斯消元法相关的知识,希望对你有一定的参考价值。
1.已经实现的功能:
1.线性方程组的输入
2.高斯消元过程
3.回代过程
4.还差方程组解的判断
coding:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string> 4 5 #define MAX(a,b) a>b?a:b 6 7 bool gaussElin();//高斯消元函数 8 bool intputA_B();//输入矩阵A,B 9 int solvLinearEqu();//线性方程组解的情况 10 /* 11 声明全局静态变量 12 */ 13 static int row;//系数矩阵列 14 static int col;//系数矩阵行 15 static float **A;//系数矩阵 16 static float *B;//常数项 17 static float *X;//方程组的解 18 static bool flag;//是否为齐次线性组 19 /* 20 main函数 21 */ 22 int main(){ 23 bool con = true; 24 while(con){ 25 bool is = intputA_B(); 26 if(is){ 27 if(gaussElin()){ 28 printf("最终结果:\n"); 29 for(int i = 0;i<row;i++) 30 printf("%f ",x[i]); 31 printf("\n"); 32 } 33 else{ 34 printf("不能进行高斯消\n"); 35 } 36 } 37 else{ 38 printf("是否重新输入是则输入:yes,否则输入:\n"); 39 char a[5]; 40 scanf("%s",a); 41 if(strcmp("yes",a)){ 42 continue; 43 } 44 if(strcmp("no",a)){ 45 con =false; 46 } 47 } 48 } 49 return ; 50 } 51 bool intputA_B() 52 { 53 int i = 0,j = 0; 54 printf("输入矩阵的行列,用空格隔开\n"); 55 56 float n,m; 57 scanf("%f%f",&n,&m); 58 row = (int)n; 59 col= (int)m; 60 61 //检查输入是否正确 62 if((row!=n)||(col!=m)){ 63 printf("输入错误!!!!\n"); 64 return false; 65 } 66 //分配内存空间 67 A = (float **)malloc(sizeof(float *)*row); 68 for(i = 0;i<row;i++) 69 { 70 A[i] = (float *)malloc(sizeof(float)*col); 71 } 72 B = (float *)malloc(sizeof(float)*row); 73 //输入A矩阵 74 printf("依次输入系数矩阵\n"); 75 char c ; 76 for(i = 0;i<row;i++) 77 { 78 for(j = 0;j<col;j++) 79 { 80 scanf("%f",&A[i][j]); 81 } 82 c = getchar();//换行 83 } 84 printf("依次输入常数\n"); 85 86 for(i= 0;i<row;i++){ 87 scanf("%f",&B[i]); 88 if(B[i]==0){ 89 flag = 1; 90 } 91 } 92 //换行 93 c = getchar(); 94 return true; 95 } 96 /* 97 return:bool 98 进行高斯消元 99 如果主元素为0,则返回false 100 */ 101 bool xiaoyuan(){ 102 for(int i = 0;i<row-1;i++){ 103 if(A[i][i]==0){ 104 return false; 105 } 106 for(int j = i+1;j<row;j++) 107 { 108 float step = A[j][i]/A[i][i];//消元的倍数 109 for(int k = i;k<col;k++){ 110 A[j][k] = A[j][k]-A[i][k]*step; 111 } 112 B[j] = B[j]-B[i]*step; 113 } 114 } 115 return true; 116 } 117 /* 118 回代的过程 119 */ 120 void huidai(){ 121 int i; 122 for( i = row-1;i>=0;i--){ 123 float sum = 0; 124 for(int j = i+1;j<row;j++){ 125 sum = sum+x[j]*A[i][j]; 126 } 127 x[i] = (B[i]-sum)/A[i][j]; 128 } 129 } 130 /* 131 高斯消元过程 132 */ 133 bool gaussElin( ){ 134 //存储结果 135 x = (float*)malloc(row*sizeof(float)); 136 //回带过程 137 if(xiaoyuan()) 138 { 139 return false; 140 } 141 else 142 return true; 143 huidai(); 144 return true; 145 } 146 /* 147 return 方程组解的情况 148 149 */ 150 int solvLinearEqu(){ 151 if(gaussElin()==false){ 152 //高斯消元不成功 153 return 0; 154 } 155 //齐次方程组 156 if(flag==1){ 157 if(row>=col){ 158 if(A[col-1][col-1]!=0){ 159 memset(X,0,sizeof(X)); 160 return 1;//维一解 161 } 162 else{ 163 return 2;//无穷多解 164 } 165 } 166 else{ 167 return 2;//无穷多解 168 } 169 else{ 170 171 } 172 173 } 174
以上是关于高斯消元法的主要内容,如果未能解决你的问题,请参考以下文章