Exercice 1 :
Implémenter une méthode grad_descent(J, dJ, rho, xinit, niter) qui retourne un triplet (xres, Js, xs) correspondant respectivement
On rappelle que $$ x_{k+1} = x_k - \rho \nabla J(x_k) $$
def grad_descent(J, dJ, rho, xinit, niter=50):
xres = xinit.copy()
Js = zeros((niter,1))
xs = zeros((2,niter))
for i in range(niter):
xres = xres - rho * dJ(xres)
Js[i] = J(xres)
xs[:,i] = xres[:,0]
return (xres, Js, xs)
On s'intéresse ici à la minimisation de la fonction $J(x) = \frac{1}{2} (x_0^2 + \eta x_1^2)$
Exercice 2 :
Implémeter deux fonctions anonymes retournant
eta = 10
J = lambda x : ( x[0,0]**2 + eta*x[1,0]**2 ) / 2
dJ = lambda x : array([[x[0,0]],[eta*x[1,0]]])
Exercice 3 :
Afficher les lignes de niveau de $J$ pour des valeurs de coordonnées comprises entre -1/2 et +1/2. On s'aidera de la fonction contourf.
t = linspace(-.5,.5,101)
[u,v] = meshgrid(t,t);
Jmesh = ( u * u + eta * v * v)
contourf(u,v,Jmesh,35)
<matplotlib.contour.QuadContourSet instance at 0x107c4f3f8>
Exercice 4 :
Appliquer la méthode du gradient à pas constant à la fonction $J$. Afficher d'une part l'évolution de la fonction objective et, d'autre part (bonus), les itérations $x_k$ sur les lignes de niveau de $J$.
rho = 1.8 / eta
(xres,Js,xs) = grad_descent(J,dJ,rho,randn(2,1),niter=20)
subplot(121)
plot(Js)
subplot(122)
contourf(u,v,Jmesh,35)
plot(xs[0,:], xs[1,:], 'k.-')
[<matplotlib.lines.Line2D at 0x107fca8d0>]
Ceci est un test d'équation: $$ z = \frac{t}{t^2} $$ Jolie equations $f^2$. En italique.
for i in range(1,5):
print(i);
print(i+1);
print('toto');
1 2 3 4 5 toto