teaching:progappchim:calcul_matriciel_2012

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&#039;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&#039;inverse d&#039;une matrice carrée  A"
    d=Det(A)
    if d==0:
          return &#039;La Matrice n\&#039;est pas inversible&#039;
    else:
          B=Mul_coff(1./d, Comat(A))
          inv=Trans_matrix(B)
    return inv

def Comat(A):

    "Donne la comatrice d&#039;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&#039;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&#039;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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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(&#039;Choissisez les valeurs de votre matrice&#039;)
  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&#039;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=&#039;operations matricielles&#039;,command=opentop) bou1.grid(row=2,column=1) fen01.mainloop()

</sxh>

Ce site web utilise des cookies. En utilisant le site Web, vous acceptez le stockage de cookies sur votre ordinateur. Vous reconnaissez également que vous avez lu et compris notre politique de confidentialité. Si vous n'êtes pas d'accord, quittez le site.En savoir plus
  • teaching/progappchim/calcul_matriciel_2012.txt
  • Dernière modification : 2013/11/29 12:33
  • de villersd