高斯消元解線性方程組(c語言)


warning:有bug待修

今天的線性代數課學了高斯消元解線性方程組,感覺很有意思,於是寫了一個c語言小程序,功能如下:

1.把輸入的矩陣經過初等變換,變成行階梯形矩陣

2.判斷方程組解的情況

3.如果有唯一解,輸出方程組的解

實現的思路是枚舉每一列,第i列從a[i+1][i]到a[m][i]依次用第i行消去。

 

 1 #include <stdio.h>
 2 double a[21][21], x[21];
 3 int m, n;
 4 
 5 void print() {
 6   printf("\n------->\n");
 7   for (int i = 1; i <= m; i++) {
 8     for (int j = 1; j <= n; j++) printf("%.2lf ", a[i][j]);
 9     printf("\n");
10   }
11 }
12 
13 void work() {
14   print();
15   for (int j = 1; j <= n - 1; j++) { //從第一列到第n-1列
16     for (int i = j + 1; i <= m; i++) {   //從第j+1行到第m行 
17       if (a[j][i] == 0) continue;
18       double t = - a[i][j] / a[j][j];
19       for (int k = j; k <= n; k++) a[i][k] += a[j][k] * t;
20     }
21     print();
22   }
23   printf("\n----------已化為階梯型矩陣----------\n\n");
24   //判斷是否有解
25   for (int i = 1; i <= m; i++) {
26     int flag = 0;
27     for (int j = 1; j <= n - 1; j++) {
28       if (a[i][j] != 0) flag = 1;
29     }
30     if (flag == 1 && a[i][n] == 0) {
31       printf("方程組無解\n");
32       return;
33     }
34   }
35   //判斷是否有無窮多解
36   if (m < n - 1) {
37     printf("方程組有無窮多組解\n");
38     return;
39   }
40   else for (int i = 1; i <= m; i++) {
41     if (a[i][i] == 0) {
42       printf("方程組有無窮多組解\n");
43       return;
44     }
45   }
46   //求解方程
47   printf("方程組有唯一解:\n");
48   for (int i = m; i >= 1; i--) {
49     x[i] = a[i][n];
50     for (int j = i + 1; j <= n - 1; j++) x[i] -= a[i][j] * x[j];
51     x[i] /= a[i][i];
52   }
53   for (int i = 1; i <= n - 1; i++) printf("x%d = %.2lf\n", i, x[i]);
54 }
55 
56 
57 int main() {
58   printf("請輸入增廣矩陣的行數和列數:\n");
59   scanf("%d%d", &m, &n);
60   printf("請輸入整個增廣矩陣:\n");
61   for (int i = 1; i <= m; i++)
62     for (int j = 1; j <= n; j++)
63       scanf("%lf", &a[i][j]);
64   work();
65   return 0;
66 }

運行示例

 

 

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM