用python解決 圖論 和 多項式的矩陣、特徵值、特徵多項式的相互轉化
阿新 • • 發佈:2018-12-25
馬上就要畢業了,不少的同學都在緊鑼密鼓的寫論文,對於一些數學系或者理科生來說,經常會遇到一些圖論問題,根據圖形來求出這個圖的矩陣、圖的度……那麼我們知道很多的圖形都能轉化成特徵多項式,那麼今天我們就來寫一個程式,使其通過圖形的矩陣來求多項式。
開始
其實大部分數學工具(Matlab)都能解決問題,但是輸入有點麻煩,因為每個圖你至少要輸入很多次資料,那麼我們能不能開發一個程式來一次性解決問題?答案是肯定的,我們今天用到的就是Python中的Numpy模組。
from numpy import roots,poly1d,array,linalg
from tkinter import *
win = Tk()
win.geometry('500x500')
win.title('牛逼!')
l1 = Label(win,text='輸入 :').place(x=50,y=50)
num = Entry(win,width=50,) # 輸入框
num.place(x=120,y=50)
def getnum():# 這是程式的主要函式,通過它觸發一系列操作
num1 = num.get() # 獲取得到的引數,即使用者輸入的
a = array([eval(num1)]) # 將使用者的輸入轉化為數字
b = linalg.eig(a) # 使用numpy模組的函式來算特徵值
ret1 =[]
for i in b[0][0]:
ret1.append(round(i,3))
var.set(ret1) # 向螢幕輸出特徵根
sum = 0
for i in range(len(ret1)):
sum += ret1[i]
avg = sum/len(ret1)
var1.set(round(avg,4)) # 向螢幕輸出特徵根的平均值
all_sum = 0
for i in range(len(ret1)):
all_sum += abs (ret1[i]-avg)
var2.set(round(all_sum,4)) # 列印求和函式,即每個根於平均根的絕對值的和
q = poly1d(b[0][0],True)
var3.set(q)
Button(win,text='提交',command=getnum).place(x=170,y=100)
# 根的文字框
var = StringVar()
l2= Label(win,text='根的列表:').place(x=50,y=150)
Label(win,textvariable=var,bg='#838B83').place(x=110,y=150)
# 平均值的文字框
var1 = StringVar()
l2= Label(win,text='平均值:').place(x=50,y=230)
Label(win,textvariable=var1,bg='#FF4040').place(x=110,y=230)
# 求絕對值的文字框
var2 = StringVar()
l2= Label(win,text='求和 :').place(x=50,y=310)
Label(win,textvariable=var2,bg='#FF7256').place(x=110,y=310)
var3 = StringVar()
l2= Label(win,text='多項式 :').place(x=50,y=380)
Label(win,textvariable=var3,bg='#EE7256').place(x=110,y=380)
win.mainloop()
最後
這裡我們來算一個矩陣,實驗一下,當然一般的圖形不會轉化成這麼簡單的矩陣,只是實驗:(引用)
那麼我們輸入如下:
不足:不難發現在多項式輸出行,冪係數沒有對齊,這是有點傷的,但是它都是有序數對,自己應該能判斷出來的。
因此一個簡單的小程式就寫完了,大家可以在我的部落格中下載原始碼或者在github
檢視程式碼,記得在github上點star哦,哈哈哈