高斯消元解線性方程組(Python)
阿新 • • 發佈:2020-12-31
題目
輸入一個包含n個方程n個未知數的線性方程組。
方程組中的係數為實數。
求解這個方程組。
下圖為一個包含m個方程n個未知數的線性方程組示例:
輸入格式
第一行包含整數n。
接下來n行,每行包含n+1個實數,表示一個方程的n個係數以及等號右側的常數。
輸出格式
如果給定線性方程組存在唯一解,則輸出共n行,其中第i行輸出第i個未知數的解,結果保留兩位小數。
如果給定線性方程組存在無數解,則輸出“Infinite group solutions”。
如果給定線性方程組無解,則輸出“No solution”。
資料範圍
1≤n≤100
所有輸入係數以及常數均保留兩位小數,絕對值均不超過100。
輸入樣例:
3
1.00 2.00 -1.00 -6.00
2.00 1.00 -3.00 -9.00
-1.00 -1.00 2.00 7.00
輸出樣例:
1.00
-2.00
3.00
程式碼
zero = float(1e-6) def gauss(): global n, zero r = 0 for c in range(n): t = r # 首先找到當前這一列上最大絕對值的數所在的列 for i in range(r, n): if abs(a[i][c]) > abs(a[t][c]): t = i if abs(a[t][c]) < zero: continue # 如果列都是0則跳到下一列 # 將它移到第r行 a[r], a[t] = a[t], a[r] # 將第r行歸一化 for i in range(n, c-1, -1): a[r][i] /= a[r][c] # 將第r行與其他的行進行相減,使得該列都為0 for i in range(r+1, n): if abs(a[i][c]) > zero: for j in range(n, c-1, -1): a[i][j] -= a[r][j] * a[i][c] r += 1 # 行++ # 如果存在後面的行都為0 if r < n: for i in range(r, n): if abs(a[i][n]) > zero: return 2 # 無解 return 1 # 無線解 # 計算解 for i in range(n-1, -1, -1): # 當前行 for j in range(i): # 當前行上面的所有行 a[j][n] -= a[j][i] * a[i][n] return 0 n = int(input()) a = [] for _ in range(n): a.append(list(map(float, input().split()))) t = gauss() if t == 0 : for i in range(n): print('%.2f' % a[i][n]) elif t == 1: print('Infinite group solutions') else: print("No solution")