使用python實現高斯-賽德爾迭代法的簡單運算
阿新 • • 發佈:2019-02-12
今天傳熱學老師說到高斯-賽德爾迭代法,我就想拿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結果已經輸出!"