Ceci est une ancienne révision du document !
j'ai une fonction y=f(x), et j'aimerais bien pouvoir en calculer d'un seul coup 20 valeurs pour x=0.2 à x=2.3 afin de la tracer.
J'ai une autre fonction y=f(x,z,t), et j'aimerais étudier ses valeurs pour 10 jeux de paramètres [x,z,t] allant de [2,56,7.89] jusqu'à [8.23,72,-21.32]
Dans les 2 cas, j'ai besoin d'une fonction qui me calcule la liste des valeurs ou la liste des jeux de valeurs que je vais pouvoir appliquer à la fonction.
usr/bin/python # -*- coding: utf-8 -*- # indispensable pour qu'une division entre 2 entiers donne un résultat décimal! from __future__ import division def jeuxdessais(n,L1,L2): """jeudessais(n,L1,L2): Construit une liste de n listes de paramètres de L1 (début) à L2 (fin)""" L=[] if type(L1)!=list: # ici, L1 est un nombre, alors L2 doit en être un aussi # calcul d'une liste simple (et non d'une liste de liste) L2m1=L2-L1 for i in range(0,n): L.append(L1+L2m1/(n-1)*i) else: # L1 est une liste, L2 doit en être une aussi! np=len(L1) # calcul d'une liste de n listes de np paramètres compris entre L1 et L2 for i in range(0,n): Lp=[] for k in range(0,np): Lp.append(L1[k]+(L2[k]-L1[k])/(n-1)*i) L.append(Lp) return L # exemples d'utilisation: print jeuxdessais(5,2008,2012) # affiche [2008.0, 2009.0, 2010.0, 2011.0, 2012.0] print jeuxdessais(5,[1,45.2,89],[20,5,-42]) # affiche (avec arrondis) [[1.0, 45.2, 89.0], [5.75, 35.15, 56.25], [10.5, 25.1, 23.5], [15.25, 15.05, -9.25], [20.0, 5.0, -42.0]]
Une fois la liste des valeurs obtenues, on va utiliser la fonction map pour appliquer à la fonction. Si nécessaire, on va utiliser lambda afin de pouvoir passer une liste de valeurs.
Exemples.
Calcul de 10 valeurs du sinus d'un angle en radian entre 0 et pi/4, arrondi à 4 chiffres après la virgule:
map(sin,jeuxdessais(10,0,pi/4)) => "[0.0000,0.0872,0.1736,0.2588,0.3420,0.4226,0.5000,0.5736,0.6428,0.7071]"
Calcul de la valeur de l'expression 2*cos(pi/x)*z+e**t pour 10 valeurs de [x,z,t] allant de [0.2,3,7] à [1.3,6.8,2.1], arrondi à 4 chiffres après la virgule:
y=lambda L: 2*cos(pi/L[0])*L[1]+e**L[2] map(y,jeuxdessais(10,[0.2,3,7],[1.3,6.8,2.1])) => [1090.6331,629.7409,374.5529,220.4540,122.8208,64.4736,31.0290,12.51279,2.7275,-2.0135]
Vous voyez l'astuce: comme map demande de ne passer qu'un seul paramètre, on se débrouille avec lambda pour créer une fonction qui demandera une liste de paramètres!