teaching:progappchim:polynomes-7

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
Prochaine révision
Révision précédente
teaching:progappchim:polynomes-7 [2012/11/09 11:25] villersdteaching:progappchim:polynomes-7 [2019/02/25 11:06] (Version actuelle) villersd
Ligne 1: Ligne 1:
 ====== Polynômes : comment les multiplier par un scalaire et les additionner ====== ====== Polynômes : comment les multiplier par un scalaire et les additionner ======
-<sxh python; title : poly07-scal-add.py> +<code python poly07-scal-add.py> 
-#!/usr/bin/python+#!/usr/bin/env python
 # -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
-""" écriture d'un programme pour évaluer+""" 
 +écriture d'un programme pour évaluer
 des polynomes des polynomes
-+ fonction de multiplication d'un polynome pas un scalaire ++ fonction de multiplication d'un polynôme pas un scalaire 
-+ fonction d'addition de deux polynomes++ fonction d'addition de deux polynômes
 """ """
 from math import * from math import *
  
 def polyeval(x,a): def polyeval(x,a):
-    """application de l'agorithme de Horner+    """ 
 +    application de l'agorithme de Horner
     cf. http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Ruffini-Horner     cf. http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Ruffini-Horner
     """     """
-    n=len(a)-1 # n = ordre du polynome +    n = len(a) - 1 # n = ordre du polynôme 
-    p=a[n] +    p =0. 
-    for i in range(n-1,-1,-1): +    for i in range(n,-1,-1): 
-        p=p*x+a[i]+        p = p*x +a[i]
     return p     return p
  
-def polyscal(a,s): +def polyscal(s,a): 
-    """polynome multiplié par un scalaire s """ +    """ 
-    b=[]+    polynôme multiplié par un scalaire s 
 +    """ 
 +    b = []
     for coef in a:     for coef in a:
         b.append(coef*s)         b.append(coef*s)
Ligne 28: Ligne 32:
  
 def polyadd(a,b): def polyadd(a,b):
-    """ Addition de deux polynomes de coefficients a et b 
     """     """
-    r=a[:] # on travaille sur une copie de a pour ne pas le modifier +    Addition de deux polynômes de coefficients a et b 
-    t=b[:] # idem pour b  +    """ 
-    g=[]   polynome somme +    r = a[:]      # on travaille sur une copie de a pour ne pas le modifier 
-    n1=len(r) # ordre du premier polynome +    t = b[:]      # idem pour b  
-    n2=len(t) # ordre du second polynome +    g = []        polynôme somme 
-    if n1>n2: # premier polynome de plus haut degré que le second +    n1 = len(r)   # ordre du premier polynôme 
-        for i in range (n1-n2):+    n2 = len(t)   # ordre du second polynôme 
 +    if n1 > n2:   # premier polynôme de plus haut degré que le second 
 +        for i in range(n1-n2):
             t.append(0)             t.append(0)
-    elif n1<n2: # second polynome de plus haut degré que le premier +    elif n1 < n2: # second polynôme de plus haut degré que le premier 
-         for i in range (n2-n1):+         for i in range(n2-n1):
              r.append(0)              r.append(0)
     # r et t ont à présent la même longueur     # r et t ont à présent la même longueur
-    for i in range (len(r)): +    for i in range(len(r)): 
-        g.append(r[i]+t[i])+        g.append(r[i] + t[i])
     return g  # on retourne les coefficients additionnés dans la liste g     return g  # on retourne les coefficients additionnés dans la liste g
  
 # différents tests : # différents tests :
-x=2. +x = 2. 
-a=[1,1,1,1,1,1,1,1,1,1,1] +a = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
-print polyeval(x,a)+print(polyeval(x,a))
  
-varx=0.5 +coefm = 2.75 
-varcoef=[1.,2.,3.,4.,5.,6.,7.,8.,9.,10.] +print(polyscal(coefm,a)) 
-print polyeval(varx,varcoef)+ 
 +varx = 0.5 
 +varcoef = [1., 2., 3., 4., 5., 6., 7., 8., 9., 10.] 
 +print(polyeval(varx,varcoef))
  
 for j in range(0,11,1): for j in range(0,11,1):
-    rep=sin(polyeval(float(j)*0.1,varcoef)) +    rep = sin(polyeval(float(j) * 0.1,varcoef)) 
-    print rep+    print(rep)
  
-u=[1,2,4,8,16] +u = [1, 2, 4, 8, 16] 
-v=[1,3,9,27,81,243,729] +v = [1, 3, 9, 27, 81, 243, 729] 
-print u,v,polyadd(u,v) +print(u,v,polyadd(u,v)
-</sxh>+</code> 
 + 
 +Dans le fonction polyadd ci-dessus, l'idée est de compléter les listes par autant de zéros qu'il faut pour que la liste la plus courte devienne aussi longue que l'autre. On travaille en fait sur des copies des listes pour ne pas modifier les données originales, car python passe les paramètres des fonctions par référence et pas par valeur 
 + (//cf.// [[http://www.tutorialspoint.com/python/python_functions.htm|ici]] ou [[http://www.python-course.eu/passing_arguments.php|là]]). Polyadd aurait pu être conçue d'une autre manière, par exemple en additionnant les termes tant qu'on est en dessous du degré maximum du polynôme de degré minimum ! et en complétant ensuite par les coefficients de degré supérieur du polynôme de degré maximum. Comme la [[polynomes-7-contrib1|proposition suivante d'un étudiant]] ! 
 + 
 +Si on utilise les astuces de programmation les plus "pythoniques" avec notamment la librairie [[https://docs.python.org/3/library/itertools.html|itertools]], la fonction polyadd peut être récrite beaucoup plus simplement : 
 + 
 +<code python> 
 +def polyadd2(a,b): 
 +    """ Addition de deux polynomes de coefficients a et b 
 +    utilisation de la librairie itertools avec itertools.zip_longest 
 +    ref : https://stackoverflow.com/questions/44000727/iterate-over-two-lists-with-different-lengths 
 +    """ 
 +    return [u + v for u, v in itertools.zip_longest(a, b, fillvalue=0)] 
 +</code>
  
 Il est temps de créer des graphes de fonctions polynomiales. Comment faire ? Quelles librairies utiliser ? Il est temps de créer des graphes de fonctions polynomiales. Comment faire ? Quelles librairies utiliser ?
Ligne 68: Ligne 90:
  
 Voici un programme simple pour une fonction particulière (une sinusoïde amortie) : Voici un programme simple pour une fonction particulière (une sinusoïde amortie) :
-<sxh python; title : simple-plot-sinus-amorti.py> +<code python simple-plot-sinus-amorti.py> 
-#!/usr/bin/python +#!/usr/bin/env python 
-# -*- coding: iso-8859-15 -*- +# -*- coding: UTF--*- 
-sinusoïde amortie+""" 
 +graphe d'une sinusoïde amortie 
 +"""
  
 from pylab import * from pylab import *
  
 def sin_amort(t):         def sin_amort(t):        
-    s1 = sin(pi*t)         +    s1 = sin(pi * t)         
-    e1 = exp(-t/8.)         +    e1 = exp(- t /8.)         
-    return s1*e1+    return s1 * e1
  
 xvals = arange(0., 40., 0.1) xvals = arange(0., 40., 0.1)
Ligne 86: Ligne 110:
 plot(xvals, sin_amort(xvals), 'ro', xvals, sin_amort(xvals), 'k') plot(xvals, sin_amort(xvals), 'ro', xvals, sin_amort(xvals), 'k')
 show() show()
-</sxh>+</code>
  
 Il faut donc faire un programme similaire en introduisant la fonction nécessaire et en adaptant les appels. Il faut donc faire un programme similaire en introduisant la fonction nécessaire et en adaptant les appels.
  
 [[polynomes-8|Réponse à la page suivante !]] [[polynomes-8|Réponse à la page suivante !]]
  • teaching/progappchim/polynomes-7.1352456700.txt.gz
  • Dernière modification : 2012/11/09 11:25
  • de villersd