teaching:progappchim:calcul_matriciel_2012

no way to compare when less than two revisions

Différences

Ci-dessous, les différences entre deux révisions de la page.


teaching:progappchim:calcul_matriciel_2012 [2013/11/29 12:33] (Version actuelle) – créée villersd
Ligne 1: Ligne 1:
 +====== 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>
  • teaching/progappchim/calcul_matriciel_2012.txt
  • Dernière modification : 2013/11/29 12:33
  • de villersd