Calul matriciel
<sxh python; title : calcul_matriciel.py> #!/usr/bin/env python # -*- coding: UTF-8 -*- #http://www.siteduzero.com/tutoriel-3-223267-apprenez-a-programmer-en-python.html (pdf) #http://stackoverflow.com/questions/455612/python-limiting-floats-to-two-decimal-points #pour operation matriciel verification mathématique : http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Accueil_principal #http://www.pythonfrance.com/codes/OPERATION-MATRICIELLE_48359.aspx #http://inforef.be/swi/python.htm # travail de CD, ba2 chimie 2011-2012
from Tkinter import *
from sys import *
def is_number(s):
try: float(s) return True except ValueError: return False
def Supp_lc(m,n,M):
"retourne la matrice A sans la m ième ligne et la n ième colonne" Mlin=len(M) result=[] Rep=[] for i in range(Mlin): if i!=m: for j in range(Mlin): if j!=n: result.append(M[i][j]) #Ajoute les éléments tant qu'ils ne sont pas sur la m ième # ligne ou n ième colonne for k in range(0,len (result),Mlin-1): Rep.append(result[k:k+Mlin-1]) #Scinde la liste "result" en "Longueur(result)/(Mlin-1)" listes de taille "Mlin-1" return Rep
def Det(A):
" retourne le déterminat de la matrice A" if len(A)==1: return A[0][0] else: s=0 j=0 while j<len(A): B=Supp_lc(j,0,A)#Supprime 1ere ligne et colonne de A if j%2==0: #(-1)^(i+j) * Det("matrice où on retire 1ere ligne et colonne") # et on considère toujours i=0 donc dépend juste de j s=s+A[j][0]*Det(B) else: s=s-A[j][0]*Det(B) j=j+1 return s
def invmat(A):
"Donne l'inverse d'une matrice carrée A"
d=Det(A)
if d==0:
return 'La Matrice n\'est pas inversible'
else:
B=Mul_coff(1./d, Comat(A))
inv=Trans_matrix(B)
return inv
def Comat(A):
"Donne la comatrice d'une matrice A"
N=len (A)
k=0
com=[None]*N
while k<N:
com[k]=[0]*N
l=0
while l<N:
B=Supp_lc(k,l,A)
if (k+l)%2==0:
com[k][l]=(Det(B))
else:
com[k][l]=((-1)*Det(B))
l=l+1
k=k+1
return com
def Trans_matrix(n):
"""Retourne la transposée de la matrice""" s=[] for i in range(len(n[0])): #correspond à la dimension de la matrice t=[] for j in range(len(n)): t.append(n[j][i]) s.append(t) return s
def Mul_coff(a,l):
"""Multiplie les coefficients de la matrice par un réel""" s = [] for i in range(len(l)): t =[] for j in range(len(l[0])): t.append( a* l[i][j]) s.append(t) return s
def Dif_matrix(h,l):
"""Retourne la différence de deux matrices""" if len(h)==len(l) and len(h[0])==len(l[0]): s = [] for i in range(len(h)): t =[] for j in range(len(l[0])): t.append( h[i][j] - l[i][j]) s.append(t) return s else: print "Les tailles de vos matrices ne sont pas aqéquates"
def Sum_matrix(h,l):
"""retourne la somme de deux matrices""" if len(h)==len(l) and len(h[0])==len(l[0]): s = [] for i in range(len(h)): t =[] for j in range(len(l[0])): t.append( h[i][j] + l[i][j]) s.append(t) return s else: print "Les tailles de vos matrices ne sont pas aqéquates"
def Mul_matrix(h,l):
"""Retourne le produit de deux matrices""" if len(h[0]) == len(l): s = [] #nouvelle matrice retournée for i in range(len(h)): t = [] #création de ligne qu'on ajoutera ensuite à "s" for j in range(len(l[0])): res = 0 # résultat, chaque fois remis à 0 pour éviter des valeurs fausses for k in range(len(h[0])): res += h[i][k] * l[k][j] t.append(res) s.append(t) return s else: print "Les tailles de vos matrices ne sont pas aqéquates"
def opentop ():
"""fen01.destroy () """ dim = entr1.get() if is_number(dim) and float(dim) > 0: fen02 = Tk() fen02.title("Choisir l'opération") var=IntVar() r1=Radiobutton(fen02,text="déterminant",variable=var,value=0,command =affiche) r2=Radiobutton(fen02,text="comatrice",variable=var,value=1,command =affiche1) r3=Radiobutton(fen02,text="matrice inverse",variable=var,value=2,command =affiche2) r4=Radiobutton(fen02,text="matrice transposée",variable=var,value=3,command =affiche3) r5=Radiobutton(fen02,text="multiplication par un réel",variable=var,value=4,command =affiche4) r6=Radiobutton(fen02,text="soustraction",variable=var,value=5,command =affiche5) r7=Radiobutton(fen02,text="addition",variable=var,value=6,command =affiche6) r8=Radiobutton(fen02,text="multiplication",variable=var,value=7,command =affiche7)
r1.grid(row=1,column=0, sticky=W) r2.grid(row=2,column=0, sticky=W) r3.grid(row=3,column=0, sticky=W) r4.grid(row=4,column=0, sticky=W) r5.grid(row=5,column=0, sticky=W) r6.grid(row=6,column=0, sticky=W) r7.grid(row=7,column=0, sticky=W) r8.grid(row=8,column=0, sticky=W)
fen02.mainloop() else: image = None #valeur nulle pour objets autres que des nombres while not image: entree = entr1.get() image = is_number(entree) fen01.mainloop() return image
def affiche ():
fen03 = Tk() fen03.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen03) entries.grid(row=i,column=j) Zones1.append(entries) bou3= Button (fen03, text="calcul du déterminant",command= det) bou3.grid(row=i+1,column =j) fen03.mainloop()
def affiche1():
fen03 = Tk() fen03.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen03) entries.grid(row=i,column=j) Zones4.append(entries) bou3= Button (fen03, text="calcul de la comatrice",command= comatr) bou3.grid(row=i+1,column =j) fen03.mainloop()
def affiche2():
fen03 = Tk() fen03.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen03) entries.grid(row=i,column=j) Zones2.append(entries) bou3= Button (fen03, text="calcul de la matrice inverse",command= inv) bou3.grid(row=i+1,column =j) fen03.mainloop()
def affiche3():
fen03 = Tk() fen03.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen03) entries.grid(row=i,column=j) Zones3.append(entries) bou3= Button (fen03, text="calculer la transposée de la matrice",command= transf) bou3.grid(row=i+1,column =j) fen03.mainloop()
def affiche4():
fen03 = Tk() fen03.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen03) entries.grid(row=i,column=j) Zones5.append(entries) bou3= Button (fen03, text="Choix du réel",command= choix) bou3.grid(row=i+1,column =j) entr.append(fen03) fen03.mainloop()
def affiche5():
fen03 = Tk() fen03.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen03) entries.grid(row=i,column=j) Zones6.append(entries) bou3= Button (fen03, text="Choix 2ème matrice",command= matrice2) bou3.grid(row=i+1,column =j) fen03.mainloop()
def affiche6():
fen03 = Tk() fen03.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen03) entries.grid(row=i,column=j) Zones7.append(entries) bou3= Button (fen03, text="Choix 2ème matrice",command= matrice3) bou3.grid(row=i+1,column =j) fen03.mainloop()
def affiche7():
fen03 = Tk() fen03.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen03) entries.grid(row=i,column=j) Zones8.append(entries) bou3= Button (fen03, text="Choix 2ème matrice",command= matrice4) bou3.grid(row=i+1,column =j) fen03.mainloop()
def det():
s = [] n =int(entr1.get()) for i in range(n): t = [] for j in range(n): t.append(float(Zones1[n*i+j].get())) s.append(t) fen04=Tk() r = Det(s) chaine2=Label (fen04, text= "%.2f" % r) chaine2.grid()
def comatr ():
s = [] n =int(entr1.get()) for i in range(n): t = [] for j in range(n): t.append(float(Zones4[n*i+j].get())) s.append(t) fen04=Tk() r = Comat(s) for i in range (len(r)): for j in range (len(r[0])): b = Label(fen04, text= "%.2f" % r[i][j]) b.grid(row=i,column =j)
def inv ():
s = [] n =int(entr1.get()) for i in range(n): t = [] for j in range(n): t.append(float(Zones2[n*i+j].get())) s.append(t) fen04=Tk() r = invmat(s) if type(r) is str: b = Label(fen04, text= r) b.grid(row=i,column =j) else: for i in range (len(r)): for j in range (len(r[0])): b = Label(fen04, text= "%.2f" % r[i][j]) b.grid(row=i,column =j)
def transf():
s = [] n =int(entr1.get()) for i in range(n): t = [] for j in range(n): t.append(float(Zones3[n*i+j].get())) s.append(t) fen04=Tk() r = Trans_matrix(s) for i in range (len(r)): for j in range (len(r[0])): b = Label(fen04, text= "%.2f" % r[i][j]) b.grid(row=i,column =j)
def choix():
fen04=Tk() fen04.title("choix du réel") entr2=Entry(fen04) entr2.grid(row=0,column=0) entr.append(entr2) bou5=Button (fen04, text = "multiplication", command= mult) bou5.grid(row=1,column=0) fen04.mainloop()
def mult():
s = [] n =int(entr1.get()) a = entr[1].get() if is_number(a): for i in range(n): t = [] for j in range(n): t.append(float(Zones5[n*i+j].get())) s.append(t) fen04=Tk() r = Mul_coff(float(a),s) for i in range (len(r)): for j in range (len(r[0])): b = Label(fen04, text= "%.2f" % r[i][j]) b.grid(row=i,column =j) else: image = None while not image: entree = entr[1].get() image = is_number(entree) entr[0].mainloop() return image
def matrice2():
fen04 = Tk() fen04.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen04) entries.grid(row=i,column=j) Zones9.append(entries) bou4= Button (fen04, text="Soustraire",command= soust) bou4.grid(row=i+1,column =j) fen04.mainloop()
def matrice3():
fen04 = Tk() fen04.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen04) entries.grid(row=i,column=j) Zones10.append(entries) bou4= Button (fen04, text="additionner",command= add) bou4.grid(row=i+1,column =j) fen04.mainloop()
def matrice4():
fen04 = Tk() fen04.title('Choissisez les valeurs de votre matrice') ni=int(entr1.get()) nj=int(entr1.get()) for i in range (ni): for j in range (nj): entries=Entry(fen04) entries.grid(row=i,column=j) Zones11.append(entries) bou4= Button (fen04, text="Multiplier",command= multip) bou4.grid(row=i+1,column =j) fen04.mainloop()
def soust():
s = [] z = [] n =int(entr1.get()) for i in range(n): t = [] #correspont à chacune des lignes de la matrice créée p = [] #qu'on ajoute peu à peu à s pour construire la matrice for j in range(n): t.append(float(Zones6[n*i+j].get())) p.append(float(Zones9[n*i+j].get())) s.append(t) z.append(p) fen05=Tk() r = Dif_matrix(s,z) for i in range (len(r)): for j in range (len(r[0])): b = Label(fen05, text= "%.2f" % r[i][j]) b.grid(row=i,column =j)
def add():
s = [] z=[] n =int(entr1.get()) for i in range(n): t = [] p = [] for j in range(n): t.append(float(Zones7[n*i+j].get())) p.append(float(Zones10[n*i+j].get())) s.append(t) z.append(p) fen05=Tk() r = Sum_matrix(s,z) for i in range (len(r)): for j in range (len(r[0])): b = Label(fen05, text= "%.2f" % r[i][j]) b.grid(row=i,column =j)
def multip():
s = [] z=[] n =int(entr1.get()) for i in range(n): t = [] p = [] for j in range(n): t.append(float(Zones8[n*i+j].get())) p.append(float(Zones11[n*i+j].get())) s.append(t) z.append(p) fen05=Tk() r = Mul_matrix(s,z) for i in range (len(r)): for j in range (len(r[0])): b = Label(fen05, text= "%.2f" % r[i][j]) b.grid(row=i,column =j)
Zones = [] #tableau contenant des adresses memoires Zones1 =[] #des positions des cases de la matrice sur la fenêtre Zones2 =[] Zones3 =[] Zones4 =[] Zones5 =[] Zones6 =[] Zones7 =[] Zones8 =[] Zones9 = [] Zones10= [] Zones11= [] entr=[]
fen01 = Tk() fen01.title(“calculs matriciels”) chaine1 = Label (fen01, text = “introduisez la dimension de la matrice carree :”) chaine1.grid(row =0) entr1= Entry(fen01) entr1.grid(row =0, column =1) bou1=Button(fen01,text='operations matricielles',command=opentop) bou1.grid(row=2,column=1) fen01.mainloop()
</sxh>