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 python “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!
Si vous voulez maintenant ne faire bouger qu'une seule des 3 valeurs, c'est facile et ce n'est pas la peine de redéfinir la fonction lambda: il suffit de recalculer les jeux d'essais en ne faisant bouger qu'un seul des paramètres. Par exemple: aller de [0.2,3,7] à [0.2,3,2.1] ne fera évoluer que le 3ème paramètre.