teaching:progappchim:polynomes-10

Différences

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

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
teaching:progappchim:polynomes-10 [2016/02/23 13:27] villersdteaching:progappchim:polynomes-10 [2017/02/24 11:53] (Version actuelle) villersd
Ligne 3: Ligne 3:
 ===== Dérivation ===== ===== Dérivation =====
 Proposé et testé par RL, étudiant ba2 2012-2013. Proposé et testé par RL, étudiant ba2 2012-2013.
-<sxh python; title : derivation.py>+<code python derivation.py> 
 +#!/usr/bin/env python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
 def polyderiv(a): def polyderiv(a):
-    """dérivation d'un polynôme 
     """     """
-    b = a[:]  #copie de la liste des coefficients du polynôme de départ +    dérivation d'un polynôme 
-    n = len(b)-1  #ordre du polynôme+    """ 
 +    b = a[:]       #copie de la liste des coefficients du polynôme de départ 
 +    n = len(b) -1  #ordre du polynôme
     for i in range (n+1):     for i in range (n+1):
         b[i] = b[i] * i  #on redéfinit chaque coefficient i de la liste par ce même coefficient*le degré         b[i] = b[i] * i  #on redéfinit chaque coefficient i de la liste par ce même coefficient*le degré
     b.pop(b[0])  #on supprime le premier élément de la liste (terme indépendant)     b.pop(b[0])  #on supprime le premier élément de la liste (terme indépendant)
     return b     return b
-</sxh>+</code>
  
 ===== Multiplication par x ===== ===== Multiplication par x =====
 Proposition de AP, étudiant ba2 2012-2013 : Proposition de AP, étudiant ba2 2012-2013 :
-<sxh python; title : polyx.py>+<code python polyx.py> 
 +#!/usr/bin/env python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
 def polyx(a): def polyx(a):
-    """polyx est un fonction qui multiplie un polynôme par x.+    """ 
 +    polyx est un fonction qui multiplie un polynôme par x.
     Cela revient à rajouter un 0 à gauche de la liste passée en argument de la fonction (a).     Cela revient à rajouter un 0 à gauche de la liste passée en argument de la fonction (a).
     """     """
     b = [0]               #Nouvelle liste dont le premier terme vaut 0.     b = [0]               #Nouvelle liste dont le premier terme vaut 0.
-    for coef in range(len(a)):           #Pour tout les coefficients de la liste a de degré n, on ajoute la liste b.+    for coef in range(len(a)):    #Pour tout les coefficients de la liste a de degré n, on ajoute la liste b
         b.append(a[coef])         b.append(a[coef])
     return b     return b
-</sxh>+</code>
 Les listes pouvant être concaténées, on peut écrire cela plus simplement encore : Les listes pouvant être concaténées, on peut écrire cela plus simplement encore :
-<sxh python; title : polyshift.py>+<code python polyshift.py> 
 +#!/usr/bin/env python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
 def polyshift (a): def polyshift (a):
-    """Multiplication du polynôme par la variable x""" +    """ 
-    b = [0]+a   # cela revient à "shifter" la liste des coefficients en insérant un 0 "à gauche"+    Multiplication du polynôme par la variable x 
 +    """ 
 +    b = [0] + a   # cela revient à "shifter" la liste des coefficients en insérant un 0 "à gauche"
     return b     return b
-</sxh>+</code>
  
 ===== Intégration ===== ===== Intégration =====
 Sur base de la proposition de RL, étudiant ba2 2012-2013 : Sur base de la proposition de RL, étudiant ba2 2012-2013 :
-<sxh python; title : polyintegr.py>+<code python polyintegr.py> 
 +#!/usr/bin/env python 
 +# -*- coding: UTF-8 -*-
 def polyintegr(a): def polyintegr(a):
-    """intégration d'un polynôme+    """ 
 +    intégration d'un polynôme
     """     """
     b = [0]  #on indique un coefficient indépendant nul en début de la liste (constante d'intégration nulle)     b = [0]  #on indique un coefficient indépendant nul en début de la liste (constante d'intégration nulle)
Ligne 49: Ligne 59:
         b.append(a[i]/(i+1)) #le coefficient du terme correspondant après intégration est ajouté         b.append(a[i]/(i+1)) #le coefficient du terme correspondant après intégration est ajouté
     return b     return b
-</sxh>+</code>
  
 ===== Multiplication de deux polynômes ===== ===== Multiplication de deux polynômes =====
 Proposition de BF, étudiant ba2 2012-2013, complétée par des commentaires et une application sur des puissances d'un binôme générant les coefficients du [[http://fr.wikipedia.org/wiki/Triangle_de_Pascal|triangle de Pascal]] : Proposition de BF, étudiant ba2 2012-2013, complétée par des commentaires et une application sur des puissances d'un binôme générant les coefficients du [[http://fr.wikipedia.org/wiki/Triangle_de_Pascal|triangle de Pascal]] :
-<sxh python; title : polymult_BF.py> +<code python polymult_BF.py> 
-#!/usr/bin/python+#!/usr/bin/env python
 # -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
 def polymult_BF(a,b): def polymult_BF(a,b):
Ligne 63: Ligne 73:
     while(len(c)<p+1):     while(len(c)<p+1):
         c.append(0)         c.append(0)
-    for k in range(p+1):  # pour toutes les puissances du polynôme c +    for k in range(p+1):            # pour toutes les puissances du polynôme c 
-        for i in range(len(a)):  # on considère tous les termes de a+        for i in range(len(a)):     # on considère tous les termes de a
             for j in range(len(b)): # on considère tous les termes de b             for j in range(len(b)): # on considère tous les termes de b
-                if k == (i + j):  # si les degrés combinés valent k, on met à jour le coefficient k : +                if k == (i + j):    # si les degrés combinés valent k, on met à jour le coefficient k : 
-                    c[k] = c[k] + (a[i]*b[j])+                    c[k] = c[k] + (a[i] * b[j])
     return c     return c
  
-x = [1,1] +x = [1, 1] 
-prod = [1,1]+prod = [1, 1]
 for i in range(10): for i in range(10):
     prod = polymult_BF(x,prod)     prod = polymult_BF(x,prod)
-    print prod +    print(prod) 
-</sxh>+</code>
 OK, cela fonctionne, mais il semble possible d'économiser des opérations. Multiplier un polynômes de degré n par un autre de degré m devrait pouvoir se faire en n*m étapes. Or, il y a 3 structures de répétitions imbriquées, donc n*m*(n+m) étapes ! De plus, on ne tire pas vraiment parti de l'initialisation du polynôme c, puisque ses coefficients sont créés dans l'ordre. OK, cela fonctionne, mais il semble possible d'économiser des opérations. Multiplier un polynômes de degré n par un autre de degré m devrait pouvoir se faire en n*m étapes. Or, il y a 3 structures de répétitions imbriquées, donc n*m*(n+m) étapes ! De plus, on ne tire pas vraiment parti de l'initialisation du polynôme c, puisque ses coefficients sont créés dans l'ordre.
  
 Voici une modification permettant d'en tirer parti, supprimant le balayage des puissances de c, le test, et quelques autres éléments inutiles : Voici une modification permettant d'en tirer parti, supprimant le balayage des puissances de c, le test, et quelques autres éléments inutiles :
-<sxh python; title : polymult.py> +<code python polymult.py> 
-#!/usr/bin/python+#!/usr/bin/env python
 # -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
 def polymult(a,b): def polymult(a,b):
-    n = len(a)-1  # degré du polynôme a +    n = len(a) - 1           # degré du polynôme a 
-    m = len(b)-1  # degré du polynôme b +    m = len(b) - 1           # degré du polynôme b 
-    p = n + m  # degré du polynôme c = a * b +    p = n + m                # degré du polynôme c = a * b 
-    c = [] # on va créer tous les coefficients du polynôme c, initialisés à 0 :+    c = []                   # on va créer tous les coefficients du polynôme c, initialisés à 0 :
     for k in range(p+1):     for k in range(p+1):
         c.append(0)         c.append(0)
-    for i in range(n+1):  # on considère tous les termes de a+    for i in range(n+1):     # on considère tous les termes de a
         for j in range(m+1): # on considère tous les termes de b         for j in range(m+1): # on considère tous les termes de b
             c[i+j] += a[i] * b[j]  # on incrémente le coefficient de degré k :             c[i+j] += a[i] * b[j]  # on incrémente le coefficient de degré k :
     return c     return c
  
-x = [1,1] +x = [1, 1] 
-prod = [1,1]+prod = [1, 1]
 for i in range(10): for i in range(10):
     prod = polymult(x,prod)     prod = polymult(x,prod)
-    print prod +    print(prod) 
-</sxh>+</code>
  
 ===== Génération par récurrence des polynômes de Legendre =====  ===== Génération par récurrence des polynômes de Legendre ===== 
 Proposition de GH, étudiant ba2 2012-2013, complétée par des commentaires. La fonction nécessite d'autres fonctions vues précédemment, qui sont reprises dans le code du programme : Proposition de GH, étudiant ba2 2012-2013, complétée par des commentaires. La fonction nécessite d'autres fonctions vues précédemment, qui sont reprises dans le code du programme :
-<sxh python; title : polylegendre.py> +<code python polylegendre.py> 
-#!/usr/bin/python+#!/usr/bin/env python
 # -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
 def polylegendre(nmax): def polylegendre(nmax):
-    """Fonction générant les coefficients des polynômes de Legendre jusqu'à l'ordre nmax+    """ 
 +    Fonction générant les coefficients des polynômes de Legendre jusqu'à l'ordre nmax
     cf. http://fr.wikipedia.org/wiki/Polyn%C3%B4me_de_Legendre pour la formule de récurrence     cf. http://fr.wikipedia.org/wiki/Polyn%C3%B4me_de_Legendre pour la formule de récurrence
     """     """
-    rep = [[1.],[0.,1.]] # les deux premiers polynômes (degrés 0 et 1) pour l'application de la formule de récurrence+    rep = [[1.], [0.,1.]] # les deux premiers polynômes (degrés 0 et 1) pour l'application de la formule de récurrence
     if nmax < 1: # si nmax est inférieur au degré 1, on renvoie le polynôme de degré 0     if nmax < 1: # si nmax est inférieur au degré 1, on renvoie le polynôme de degré 0
         rep = [[1.]]         rep = [[1.]]
     if nmax > 1:  # pour le degré max supérieur à deux, on calcule les polynômes suivants     if nmax > 1:  # pour le degré max supérieur à deux, on calcule les polynômes suivants
-        for n in range(2,nmax+1): # P_n(x) = (2n-1)/n x P_n-1(x) + (1-n)/n P_n-2(x)+        for n in range(2,nmax+1):     # P_n(x) = (2n-1)/n x P_n-1(x) + (1-n)/n P_n-2(x)
             rep.append(polyadd(polyscal((2*n-1.)/n,polyshift(rep[n-1])),polyscal((1.-n)/n,rep[n-2])))             rep.append(polyadd(polyscal((2*n-1.)/n,polyshift(rep[n-1])),polyscal((1.-n)/n,rep[n-2])))
     return rep     return rep
                  
 def polyscal(s,a): def polyscal(s,a):
-    """polynôme multiplié par un scalaire s """+    """ 
 +    polynôme multiplié par un scalaire s """
     b = []     b = []
     for coef in a:     for coef in a:
Ligne 126: Ligne 138:
  
 def polyshift(a): def polyshift(a):
-    """Multiplication du polynôme par la variable x""" +    """ 
-    b = [0]+a   # cela revient à "shifter" la liste des coefficients en insérant un 0 "à gauche"+    Multiplication du polynôme par la variable x""" 
 +    b = [0] + a   # cela revient à "shifter" la liste des coefficients en insérant un 0 "à gauche"
     return b     return b
  
 def polyadd(a,b): def polyadd(a,b):
-    """ Addition de deux polynômes de coefficients a et b+    """ 
 +    Addition de deux polynômes de coefficients a et b
     """     """
     r = a[:] # on travaille sur une copie de a pour ne pas le modifier     r = a[:] # on travaille sur une copie de a pour ne pas le modifier
Ligne 151: Ligne 165:
 # test de la fonction générant les polynômes de Legendre : # test de la fonction générant les polynômes de Legendre :
 for  k in range(6): # on teste la fonction sur des ordres croissants for  k in range(6): # on teste la fonction sur des ordres croissants
-    print polylegendre(k)[k]  # on imprime juste les coefficients du polynôme de plus haut ordre ! +    print(polylegendre(k)[k] # on imprime juste les coefficients du polynôme de plus haut ordre ! 
-</sxh>+</code>
  
 [[polynomes-11|Reste à créer un graphe...]] [[polynomes-11|Reste à créer un graphe...]]
  • teaching/progappchim/polynomes-10.1456230448.txt.gz
  • Dernière modification : 2016/02/23 13:27
  • de villersd