1. 程式人生 > >使用python實現高斯-賽德爾迭代法的簡單運算

使用python實現高斯-賽德爾迭代法的簡單運算

今天傳熱學老師說到高斯-賽德爾迭代法,我就想拿python寫一個小程式來計算。

在網上找例子,發現居然沒有人拿python寫,都是C / C++ / Matlab的。沒有參考答案,真是寫得我焦頭爛額啊。

截圖:


#!/usr/bin/env python
# -*- coding=gb2312 -*-

from __future__ import division #改變除法
import copy

data = open('data.txt')
content = data.read()
a = [map(int,ln.strip().split(' '))
    for ln in content.splitlines() if ln.strip()] #形成矩陣二維陣列
n = len(a[0])-1 #方程組解的個數

def gui0(temp): #定義歸零函式
    "此函式的作用是將一個數組中的所有數值清空為0"
    for i in range(0,len(temp)):
        temp[i] = 0
    return temp

def dp(): #定義檢驗函式:
    for i in range(0,n-1):
        aabs = map(abs, a[i])
        if 2*abs(a[i][i]) + abs(a[i][n]) >= reduce(lambda x, y: x+y, aabs):
            del aabs
            for j in range(0,n):
                if a[i][j] != 0:
                    pass
                else:
                    print "\n您的陣列含有為0係數!\n"
                    exit()

        else:
            print "\n您的陣列無法滿足對角佔優。\n"
            exit()
    print "\n您的陣列可以滿足對角佔優。\n"

t = copy.copy(a[0]) #淺複製
t = gui0(t)
t[0:1] = [] #由於a[0]陣列元素數比解數多一個,因此在歸零後消去第一個0

def main(): #定義迭代函式
    tmp1 = []
    for i in range(0,n):
        for j in range (0,n):
            rest = a[i][j]*t[j]
            tmp1.append(rest)
        t[i] = (a[i][n] - reduce(lambda x, y: x+y, tmp1) + a[i][i]*t[i]) / a[i][i]
        tmp1 = []
        print t
        if len(raw_input("")) == 0:
            pass
        else:
            exit("使用者手動退出。")

print '''
“高斯-賽德爾迭代法” 簡易計算程式:
                Designed by 安

使用說明:

1.將您的方程組矩陣按照格式寫入“data.txt”中,格式舉例:
    如果您有一個二元一次方程組ax+by=c, dx+ey=f,則data.txt內容為:
    a b c
    d e f
    以此類推,數字與數字之間使用半形空格隔開,行末不需要加空格;
2.程式會自動驗證方程組,如果含有為0係數或者無法滿足對角佔優,程式會自動退出;
3.初解會被設定為0,0,0,0,……;
4.程式每迭代一次之後就會暫停,請按回車繼續,直到您取得想要的精度為止,您可以輸入任何字元再按回車便可退出程式。
'''

if len(raw_input("按下回車開始計算:")) == 0:
    dp()
    while True:
        main()
else:
    exit("使用者取消程式執行。")

print u"\n\n結果已經輸出!"