Feedback TP noté
- Mieux connaître les erreurs classiques en Python pour savoir comment les éviter.
Remarques générales
De manière logique, si une de vos fonctions en appelle une autre, il vaut mieux la placer avant dans un soucis de clarté qu’après son appel…
Une fois votre code fini, relancez le tout pour voir s’il fonctionne. Parfois vous avez des variables que vous avez renommées et qui ne sont plus définies, ou bien qui sont appelées mais définies plus tard dans le code. Cela peut être source d’erreurs…
ne pas coder en dure les tailles des problèmes dans les fonctions: si vous changez de problème, le code ne marchera plus. Ainsi, il vaut mieux éviter d’écrire:
def gradient_descente(grad_f, x_init, gamma, eps, n_iter): = np.reshape(x_init, (23, 1)) x
La dernière ligne peut être simplement:
x = np.reshape(x_init, (len(x_init), 1))
si besoin. Idéalement, éviter aussi l’étapereshape
d’ailleurs…Éviter la duplication de code, cela réduit le nombre de lignes et donc le nombre d’erreurs possibles. Par exemple:
for k in range(len(Iter_lin)): 0]) X1.append(Iter_lin[k][1]) Y1.append(Iter_lin[k][for k in range(len(Iter_adapt)): 0]) X2.append(Iter_adapt[k][1]) Y2.append(Iter_adapt[k][for k in range(len(Iter_méthode_1)): 0]) X3.append(Iter_méthode_1[k][1]) Y3.append(Iter_méthode_1[k][
peut se réécrire:
= [(Iter_lin, X1, Y1), (Iter_adapt, X2, Y2), (Iter_méthode_1, X3, Y3)] my_list for (Iter, X , Y) in my_list: 0] for x in Iter]) X.append([x[1] for x in Iter]) Y.append([x[
pep8
: amélioration de la lisibilité
écrire
x = x_init
et non pasx=x_init
. Cependant pour les attributs optionnels, il faut supprimer les espaces autour du=
, par exemple on écrit:plt.subplots(2, 1, sharex=True)
.écrire
descentegrad(grad_f1, x, 0.01, 1000, 0.01)
et non pasdescentegrad(grad_f1,x,0.01,1000,0.01)
numpy
la norme infinie s’obtient avec
np.linalg.norm(g, ord=np.inf)
et nonnp.linalg.norm(g)
(qui est la norme euclidienne par défaut).np.array([L[k] for k in range(len(L))])
est équivalent ànp.array(L)
vectorisation des codes: pensez à éviter les boucles pour certains calculs longs. Cela est plus rapide et plus lisible. Par exemple
for i in range(d): = res + x[i]**2 res
est équivalent à:
= np.sum(x**2) res
si d est le nombre de composantes de x.
scipy
problème de chargement:
import scipy = scipy.optimize.rosen_der grad_fros
ne fonctionne pas. Il faut écrire:
from scipy.optimize import rosen_der = rosen_der grad_fros
voir par exemple https://stackoverflow.com/questions/18049687/attributeerror-module-object-scipy-has-no-attribute-why-does-this-error