diff --git a/tp2/graphe_R2_dans_R2.py b/tp2/graphe_R2_dans_R2.py
index 124d983d5bb3e6cce80546de70d2aa363bc5c7bd..386e4ccd43c9411702d7bda8050dafefb773f88c 100755
--- a/tp2/graphe_R2_dans_R2.py
+++ b/tp2/graphe_R2_dans_R2.py
@@ -1,3 +1,22 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Nov 27 10:21:53 2024
+
+@author: pmontala
+"""
+
+ #**************************************
+ # TP2 RESEAU DE NEURONES 
+ # 27/11/2024
+ #**************************************
+ 
+import autograd as ag
+import autograd.numpy as np
+import numpy as np
+import scipy.linalg as nla
+import matplotlib.pyplot as plt
+
 #!/bin/python3
 
 from mpl_toolkits.mplot3d import axes3d
@@ -6,10 +25,10 @@ import autograd as ag
 import autograd.numpy as np
 
 def f (a,b):
-    return a**2 + 2*a*b - 1
+    return a**3*b - 3*(a**2)* (b - 1) + b**2 -1
 
 def g (a,b):
-    return a**2*b**2 - b - 1
+    return a**2*b**2 - 2
 
 fig = plt.figure(figsize = (20,20))
 ax = fig.add_subplot(1, 1, 1, projection='3d')
@@ -18,8 +37,14 @@ ax.set_xlabel('$a$', labelpad=20)
 ax.set_ylabel('$b$', labelpad=20)
 ax.set_zlabel('$f(a,b)$ et $g(a,b)$', labelpad=20)
 
-aplot = np.arange (-2, 1.7, 0.1)
-bplot = np.arange (-1.5, 0.8, 0.1)
+#ON AGRANDIT LA FENETER POUR TROUVER POINT D INTERSECTION 
+#entre le bleue et la rouge 
+# se mettre bien au dessus du graph 
+
+aplot = np.arange (-4, 0, 0.1)
+bplot = np.arange (-1, 3, 0.1)
+#  ON TROUVE A : -0.7, -2.9 
+#B : 1.9, 0.5
 
 ##### Graphe de f #####
 A, B = np.meshgrid (aplot, bplot)
@@ -39,4 +64,36 @@ ax.contour(A, B, Z, 0, colors="red",  levels=np.array([0], dtype=np.float64), li
 
 plt.show()
 
+# dans le terminal : python3 tp2.py
+# les coordonnées des 2 racines observés graphiquement 
+#               a      b
+u = np.array ([-0.7, 1.9])
+u = np.array ([-2.9, 0.5])
+"""
+# F
+def F(u) : 
+    a, b = u
+    return np.array ( [ f(a,b) , g(a,b) ])
+"""
+
+
+J_F= ag.jacobian(u)
+#Jacobienne 
+def Jac_F (u) : 
+    a,b=u
+    return np.array ([[3 * a**2 * b - 6 * a * b + 6*a, a**3 - 3*a**2 + 2*b],
+                      [2*a*b**2, a**2 * 2*b]])
 
+#print("Jacobienne : \n", Jac_F (1))
+#print('\n')
+"""
+#u = np.array ([-2.9, 0.5]) pn fait l'un puis l'autre 
+u = np.array ([-0.7, 1.9])
+for n in range (6) : 
+    print('u[%d] =' %n, u)
+    F_u = F(u)
+    J_u = Jac_F(u)
+    h = np.linalg.solve (-J_u, F_u)
+    u = u + h
+    
+  """  #F_u s'annule en u 
\ No newline at end of file
diff --git a/tp2/tp2.py b/tp2/tp2.py
new file mode 100644
index 0000000000000000000000000000000000000000..8625272024e1e6444402240c1a99f8903279bf3a
--- /dev/null
+++ b/tp2/tp2.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Nov 27 10:21:52 2024
+
+@author: tdanjoux
+"""
+
+import numpy as np
+import matplotlib.pyplot as plt
+
+import autograd.numpy as np
+from autograd import jacobian
+
+# Définir les fonctions f(a, b) et g(a, b)
+def f(a, b):
+    return a**3 * b - 3 * a**2 * (b - 1) + b**2 - 1
+
+def g(a, b):
+    return a**2 * b**2 - 2
+
+# Créer une grille pour a et b
+a = np.linspace(-2, 2, 400)
+b = np.linspace(-2, 2, 400)
+A, B = np.meshgrid(a, b)
+
+# Calculer les valeurs de f et g sur la grille
+F = f(A, B)
+G = g(A, B)
+
+# Tracer les courbes de niveau
+plt.figure(figsize=(8, 6))
+plt.contour(A, B, F, levels=[0], colors='blue', label='f(a, b) = 0')
+plt.contour(A, B, G, levels=[0], colors='red', label='g(a, b) = 0')
+plt.title("Solutions des équations f(a, b) = 0 et g(a, b) = 0")
+plt.xlabel("a")
+plt.ylabel("b")
+plt.grid()
+plt.legend(['f(a, b) = 0', 'g(a, b) = 0'])
+plt.show()
+
+
+
+def Jac_F(a, b):
+    J = np.array([
+        [3 * a**2 * b - 6 * a * (b - 1), a**3 + 2 * b],
+        [2 * a * b**2, 2 * a**2 * b]
+    ])
+    return J
+
+
+
+def newton_method(F, Jac_F, a0, b0, tol=1e-6, max_iter=100):
+    x = np.array([a0, b0])
+    for i in range(max_iter):
+        J = Jac_F(x[0], x[1])
+        F_val = F(x[0], x[1])
+        delta = np.linalg.solve(J, -F_val)  # Résolution de J * delta = -F
+        x = x + delta
+        if np.linalg.norm(delta) < tol:
+            return x, i
+    raise ValueError("Méthode de Newton n'a pas convergé")
+
+# Fonction vectorisée pour F
+def F_vectorized(a, b):
+    return np.array([
+        f(a, b),
+        g(a, b)
+    ])
+
+# Utilisation de la méthode de Newton
+solution, iterations = newton_method(F_vectorized, Jac_F, a0=1.0, b0=1.0)
+print("Solution trouvée :", solution)
+print("Nombre d'itérations :", iterations)
+
+
+
+
+
+# Redéfinir F pour accepter un tableau en entrée
+def F_autograd(u):
+    a, b = u
+    return np.array([
+        a**3 * b - 3 * a**2 * (b - 1) + b**2 - 1,
+        a**2 * b**2 - 2
+    ])
+
+# Calcul automatique du Jacobien
+Jac_F_autograd = jacobian(F_autograd)
+
+# Utilisation de la méthode de Newton avec autograd
+def newton_autograd(F, Jac_F, u0, tol=1e-6, max_iter=100):
+    u = np.array(u0)
+    for i in range(max_iter):
+        J = Jac_F(u)
+        F_val = F(u)
+        delta = np.linalg.solve(J, -F_val)
+        u = u + delta
+        if np.linalg.norm(delta) < tol:
+            return u, i
+    raise ValueError("Méthode de Newton avec autograd n'a pas convergé")
+
+# Initialisation et résolution
+u0 = [1.0, 1.0]
+solution_autograd, iterations_autograd = newton_autograd(F_autograd, Jac_F_autograd, u0)
+print("Solution avec autograd :", solution_autograd)
+print("Nombre d'itérations :", iterations_autograd)
+