1. 程式人生 > 其它 >高斯消元解線性方程組(Python)

高斯消元解線性方程組(Python)

技術標籤:演算法題Pythonpython演算法

題目

輸入一個包含n個方程n個未知數的線性方程組。

方程組中的係數為實數。

求解這個方程組。

下圖為一個包含m個方程n個未知數的線性方程組示例:

9a504fc2d5628535be9dcb5f90ef76c6a7ef634a.gif

輸入格式

第一行包含整數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")