摘要:在本報(bào)告中介紹了一套圖形界面的矩陣計(jì)算器的的想法與需求分析、設(shè)計(jì)、實(shí)現(xiàn),測(cè)試和改進(jìn)。在想法與需求分析中介紹了我研發(fā)此程序的契機(jī)和原因。在設(shè)計(jì)中介紹了對(duì)該程序的設(shè)計(jì),以及如何實(shí)現(xiàn)。實(shí)現(xiàn)中介紹了對(duì)關(guān)鍵代碼的分析和解釋。測(cè)試以圖片的形式證明了一些具體功能的實(shí)現(xiàn)和驗(yàn)證。最后的改進(jìn)中介紹了程序的還存在的漏洞與需要改進(jìn)的地方。 |
關(guān)鍵字:矩陣;計(jì)算;圖形化;方便 |
- 想法與需求分析
- 想法
作為一名工科專業(yè)大學(xué)生,我們會(huì)在讀大學(xué)的途中遇到《線性代數(shù)》這樣一門課程。這門課程主要講了與矩陣相關(guān)的計(jì)算與分析。但是在學(xué)習(xí)過(guò)程中,我們會(huì)遇到一些比較復(fù)雜的矩陣的運(yùn)算,如求矩陣的逆,求矩陣的行列式的值,求矩陣的特征值,等。對(duì)于剛剛接觸這門課程的大學(xué)生來(lái)說(shuō)十分的困難,有時(shí)候瘋狂的計(jì)算了很長(zhǎng)時(shí)間都不能得到正確的結(jié)果,讓人的心態(tài)十分的炸裂,很容易讓我們脆弱的心靈受到傷害,于是我設(shè)計(jì)了這款矩陣計(jì)算器。
-
- 需求分析
當(dāng)前比較常見(jiàn)的計(jì)算器,對(duì)矩陣的計(jì)算操作十分的復(fù)雜,首先要定義矩陣,然后再定義的矩陣中選取幾個(gè)進(jìn)行運(yùn)算,矩陣最大只有4*4,最多也只能存儲(chǔ)4個(gè),功能也不全面。而且還要仔細(xì)的閱讀說(shuō)明書才能正確的操作,十分的復(fù)雜。手機(jī)上自帶的計(jì)算器也沒(méi)有計(jì)算矩陣的功能。而更高級(jí)的計(jì)算器又需要花費(fèi)很多的錢。而我利用python編寫了一款帶有圖形界面的矩陣計(jì)算器,可以實(shí)現(xiàn)對(duì)于矩陣的一些基本的運(yùn)算與操作。對(duì)于大學(xué)生學(xué)習(xí)《線性代數(shù)》有很大的幫助,在它的幫助下學(xué)習(xí)效率會(huì)得到提高。不僅提高了計(jì)算的效率,同時(shí)也能驗(yàn)證手算結(jié)果是否正確。
- 設(shè)計(jì)
- 布局
首先對(duì)計(jì)算器的整體構(gòu)造進(jìn)行排版和布局,仿照傳統(tǒng)計(jì)算器的樣式,利用pyqt5,先在界面的上半部分設(shè)計(jì)一個(gè)多行的可編輯文本框plainTextEdit。之后在下方利用layout進(jìn)行排版創(chuàng)建一個(gè)5*5的按鈕組,按鈕組中的25個(gè)按鈕分別為:空格,行列式的值,轉(zhuǎn)置矩陣,特征值與向量,清空,刪除,逆矩陣,0,高斯消元法。換行,7,8,9,+,-,4,5,6,X,.,1,2,3,Ans,=。通過(guò)按鈕點(diǎn)擊相應(yīng)事件用來(lái)實(shí)現(xiàn)計(jì)算器不同的功能。效果如圖:
-
- 功能
本矩陣計(jì)算器通過(guò)點(diǎn)擊按鈕實(shí)現(xiàn)矩陣的輸入,加減乘計(jì)算,逆矩陣,轉(zhuǎn)置矩陣,求特征值與特征向量,求行列式的值,通過(guò)增廣矩陣的高斯消元法求一些方程的解。
點(diǎn)擊數(shù)字或者符號(hào),會(huì)直接在多行文本編輯框內(nèi)出現(xiàn)相應(yīng)的數(shù)字或者符號(hào)。輸入每個(gè)數(shù)據(jù)需要用空格隔開(kāi),點(diǎn)擊換行會(huì)輸出下一行的數(shù)據(jù)。
當(dāng)輸入一個(gè)矩陣后,若點(diǎn)擊逆矩陣,轉(zhuǎn)置矩陣等操作時(shí),在輸入矩陣滿足前提條件情況下會(huì)直接將結(jié)果輸出在多行文本編輯框內(nèi),并將結(jié)果存入Ans中。若點(diǎn)擊等于號(hào),則會(huì)把該矩陣存入Ans中。若點(diǎn)擊運(yùn)算符號(hào)則會(huì)自動(dòng)換行,輸入下一個(gè)矩陣。當(dāng)?shù)诙€(gè)矩陣輸入完成后,點(diǎn)擊等于號(hào),在輸入矩陣滿足前提條件情況下會(huì)直接將結(jié)果輸出在多行文本編輯框內(nèi),并將結(jié)果存入Ans中。
點(diǎn)擊Ans,后點(diǎn)擊等于號(hào),會(huì)將Ans存儲(chǔ)的結(jié)果輸出。而且上述對(duì)于矩陣的操作對(duì)Ans也同樣生效,對(duì)于矩陣的運(yùn)算也可以結(jié)合Ans進(jìn)行。
- 實(shí)現(xiàn)
- 點(diǎn)擊數(shù)字按鈕
# 點(diǎn)擊1 def clickbutton1(self=None): ??? global bo ??? if bo == 0: ??????? self.plainTextEdit.insertPlainText("1") ??? else: ??????? bo = 0 ??????? self.plainTextEdit.appendPlainText("1")
分析:
以數(shù)字1為例。bo為全局變量,主要用來(lái)判斷當(dāng)前是否處于換行狀態(tài),處于換行狀態(tài)使用函數(shù)iappendPlainText會(huì)使數(shù)字輸出在新的一段,若不處于換行狀態(tài)則使用insertPlainText函數(shù)直接在本段追加。
-
- 點(diǎn)擊符號(hào)按鈕
- def?clickbuttonadd(self=None): ????self.plainTextEdit.appendPlainText("+") ????global?bo ??? bo =?1
分析:
以加號(hào)為例。對(duì)運(yùn)算更加方便的操作,點(diǎn)擊符號(hào)按鈕后直接另起一段進(jìn)行輸入,并將換行標(biāo)志bo置為1,下一次的輸入也是另起一段,方便矩陣的輸入。
3.3點(diǎn)擊操作按鈕
# 點(diǎn)擊清空 def clickbuttonclear(self=None): ??? self.plainTextEdit.clear() # 點(diǎn)擊換行 def clickbutton_huanhang(self=None): ??? global bo ??? bo = 1 # 點(diǎn)擊刪除 def clickbuttondelete(self=None): ??? text_cursor = QTextCursor(self.plainTextEdit.document()) ??? text_cursor.movePosition(QTextCursor.End) ??? text_cursor.deletePreviousChar()
分析:
點(diǎn)擊清空會(huì)用clear函數(shù)將文本框清空,點(diǎn)擊換行會(huì)讓換行標(biāo)志bo為1,使下一次輸入另起一段,而點(diǎn)擊刪除按鈕則是使用QTextCursor選擇文本編輯框中的內(nèi)容并將光標(biāo)移動(dòng)到最后一個(gè)字符處,使用deletPreviousChar函數(shù)直接將前一個(gè)字符刪除。
3.4點(diǎn)擊逆矩陣按鈕
def clickbuttoninverse(self=None): ??? st = self.plainTextEdit.toPlainText() ??? x = len(st.split('\n')) ??? y = len((st.split('\n')[0]).split()) ??? global ans ??? if x != y: ??????? self.plainTextEdit.setPlainText("錯(cuò)誤") ??? else: ??????? if st == "Ans": ??????????? num = ans ??????? else: ??????????? num = np.ones((x, y)) ??????????? for i in range(x): ??????????????? for j in range(y): ??????????????????? num[i][j] = (st.split('\n')[i]).split()[j] ??????????? p = np.linalg.det(num) ??????????? if p == 0: ??????????????? self.plainTextEdit.setPlainText("錯(cuò)誤") ??????? num = np.linalg.inv(num) ??????? ans = num ??????? self.plainTextEdit.clear() ??????? for i in range(x): ??????????? for j in range(y): ??????????????? if j == 0: ??????????????????? self.plainTextEdit.appendPlainText(str(num[i][j])) ??????????????????? self.plainTextEdit.insertPlainText(" ") ??????????????? else: ??????????????????? self.plainTextEdit.insertPlainText(str(num[i][j])) ??????????????????? self.plainTextEdit.insertPlainText(" ")
分析:
首先點(diǎn)擊該按鈕時(shí),文本編輯框內(nèi)已經(jīng)有了一個(gè)完整的矩陣或是Ans。之后將文本框內(nèi)的數(shù)據(jù)讀取為字符串。之后通過(guò)split()對(duì)字符串進(jìn)行操作,先以換行符進(jìn)行分割,可以求出當(dāng)前矩陣的行數(shù),之后選取一行以空格進(jìn)行分割,可以求出當(dāng)前矩陣的列數(shù)。之后通過(guò)求得的行數(shù)與列數(shù)創(chuàng)建一個(gè)全1矩陣num。矩陣num的每個(gè)元素與字符串中的位置一一對(duì)應(yīng)。通過(guò)分割字符串。循環(huán)賦值構(gòu)建矩陣,并求其行列式,因?yàn)樾辛惺綖?的矩陣沒(méi)有逆矩陣因此輸出錯(cuò)誤。若行列式不為0,利用np.linalg.inv函數(shù)計(jì)算逆矩陣。按矩陣順序輸出結(jié)果到文本編輯框內(nèi),并將結(jié)果存入Ans中。
若文本編輯框內(nèi)本來(lái)便是Ans,則直接進(jìn)行運(yùn)算,省去提取矩陣的步驟。
3.5點(diǎn)擊行列式的值按鈕
# 點(diǎn)擊行列式的值 def clickbuttondeterminant(self=None): ??? st = self.plainTextEdit.toPlainText() ??? x = len(st.split('\n')) ??? y = len((st.split('\n')[0]).split()) ??? global ans ??? if x != y: ??????? self.plainTextEdit.setPlainText("錯(cuò)誤") ??? else: ??????? if st == "Ans": ??????????? num = ans ??????? else: ??????????? num = np.ones((x, y)) ??????????? for i in range(x): ??????????????? for j in range(y): ??????????????????? num[i][j] = (st.split('\n')[i]).split()[j] ??????? p = np.linalg.det(num) ??????? p = round(p, 7) ??????? ans = p ??????? self.plainTextEdit.setPlainText(str(p))
分析:
點(diǎn)擊該按鈕時(shí),會(huì)有與逆矩陣相似的方法提取當(dāng)前文本編輯框中的矩陣,之后利用np.linalg.det函數(shù) 計(jì)算行列式的值,因?yàn)榫仃囖D(zhuǎn)化之后所有數(shù)據(jù)均為浮點(diǎn)數(shù),而浮點(diǎn)數(shù)會(huì)在計(jì)算的過(guò)程中產(chǎn)生不可避免的精度誤差,于是我采用了保留小數(shù)的方法消除誤差,并將結(jié)果存入Ans中。
3.6點(diǎn)擊轉(zhuǎn)置矩陣按鈕
# 點(diǎn)擊轉(zhuǎn)置矩陣 def clickbuttontransposition(self=None): ??? st = self.plainTextEdit.toPlainText() ??? x = len(st.split('\n')) ??? y = len((st.split('\n')[0]).split()) ??? global ans ??? if st == "Ans": ??????? num = ans ??? else: ??????? num = np.ones((x, y)) ??????? for i in range(x): ??????????? for j in range(y): ??????????????? num[i][j] = (st.split('\n')[i]).split()[j] ??? num = num.transpose() ??? ans = num ??? self.plainTextEdit.clear() ??? self.plainTextEdit.setPlainText(str(num))
分析:
?? 點(diǎn)擊轉(zhuǎn)置矩陣的按鈕后,會(huì)用類似逆矩陣的方法求得當(dāng)前矩陣,利用.transpose函數(shù)求得轉(zhuǎn)置矩陣并輸出,結(jié)果保留在Ans中。
3.7點(diǎn)擊特征值與特征向量按鈕
# 點(diǎn)擊特征值與特征向量 def clickbuttoneigenvalues(self=None): ??? st = self.plainTextEdit.toPlainText() ??? x = len(st.split('\n')) ??? y = len((st.split('\n')[0]).split()) ??? if x != y: ??????? self.plainTextEdit.setPlainText("錯(cuò)誤") ??? else: ??????? global ans ??????? if st == "Ans": ??????????? num = ans ??????? else: ??????????? num = np.ones((x, y)) ??????????? for i in range(x): ??????????????? for j in range(y): ??????????????????? num[i][j] = (st.split('\n')[i]).split()[j] ??????? eigenvalues, eigenvectors = np.linalg.eig(num) ??????? self.plainTextEdit.clear() ??????? self.plainTextEdit.appendPlainText(str(eigenvalues)) ??????? self.plainTextEdit.appendPlainText(str(eigenvectors))
分析:
由于設(shè)計(jì)時(shí)出現(xiàn)了26個(gè)按鈕,無(wú)法漂亮的排版,于是只能將求特征值與特征向量合并到一起,只是無(wú)法將兩個(gè)結(jié)果賦值到Ans中。
點(diǎn)擊特征值與特征向量的按鈕后,會(huì)用類似逆矩陣的方法求得當(dāng)前矩陣,利用np.linalg.eig函數(shù)求得轉(zhuǎn)置矩陣并輸出。
3.8點(diǎn)擊高斯消元法按鈕
def clickbuttongaosi(self=None): ??? st = self.plainTextEdit.toPlainText() ??? x = len(st.split('\n')) ??? y = len((st.split('\n')[0]).split()) ??? num = np.ones((x, y)) ??? res = np.ones((x, y - 1)) ??? for i in range(x): ??????? for j in range(y): ??????????? num[i][j] = (st.split('\n')[i]).split()[j] ??? for i in range(x): ??????? for j in range(y - 1): ??????????? res[i][j] = num[i][j] ??? if np.linalg.matrix_rank(res) < np.linalg.matrix_rank(num): ??????? self.plainTextEdit.setPlainText("有無(wú)數(shù)解") ??? if np.linalg.matrix_rank(res) > np.linalg.matrix_rank(num): ??????? self.plainTextEdit.setPlainText("無(wú)解") ??? if np.linalg.matrix_rank(res) == np.linalg.matrix_rank(num): ??????? self.plainTextEdit.clear() ??????? for i in range(x - 1): ??????????? for j in range(i + 1, x): ??????????????? temp = num[j][i] / num[i][i] ??????? ????????for t in range(i, y): ??????????????????? num[j][t] = num[j][t] - temp * num[i][t] ??????? for i in range(np.linalg.matrix_rank(num) - 1, -1, -1): ??????????? res[i][1] = num[i][y - 1] ??????????? for j in range(i + 1, np.linalg.matrix_rank(num)): ??????????????? res[i][1] = res[i][1] - num[i][j] * res[j][0] ??????????? res[i][0] = res[i][1] / num[i][i] ??????? for i in range(np.linalg.matrix_rank(num)): ??????????? res[i][0] = round(res[i][0], 7) ??????????? self.plainTextEdit.appendPlainText(str(res[i][0]))
分析:
首先使用了類似于求逆矩陣中將字符串轉(zhuǎn)化為矩陣的方法。得到矩陣num。之后刪去矩陣的最后一列,得到了系數(shù)矩陣res。利用np.linalg.matrix_rank函數(shù)分別求出系數(shù)矩陣與增廣矩陣的秩。
當(dāng)方程組的系數(shù)矩陣的秩與方程組增廣矩陣的秩相等且均等于方程組中未知數(shù)個(gè)數(shù)n的時(shí)候,方程組有唯一解。
當(dāng)方程組的系數(shù)矩陣的秩與方程組增廣矩陣的秩相等且均小于方程組中未知數(shù)個(gè)數(shù)n的時(shí)候,方程組有無(wú)窮多解。
當(dāng)方程組的系數(shù)矩陣的秩小于方程組增廣矩陣的秩的時(shí)候,方程組無(wú)解。
當(dāng)確定方程組有唯一解后,利用循環(huán),將每一行的第一個(gè)非0的數(shù)轉(zhuǎn)化為0,得到一個(gè)上三角矩陣。之后利用系數(shù)矩陣的第一列存儲(chǔ)方程的解,第二列存儲(chǔ)計(jì)算過(guò)程中的中間值,倒序求取方程的解并將結(jié)果輸出。
3.9點(diǎn)擊等號(hào)按鈕
# 點(diǎn)擊等于號(hào) def clickbuttequal(self=None): ??? st = self.plainTextEdit.toPlainText() ??? global ans ??? temp = 1 ??? x = len(st.split('\n')) ??? if st == "Ans": ??????? self.plainTextEdit.setPlainText(str(ans)) ??? else: ??????? for i in range(x): ??????????? if st.split('\n')[i] == "Ans" and i == x - 1: ??????????????? temp = 0 ??????????????? x1 = x - 2 ??????????????? y1 = len((st.split('\n')[0]).split()) ??????????????? op = st.split('\n')[x - 2] ??????????????? num2 = ans ??????????????? x2 = ans.shape[0] ??????????????? y2 = ans.shape[1] ??????????????? num1 = np.ones((x1, y1)) ??????????????? for t in range(x1): ??????????????????? for j in range(y1): ??????????????????????? num1[t][j] = (st.split('\n')[t]).split()[j] ??????????????? break ??????????? if st.split('\n')[i] == "Ans" and i == 0: ??????????????? temp = 0 ??????????????? x2 = x - 2 ??????????????? y2 = len((st.split('\n')[x2]).split()) ??????????????? num1 = ans ??????????????? op = st.split('\n')[1] ??????????????? x1 = ans.shape[0] ??????????????? y1 = ans.shape[1] ??????????????? num2 = np.ones((x2, y2)) ??????????????? for t in range(2, x): ??????????????????? for j in range(y2): ??????????????????????? num2[t -2][j] = (st.split('\n')[t]).split()[j] ??????????????? break ??????? if temp: ??????????? x1 = 0 ??????????? for i in range(x): ??????????????? if (st.split('\n')[i]).split()[0] == 'X' or (st.split('\n')[i]).split()[0] == '+' or \ ??????????????????????? (st.split('\n')[i]).split()[0] == '-': ??????????????????? op = (st.split('\n')[i]).split()[0] ??????????????????? x1 = i ??????????????????? break ??????????? if x1 == 0: ??????????????? y = len((st.split('\n')[0]).split()) ??????????????? num = np.ones((x, y)) ??????????????? for i in range(x): ??????????????????? for j in range(y): ??????????????????????? num[i][j] = (st.split('\n')[i]).split()[j] ??????????????? ans = num ??????????????? self.plainTextEdit.setPlainText(str(ans)) ??????????? else: ??????????????? y1 = len((st.split('\n')[0]).split()) ??????????????? y2 = len((st.split('\n')[x1 + 1]).split()) ??????????????? x2 = x - x1 - 1 ??????????????? print(x1, y1, x2, y2) ??????????????? num1 = np.ones((x1, y1)) ??????????????? num2 = np.ones((x2, y2)) ??????????????? for i in range(x1): ??????????????????? for j in range(y1): ??????????????????????? num1[i][j] = (st.split('\n')[i]).split()[j] ??????????????? for i in range(x1 + 1, x): ??????????????????? for j in range(y2): ??????????????????????? num2[i - 1 - x1][j] = (st.split('\n')[i]).split()[j] ??????? if x1 != 0: ??????????? if op == '+': ??????????????? if x1 == x2 and y1 == y2: ??????????????????? ans = num1 + num2 ??????????????????? self.plainTextEdit.setPlainText(str(ans)) ??????????????? else: ??????????????????? self.plainTextEdit.setPlainText("錯(cuò)誤") ??????????? if op == '-': ??????? ????????if x1 == x2 and y1 == y2: ??????????????????? ans = num1 - num2 ??????????????????? self.plainTextEdit.setPlainText(str(ans)) ??????????????? else: ??????????????????? self.plainTextEdit.setPlainText("錯(cuò)誤") ??????????? if op == 'X': ??????????????? if y1 == x2: ??????????????????? ans = np.dot(num1, num2) ??????????????????? self.plainTextEdit.setPlainText(str(ans)) ??????????????? else: ??????????????????? self.plainTextEdit.setPlainText("錯(cuò)誤")
分析:
點(diǎn)擊等于號(hào)后需要分情況討論。
當(dāng)點(diǎn)擊等于號(hào)后檢測(cè)到文本輸入框內(nèi)只有一個(gè)矩陣時(shí),將矩陣存入Ans中并輸出。
?? 當(dāng)點(diǎn)擊等于號(hào)后檢測(cè)到文本輸入框內(nèi)只有Ans時(shí),直接將Ans的內(nèi)容輸出。
?? 當(dāng)點(diǎn)擊等于號(hào)后檢測(cè)到文本輸入框內(nèi)有兩個(gè)矩陣和運(yùn)算符時(shí),首先將文本框中的內(nèi)容全部轉(zhuǎn)化為字符串,以換行符為分割符進(jìn)行分割,求出當(dāng)前總行數(shù)。
之后進(jìn)行循環(huán),檢測(cè)每一行是否為Ans,若存在Ans,記錄其出現(xiàn)的位置。
若出現(xiàn)在第一行。則將其賦值給運(yùn)算矩陣num1,記錄其行數(shù)和列數(shù),運(yùn)算符便位于第二行,將運(yùn)算符記錄。然后使用經(jīng)典方法將運(yùn)算符之后字符串的分割賦值轉(zhuǎn)化為計(jì)算矩陣num2。
若出現(xiàn)在最后一行。則將其賦值給運(yùn)算矩陣num2,記錄其行數(shù)和列數(shù),運(yùn)算符便位于倒數(shù)二行,將運(yùn)算符記錄。然后使用經(jīng)典方法將運(yùn)算符之后字符串的分割賦值轉(zhuǎn)化為計(jì)算矩陣num1。
若不存在Ans,則需要尋找運(yùn)算符的位置找到之后,記錄運(yùn)算符。將運(yùn)算符之前的字符串使用經(jīng)典方法分割賦值給運(yùn)算矩陣num1,將運(yùn)算符之后的字符串使用經(jīng)典方法分割賦值給運(yùn)算矩陣num2。
之后進(jìn)入計(jì)算的判斷,首先判斷運(yùn)算符。
若為加或減,則判斷兩個(gè)運(yùn)算矩陣行和列是否相等,不滿足輸出錯(cuò)誤,滿足進(jìn)行運(yùn)算,并把結(jié)果存入Ans中。
若為乘,則判斷第一個(gè)矩陣列是否等于第二個(gè)矩陣的行,不滿足輸出錯(cuò)誤,滿足進(jìn)行運(yùn)算,并把結(jié)果存入Ans中。
4.測(cè)試
4.1逆矩陣
樣例輸入:
(1)1 2
2 1
(2)1 1 1
???? 2 3 4
???? 4 5 6
??
4.2轉(zhuǎn)置矩陣
樣例輸入:
-
- 2
???? 3 4
(2)1 2
???? 4 5
???? 8 9?
樣例輸出:
4.3行列式的值
樣例輸入:
(1)1 2
???? 2 1
(2)1.2 2 1
???? 4.5 4 3
???? 8.2 1 2
樣例輸出:
?
4.4特征值與特征向量
樣例輸入:
(1)1 2
???? 2 1
樣例輸出:
4.5等號(hào)計(jì)算
樣例輸入:
(1)1 2
???? 2 1
??+
??4 4
??7 8
(2)Ans(此時(shí)Ans為上一次(1)運(yùn)算的結(jié)果)
???? -
???? 2 7
???? 1 1
(3)1 2 3
???? 4 5 6
???? X
???? Ans(此時(shí)Ans為上一次(2)運(yùn)算的結(jié)果)
樣例輸出:
?
?
- 改進(jìn)
我所編輯的矩陣計(jì)算器能基本的解決一些基礎(chǔ)的有關(guān)的矩陣的簡(jiǎn)答基本的計(jì)算,供學(xué)生使用,系統(tǒng)的應(yīng)用了在Python課堂上學(xué)習(xí)的pyqt5可視化界面的編輯。對(duì)字符串的處理以及分析,對(duì)條件語(yǔ)句的熟練使用等等。但是還是有許多的弊端,如對(duì)于運(yùn)算錯(cuò)誤的處理,因?yàn)樵诰庉嬘?jì)算器的過(guò)程中我只是將我所能想到的計(jì)算失敗的情況做出了處理,并不能涵蓋所有的情況,如使用者輸入了一個(gè)不標(biāo)準(zhǔn)的矩陣,使用者無(wú)法進(jìn)行2個(gè)以上的矩陣的運(yùn)算。需要后續(xù)更系統(tǒng)的將所有的不能正常運(yùn)算的情況總結(jié)起來(lái),專門設(shè)立對(duì)錯(cuò)檢驗(yàn)函數(shù),應(yīng)該會(huì)讓bug變得更少。
在讓其更嚴(yán)謹(jǐn)之后還可以拓展按鈕,進(jìn)行功能的拓展,如矩陣的對(duì)角化,求矩陣的正定矩陣等?;蚴菍⑵渑c其他相關(guān)科目結(jié)合,如可以自動(dòng)計(jì)算《數(shù)值計(jì)算方法》這門課中解多元方程組的迭代矩陣,并判斷其是否收斂。等等。甚至可以將矩陣圖形化,根據(jù)對(duì)應(yīng)的矩陣中的值匯出相應(yīng)的函數(shù)圖像。
- 致謝
首先要感謝我的老師,在我沒(méi)有接觸過(guò)python的情況下帶我由淺入勝,由表及里逐步的學(xué)習(xí)python,逐步的拓展了我的眼界,提高了我的思維。到最后結(jié)課的時(shí)候也能獨(dú)自的完成一個(gè)比較復(fù)雜的大型程序來(lái)實(shí)現(xiàn)自己的一些想法。雖然過(guò)程比較漫長(zhǎng)和困難但給了我極大的收獲與進(jìn)步文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-716186.html
同時(shí)網(wǎng)絡(luò)上的一些對(duì)于python庫(kù)的歸納總結(jié)讓我的研究更加省時(shí)省力。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-716186.html
到了這里,關(guān)于矩陣計(jì)算器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!