Files
opti-non-lin/cours2.ipynb
2026-01-18 17:29:00 +01:00

549 lines
115 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "8e81b5c1",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"id": "4301d681",
"metadata": {},
"source": [
"# Question 1"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2c3e61f7",
"metadata": {},
"outputs": [],
"source": [
"def gradientquad(Q,c,p,x0,maxiter=100,choix='exact'):\n",
" fobj = np.zeros(maxiter)\n",
" x = x0.copy()\n",
"\n",
" valp, vecp = np.linalg.eig(Q)\n",
" L = np.max(valp)\n",
"\n",
" # Si le choix est \"constant\", alpha ne dépend pas de l'itéré, on le calcule une seule fois.\n",
" alpha = 1/L\n",
"\n",
" for k in range(maxiter):\n",
" # Gradient de fonction quadratique\n",
" d = -(Q@x-c)\n",
" if choix == \"exact\":\n",
" # Dépend de l'itéré, on le calcule à chaque itéré\n",
" alpha = (d@d)/(d@Q@d)\n",
" x = x + alpha*d\n",
" fobj[k] = 0.5*x@Q@x - c@x + p\n",
" if np.linalg.norm(d) <= 1e-6:\n",
" break\n",
" return x, fobj, k"
]
},
{
"cell_type": "markdown",
"id": "9c418d62",
"metadata": {},
"source": [
"## Expérience 1"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "7f35335f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x240ff222660>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAGdCAYAAAAWp6lMAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAATtxJREFUeJzt3Qd8FHX+//FPEiDU0LtURQEpIk1ALAdSbOjhKcVD+CHeKWBBBfFPsZyicPpTkZOzIKigqCeK6A9FRfDoRaQjIL2DQCD0ZP6Pz3ecZRNSNrCzszt5PR+PYdvszHcnS+adb5s4y7IsAQAA8LF4rwsAAADgNgIPAADwPQIPAADwPQIPAADwPQIPAADwPQIPAADwPQIPAADwPQIPAADwvXySB6WlpcnOnTulWLFiEhcX53VxAABACHSu5CNHjkilSpUkPj53dTZ5MvBo2KlSpYrXxQAAAOdh27ZtctFFF+XqPXky8GjNjnPAkpKSvC4OAAAIQXJysqmwcM7juZEnA4/TjKVhh8ADAEBsOZ/uKHRaBgAAvkfgAQAAvkfgAQAAvpcn+/AA8P/Q1TNnzkhqaqrXRQGQCwkJCZIvXz5Xpowh8ADwlVOnTsmuXbvk2LFjXhcFwHkoXLiwVKxYUQoUKCDhROAB4KtJRTdt2mT+StSJyfQXJpOLArFBa2b1D5Z9+/aZ/8e1atXK9eSC2SHwAPAN/WWpoUfn6dC/EgHElkKFCkn+/Plly5Yt5v9zwYIFw7ZtOi0D8J1w/lUIwB//f/mtAAAAfI/AAwB5WM+ePeW2224LPL7uuuvk4Ycf9rRMgBsIPAAQJXbv3i0PPfSQXHLJJabvQvny5aVVq1byxhtvRGzU2WeffSbPPvusq6EK0a+nD39mdFoGgCjw22+/mXBTokQJef7556V+/fqSmJgoK1askDfffFMqV64st956a6bvPX36tOnoGQ6lSpUKy3aAaEMNTzh99ZVI//4iX3zhdUkAxJgHHnjATLi2ePFiufPOO6VOnTpSs2ZN6dSpk3z11Vdyyy23BNbVofZa66MBqEiRIvLcc8+ZSRZ79+4tNWrUMCNdLrvsMnn11VfT7UPXGTBggAlVpUuXloEDB5qhwMEyNmmdPHlSHnvsMRO4dF/NmzeXH3/8MfD6+PHjzfa++eYbU+aiRYtKhw4dzFxI6qmnnpIJEybIF198YcqtS/D7g02fPl2uvvrqQPluvvlm2bhxY+D1li1byqBBg9K9R4cwa9ibPXt2SOVVc+bMMZ9TR/KVLFlS2rdvLwcPHsy0TM7n+/zzz80waa150/W3bdsWWEfLqD8nrZHTz9+0aVP57rvv0m3nX//6V+D9ut4dd9wh2fnvf/8rrVu3Nj9LHXX44IMPSkpKinntvffeM/tZv359uu9P7dq1AzWB77//vjRp0sRcVbxChQrSrVs32bt3b7p9rFq1yhxjvYi2rqf708+Sm59ZTLHyoMOHD+v/cHMbVgMH6q8Oy+rfP7zbBRCS48ePW6tXrza3jrQ0yzp61JtF9x2K/fv3W3FxcdaIESNCWl9/f5UrV84aN26ctXHjRmvLli3WqVOnrGHDhlmLFi2yfvvtN+uDDz6wChcubE2ePDnwvhdffNEqWbKk9Z///Mccp969e1vFihWzOnXqFFjn2muvtR566KHA43vvvddq2bKlNXv2bGvDhg3WqFGjrMTEROvXX381r7/77rtW/vz5rbZt25p9L1myxKpTp47VrVs38/qRI0esO++80+rQoYO1a9cus5w8eTLTz/Xpp5+asq1fv976+eefrVtuucWqX7++lZqaal5//fXXrapVq1ppQQd29OjR6Z7Lqby6XX18//33W8uWLbNWrlxptrFv375My+R8viZNmlhz5861Fi9ebDVr1szsw6HbGTt2rLVixQqznyFDhlgFCxY0PxelxyUhIcGaNGmStXnzZmvp0qXWq6++muXPV8tdpEgR63//93/N9ubMmWM1atTI6tmzZ2Cdv/zlL1bTpk2t06dPW9OmTTNl1LI53nnnHevrr78234958+ZZLVq0sDp27Bh4ffv27VapUqWsP//5z6Z869atM9+ntWvX5upnFqn/x+E4fxN4wumNN+zAc8st4d0ugPP+RanBQ/9berHovkMxf/588zvps88+S/d86dKlzYlPl4H6B9UfdN2HH344x+327dvX6ty5c+BxxYoVrZEjRwYe68nyoosuyjLw6AlbT9Q7duxIt902bdpYgwcPDgQCLY+epB1jxoyxypcvH3h8zz33pNtHqDSE6LY1SKi9e/da+fLlM2HGoSfyQYMGhVzerl27Wq1atQq5DM7n05+RY82aNea5BQsWZPm+yy+/3AQppSEuKSnJSk5ODmmfGkTvu+++dM/99NNPVnx8fOC7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PQGholkLAICIIvBEEkPTAQDwBIEnkhiaDgCAJwg8kcRILQAAPEHgiSQCDwAAniDweNGHhyYtAAAiisATRitWiEyYILJwYQ41PNu22cPTAQBARBB4wujdd0V69hT5+OMsVqhQQaRgQXviQQ09AAAgIgg8YZ5bUG3fnsUKcXEi1arZ9+nHAwBAxBB4Ihl4FEPTAQCIOAKPV4GHGh4AACKGwONC4NmxI5vrgxJ4AACIOAJPGFWsaHfTOXNGZO/eLFbi8hIAAPgz8IwZM0aqV68uBQsWlObNm8vCLMdti4wfP17i4uLSLfq+YJZlybBhw6RixYpSqFAhadu2raxfv168lj+/PRDLqeXJFH14AADwX+CZPHmyDBgwQIYPHy5Lly6Vhg0bSvv27WVvllUgIklJSbJr167AsmXLlnSvjxw5Ul577TUZO3asLFiwQIoUKWK2eeLECbc/zoX343ECz65dIsePR6xcAADkZa4Hnpdffln69OkjvXr1krp165qQUrhwYRk3blyW79FanQoVKgSW8uXLp6vdeeWVV2TIkCHSqVMnadCggbz33nuyc+dO+fzzzyXqA0+pUiLFitn3MwQ5AAAQg4Hn1KlTsmTJEtPkFNhhfLx5PG/evCzfd/ToUalWrZpUqVLFhJpVq1YFXtu0aZPs3r073TaLFy9umsqy2ubJkyclOTk53eLpXDxcYgIAAP8Env3790tqamq6GhqljzW0ZOayyy4ztT9ffPGFfPDBB5KWliYtW7aU7X8kCOd9udnmiBEjTChyFg1SbmFoOgAA0SfqRmm1aNFCevToIVdccYVce+218tlnn0nZsmXl3//+93lvc/DgwXL48OHAss3FyzoQeAAAyGOBp0yZMpKQkCB79uxJ97w+1r45ocifP780atRINmzYYB4778vNNhMTE01H6ODF08DD0HQAAPwTeAoUKCCNGzeW77//PvCcNlHpY63JCYU2ia1YscIMQVc1atQwwSZ4m9onR0drhbpNNwUHHsvKYiWGpgMAEFH53N6BDkm/5557pEmTJtKsWTMzwiolJcWM2lLafFW5cmXTz0Y988wzctVVV8kll1wihw4dklGjRplh6ffee29gBNfDDz8s//jHP6RWrVomAA0dOlQqVaokt912m3itUiX7VkfI//67SOnSmaxEkxYAAP4KPHfddZfs27fPTBSonYq1b870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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"Q = np.array([[10.0,-6.0],[-6.0,10.0]])\n",
"c = np.array([4.0,-3.0])\n",
"p = 0\n",
"x0 = np.array([1.0,1.0])\n",
"\n",
"# Méthode exacte\n",
"xopt, fobj, nbiter = gradientquad(Q,c,p,x0,maxiter=25,choix='exact')\n",
"plt.plot(fobj, 'b', label=\"Gradient avec pas exact\")\n",
"\n",
"# Méthode constante\n",
"xopt, fobj, nbiter = gradientquad(Q,c,p,x0,maxiter=25,choix='constant')\n",
"plt.plot(fobj, 'r', label=\"Gradient avec pas constant\")\n",
"\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"id": "c266cf47",
"metadata": {},
"source": [
"## Expérience 2"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "90781b5a",
"metadata": {},
"outputs": [],
"source": [
"from scipy.linalg import hilbert"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "4b09233b",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\conta\\AppData\\Local\\Temp\\ipykernel_10208\\2863094032.py:18: ComplexWarning: Casting complex values to real discards the imaginary part\n",
" fobj[k] = 0.5*x@Q@x - c@x + p\n"
]
},
{
"data": {
"text/plain": [
"Text(0, 0.5, \"Nombre d'itérations\")"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nbiter_exact = []\n",
"nbiter_constant = []\n",
"\n",
"for n in range(3,101):\n",
" Q = hilbert(n)\n",
" c = np.zeros(n)\n",
" p = 0\n",
" x0 = np.ones(n)\n",
" # Méthode exacte\n",
" xopt, fobj, nbiter = gradientquad(Q,c,p,x0,maxiter=10**6,choix='exact')\n",
" nbiter_exact.append(nbiter)\n",
" # Méthode constante\n",
" xopt, fobj, nbiter = gradientquad(Q,c,p,x0,maxiter=10**6,choix='constant')\n",
" nbiter_constant.append(nbiter)\n",
"\n",
"plt.plot(nbiter_exact, label=\"Pas exact\")\n",
"plt.plot(nbiter_constant, label=\"Pas constant\")\n",
"plt.xlabel(\"Dimension n\")\n",
"plt.ylabel(\"Nombre d'itérations\")"
]
},
{
"cell_type": "markdown",
"id": "7c28bbfd",
"metadata": {},
"source": [
"# Question 2"
]
},
{
"cell_type": "markdown",
"id": "795525ae",
"metadata": {},
"source": [
"## Implémenter les fonctions"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "e8da3a46",
"metadata": {},
"outputs": [],
"source": [
"def f_grad_conv(x, c=10.0):\n",
" f = 2*np.log(np.cosh((c/2)*(x[0]+2*x[1]))) + 2*np.log(np.cosh((c/2)*(2*x[0]-x[1])))\n",
" grad = np.array([\n",
" c*np.tanh((c/2)*(x[0]+2*x[1])) + 2*c*np.tanh((c/2)*(2*x[0]-x[1])),\n",
" 2*c*np.tanh((c/2)*(x[0]+2*x[1])) - c*np.tanh((c/2)*(2*x[0]-x[1]))\n",
" ])\n",
" L = 2.5*c**2\n",
" return f, grad, L"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "8fececb8",
"metadata": {},
"outputs": [],
"source": [
"def f_grad_strong(x, c=10.0, mu=10**2):\n",
" f, grad, L = f_grad_conv(x, c)\n",
" f += (mu/2)*(x[0]**2 + x[1]**2)\n",
" grad += mu*x\n",
" L += mu\n",
" return f, grad, L"
]
},
{
"cell_type": "markdown",
"id": "4e106212",
"metadata": {},
"source": [
"## Implémenter la fonction methgradient"
]
},
{
"cell_type": "code",
"execution_count": 43,
"id": "aad0cb25",
"metadata": {},
"outputs": [],
"source": [
"def methgradient(fct, x0, maxiter=100, tol=1e-9):\n",
" x = x0.copy()\n",
" fobj = np.zeros(maxiter)\n",
"\n",
" for k in range(maxiter):\n",
" f, grad, L = fct(x)\n",
" d = grad\n",
" alpha = 1/L\n",
" x = x - alpha*d\n",
" f, grad, L = fct(x)\n",
" fobj[k] = f\n",
" if np.linalg.norm(grad) <= tol:\n",
" break\n",
" return x, fobj[:k]"
]
},
{
"cell_type": "markdown",
"id": "4b2a063e",
"metadata": {},
"source": [
"## Expérience"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "5a665f93",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x2409f1e4550>"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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MAAxEog0m0udFOo40KoGVauapab6uVz18SecoA0ZzU4+2ezUU83UOdCqlVmzZmannOJ/TbfRSKxWQVBGOPZYfyaYPniGL/1UunSKHXNMqpUrl2rJyalmlmrr1yfbqlVmL70029q1a2sVK6ZYampN69dviC1YsM+WLFFvjkZ3O9t11/3R/vCHv1jlylUsNTXVhg/PuSGlegJuuOEG1yuiT71NmzZ1GzRqN2n1kugTrzat1BHazFLDT+FDQatXr3Y7UZcvX959Or7iiits/fr12V/X96mH5JlnnnHfq0/Sv/3tb90Gj3nRY4d6Zc466yz32LoutAHnKaecYikpKe6+Qjtih+g6bTSpncLVluuvv959opcWLVq4++rcuXP27Z944gk7+eST3XM/6aST7D//+U+OHh7dXptd/uY3v3GbarZp08a+/fZbt2u3NtHUc+7evbvrvQoXyf2++uqrbmdw9Xhp88u5c+dmP//8fvZ5eeONN1y79FjaFfxSfYDcb8uWLe5noY0+9Thqq3r6wnuEjj32WLcZqNqr56MNO3/88Uf3dW0qqvvN3WN0yy23uN9NyIcffpj9M6pbt67rXdMGqfL000+7+w1/XO2+rp9LaOf3r776yrVNt9P/RW1Uqh3Zi5WXILZu3aoOZneKErJrl+e9/rrnXXut51WqpA/EB47UVM8bNMjz3n/f8/bti3ZLEWd+/fVXb8mSJe40W1aW5+3YEZ1Djx2BzEzPu+aaPt6FF17s6aVo0ybPW7fO8zIyPC893fM++OAH76ijjvZ6977J+9//lnoPPDDZO/bYqt6AAcO9zz7z3NGyZSfvmGMqetdff5f3yivfenfdNdFLSkryHntsurdkied9+22m17Jle69x41O8V16Z7i1e/J03efIb3tSpb3m7d+/2Ro8e7VWsWNH78ccf3bF9+3bXtvr163sPP/zw/nZmes2bN/c6duzozZ8/3/vkk0+8Vq1aeZ06dcp+LsOHD/fKly/vXXbZZd7ixYu9OXPmeKmpqd6dd96Z53PXYy9btsy9Dr/yyivusXWd7r9UqVLe3Xff7b4+fvx476ijjnKnIWqb2vzggw96K1ascMe8efPcfb377rvuvn766Sd322effdarWbOme4yVK1e60ypVqngTJkxwX09PT3ffd9JJJ3nTpk1z/4/at2/vnl/nzp29Dz/80Fu4cKHX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zT8l1ACIPdTVACiENEINgJjGEBSACKURagDENEINgAilEWoAxE1dTUZGtFsDIIY1bOifEmoAxCbqagAUsqdm7drE2bGbUAPEG4agAESgShWzSpX88+rcTQSEGiDeEGoARCApKfHqagg1QLzW1ehViroaAAVISzuwXUIiINQA8Ya6GgARSqOnBkDMYwgKQATSCDUAYh6hBkAE0gg1AGIedTUAChFqvv/ebN8+CzxCDRCvdTUtW/rnqasBkI86dcxSUvxAkwiffwg1QLxiCArAIZQqZXb88YkzBEWoAeIVoQZABNISqK6GUAPEq44d/Y9h1NUAKEAaoQZAzGO9GgARSEugBfgINUA8YwgKwCGk0VMDIC4QagAUItR4ngUaoQaIZ9TVADiE44/3N7fcudNswwYLNEINEM+oqwFwCCkp/no1iTAEFVehJj093bp06WJNmjSxU0891XYqdgKJjiEoAIeQliB1NXEVavr27Wt33323LVmyxGbPnm0pip9AoiPUADiEhg39U0JNjPj666+tTJky9pvf/MZdrlKlipUuXTrazQJiq67mhx+i3RoAMSiNnprCmTNnjvXo0cNq1aplSUlJNmXKlINuM2bMGGvQoIGVK1fO2rVrZ/PmzYv4/pcvX27ly5d3j9GyZUu79957i6rpQHyjrgbAIaQRagpH9S3NmjVzwSUvkyZNssGDB9vw4cNt4cKF7rbdunWzDWGl2M2bN7emTZsedKxdu9b27dtnH3zwgf3nP/+xuXPn2owZM9wBgCEoAAVLlFBTZOM33bt3d0d+Ro0aZQMGDLB+/fq5y2PHjrWpU6faU089ZUOGDHHXLVq0KN/vr127trVu3drq1q3rLp9//vnu9uecc06et9+9e7c7QrZt23bYzw2Ii1DzwAOEGgAFhhr1I2zfblahggVSidTU7NmzxxYsWGBdu3Y98MClSrnL6nWJRJs2bVyvzpYtWywrK8sNd5188sn53n7kyJFWqVKl7CMUhoBA19VoHXTqagDkUqmS2XHHBb+3pkRCzaZNmywzM9Nq1KiR43pdXrduXUT3oaJg1dGceeaZdtppp1mjRo3swgsvzPf2Q4cOta1bt2YfGSxMhiCjrgbAISTCEFRcTR861BBXOE33Zso3Em4I6rPP/CGoq66KdmsAxGComTcv2KGmRHpqqlatasnJybZ+/foc1+tyampq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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x0 = np.array([1.0,1.0])\n",
"\n",
"xopt, fobj = methgradient(f_grad_conv, x0, maxiter=70)\n",
"plt.semilogy(fobj, 'b', label=\"Fonction convexe\")\n",
"\n",
"xopt, fobj = methgradient(f_grad_strong, x0, maxiter=70)\n",
"plt.semilogy(fobj, 'r', label=\"Fonction fortement convexe\")\n",
"\n",
"plt.xticks(np.arange(0,18,2))\n",
"plt.legend(loc='upper right')"
]
},
{
"cell_type": "markdown",
"id": "e6e7014d",
"metadata": {},
"source": [
"# Question 3"
]
},
{
"cell_type": "markdown",
"id": "6adbe45c",
"metadata": {},
"source": [
"## Implémenter la fonction\n",
"Note: La fonction n'est pas L-smooth parce qu'on peut pas trouver une fonction quadratique avec un seul L tel que cette fonction est au dessus de $x^4$.\n",
"La courbature de $x^4$ en $\\infty$ est aussi $\\infty$."
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "ca042253",
"metadata": {},
"outputs": [],
"source": [
"def fct(x):\n",
" f = (x[0]+x[1])**4 - 2*(x[0]+x[1])**2 + 1\n",
" g1 = 4*(x[0]+x[1])**3 - 4*(x[0]+x[1])\n",
" g = np.array([g1, g1])\n",
" return f, g"
]
},
{
"cell_type": "markdown",
"id": "6e8069ca",
"metadata": {},
"source": [
"## Implémenter les deux conditions de Wolfe"
]
},
{
"cell_type": "code",
"execution_count": 104,
"id": "baf4f554",
"metadata": {},
"outputs": [],
"source": [
"def w1(fct, x, d, alpha, beta1):\n",
" f0, g0 = fct(x)\n",
" f1, _ = fct(x+alpha*d)\n",
" return f1 <= f0 + beta1*alpha*(g0@d)\n",
"\n",
"def w2(fct, x, d, alpha, beta2):\n",
" _, g0 = fct(x)\n",
" _, g1 = fct(x+alpha*d)\n",
" return d@g1 >= beta2*(d@g0)"
]
},
{
"cell_type": "markdown",
"id": "5b935acb",
"metadata": {},
"source": [
"## Implémenter la bissection de Wolfe"
]
},
{
"cell_type": "code",
"execution_count": 105,
"id": "253f97be",
"metadata": {},
"outputs": [],
"source": [
"def wolfebissection(fct, x, d, alpha0=1.0, beta1=1e-4, beta2=0.9):\n",
" aleft = 0\n",
" aright = np.inf\n",
" alpha = alpha0\n",
"\n",
" while True:\n",
" if w1(fct, x, d, alpha, beta1) and w2(fct, x, d, alpha, beta2):\n",
" return alpha\n",
" if not w1(fct, x, d, alpha, beta1):\n",
" # On bouge la borne de droite vers la gauche\n",
" aright = alpha\n",
" alpha = (aleft + aright)/2\n",
" elif not w2(fct, x, d, alpha, beta2):\n",
" # On bouge la borne de gauche vers la droite\n",
" aleft = alpha\n",
" if aright < np.inf:\n",
" alpha = (aleft + aright)/2\n",
" else:\n",
" alpha *= 2"
]
},
{
"cell_type": "markdown",
"id": "1dc9c161",
"metadata": {},
"source": [
"## Implémenter la méthode du gradient avec recherche de Wolfe"
]
},
{
"cell_type": "code",
"execution_count": 106,
"id": "acd3c8f0",
"metadata": {},
"outputs": [],
"source": [
"def methgradient(fct, x0, maxiter=100, tol=1e-6, alpha0=1e-6):\n",
" x = x0.copy()\n",
" fobj = np.zeros(maxiter)\n",
" alpha = alpha0\n",
"\n",
" for k in range(maxiter):\n",
" f, g = fct(x)\n",
" d = -g\n",
" alpha = wolfebissection(fct, x, d, alpha)\n",
" x = x + alpha*d\n",
" fobj[k] = f\n",
" if np.linalg.norm(g) <= tol:\n",
" break\n",
" return x, fobj[:k]"
]
},
{
"cell_type": "markdown",
"id": "c6f5ebc5",
"metadata": {},
"source": [
"## Exemple numérique"
]
},
{
"cell_type": "code",
"execution_count": 107,
"id": "fcef62aa",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-0.50000003 -0.50000003]\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAAGdCAYAAABO2DpVAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJdZJREFUeJzt3Ql0VOX5x/EnOyTsyCqroKKyqCwWqYgFAauI1uOKiohLISiIAqYWEK1EpVUsIiL/AvYIiFbQlrYoIkutIKsLLqwqVMGIBxJIQojJ/Z/nDRMzkECWd+bO3Pv9nDNmZjLLm8s188tzn/e9MY7jOAIAAGBBrI0XAQAAUAQLAABgDcECAABYQ7AAAADWECwAAIA1BAsAAGANwQIAAFhDsAAAANbES5gVFhbKd999JzVr1pSYmJhwvz0AAKgEXU/z0KFD0rRpU4mNjY2cYKGhonnz5uF+WwAAYMGePXukWbNmkRMstFIRGFitWrXC/fYAAKASsrKyTGEg8DkeMcEicPhDQwXBAgCA6HKqNgaaNwEAgDUECwAAYA3BAgAAWBP2HgsAiJapdT/99JMUFBS4PRQgLOLi4iQ+Pr7KS0EQLADgOEePHpW9e/dKTk6O20MBwio5OVmaNGkiiYmJlX4NggUAHLeI31dffWX+etOFgPQXLIv5wQ8VuqNHj8oPP/xg9v8zzzzzpItgnQzBAgBK0F+uGi50vr7+9Qb4RfXq1SUhIUG++eYb8/9BtWrVKvU6NG8CQCkq+9ca4Pf9nv9zAACANQQLAABgDcECAFAld9xxh1xzzTXFt3v16iWjRo1ydUx+0KpVK5k6dWrx7X379snll18uKSkpUqdOHdfGRbAAAA/RD5eRI0dK27ZtTfNdo0aNpEePHjJjxoywTZ9dtGiRPP744yENL9Hi8OHDpiHy1VdfDbr/pptuMrONvv766xPCwvjx4yv1Xs8++6yZJv3RRx/Jtm3bxC2eCRYTJ4oMHy7y/fdujwQA3LFr1y654IIL5J133pHJkyfL5s2bZc2aNTJ27FhZsmSJvPvuu2U+Nz8/39o46tWrd8ozYPpFjRo1pEuXLrJy5cqg+/W2zjwqeb9O89QZGb/61a8q9V47d+6Uzp07m6miDRs2FLd4Jli89JLIjBma1t0eCQCvcRyR7Gx3Lvre5TV8+HCzcuKGDRvkhhtukHPOOUfOOOMMGThwoPzzn/+UAQMGFD9W/1rWKsbVV19tSudPPPGEWWV06NCh0rp1azP18Oyzz5bnnnsu6D30MaNHjzal9vr165vQomsglHT8oZC8vDx56KGH5PTTTzfvddFFFwV9oM6dO9e83ttvv23GrB/G/fv3N399q0cffVRefvlleeutt8y49XL8B3XA0qVL5Ze//GXx+K666irzgRtw8cUXy7hx44Keo2s3aFVh9erV5Rqv+u9//2t+Tp2SXLduXenXr58cOHCg1DFddtllQc//4osv5MiRIzJs2LCg+/V6UlKSdO/e3dx+44035LzzzjP3aSXjT3/6k5RFv6+P/+tf/2q2j1Z41MGDB+Wuu+6SBg0amDOKa2j5+OOPJaScMMvMzNQ90Hy16ayzdM92nNWrrb4sAJ/Jzc11Pv/8c/M14PDhot8vblz0vctj//79TkxMjJOenl6ux+vv4YYNGzqzZ892du7c6XzzzTfO0aNHnQkTJjjr1693du3a5bzyyitOcnKys3DhwuLnPfXUU07dunWdN954w2ynoUOHOjVr1nQGDhxY/JhLL73UGTlyZPHtu+66y7n44oud1atXOzt27HCmTJniJCUlOdu2bTPfnzNnjpOQkOD06dPHvPfGjRudc845x7nlllvM9w8dOuTccMMNTv/+/Z29e/eaS15eXqk/19/+9jcztu3btzubN292BgwY4HTo0MEpKCgw33/++eedFi1aOIWFhcXPmTZtWtB9pxqvvq7eHjZsmPPRRx85W7ZsMa/xww8/lDqmd955x2zv7777ztyePn26c+WVVzpr1651WrZsWfy42267zenVq5e5vmHDBic2NtZ57LHHnK1bt5ptVL16dfM1QJ/77LPPmusZGRlm++h20u1z8OBBc79uU90Gul11/A8++KBTv35958cffyz3/l/Rz2/PBIsuXYr+J1yyxOrLAvCZaA0W+iGlv1sXLVoUdL9+iKSkpJjL2LFji+/Xx44aNeqUr5uamupcd911xbebNGniPP3008W38/PznWbNmpUZLDSwxMXFOd9++23Q6/bu3dtJS0sz1/XDUsejH+IB+uHbqFGj4tuDBw8Oeo/y0g97fe1PP/20+AM4Pj7ehIaA7t27O+PGjSv3eG+++WanR48e5R5Ddna2k5iY6MyfP9/cvv7668021G2n/y4a4pSGm0mTJpnrGqouv/zyoNcZM2aMc+6555YaLJRuH91OAf/5z3+cWrVqOUeOHAl6nTZt2jgzZ84MWbDwzMqbtWoVfT10yO2RAPAaXYDz8GH33rsq1q1bZ1YSHTRokCnxl6TH/o83ffp0mT17tuzevVtyc3PNCoznn3+++V5mZqY5PKGHBgL00Iu+zvGHQwI+/fRTc/jkrLPOCrpfx6KHKn7+OZOlTZs2xbf1fBUZGRkV/nm3b98uEyZMkA8//FD2799vfnalP0/79u3NIYG+ffvKvHnz5JJLLjF9DdqHMnPmzHKPV5sjr7/++nKPKTk5Wbp27WoOddx8882yatUqGTNmjNl2emhG79ftp2PUwyaBwyV6CKskbcLVWSA6Pl1y/lT0kIc2j5bczkr/XUseHrLNc8EiK8vtkQDwGj1VSEqKRDSdBaLH1rdu3Rp0v/ZYKO2ZOJ72D5SkMxe0t0CP5etxfm3AnDJlivmQriz9YNMPwY0bN57wYai9FAHa41CS/ixlhZWT0T6Sli1byqxZs8y5XjRYaKDQgBSgIev++++XadOmyfz586VDhw7mUt7xlrYtT+Wyyy6ThQsXymeffWY+2C+88EJz/6WXXiorVqww49QAUjK0VZX+LBrQSutHCeV0VM80bwYakAkWAPxI/yrVNQyef/55ydauz0rQhkT9C1qbQHV2iYaVkn/Z1q5d23xQlQwaemp5/RAui76O/oWt1Qd9vZKXxo0bl3tsejK4U53C/scffzTB6ve//7307t3bNIKW1lCplQBtntRGTw0WGjQqMt6OHTvK8uXLpaLBYvv27eb9tLk0EFp69uxpKhj64a8VicBZRXXs+u9Rkt7WSkp5qhVKw4tOP9bKyPE/y2mnnSah4plgQcUCgN+98MIL5oNeD03oX8daTtcP2ldeeUW+/PLLU34g6TRFnVGiszN0HQRdT2H9+vVBj9E1Mp588kl58803zWtqCNGZB2XRD0L94L799tvN+hZ66EEPz6Snp5uZKuWlsx4++eQT8/PoIY7Spsfq7AwNWC+99JLs2LFD3nvvPTODpbRKja6JoT+fbiM9PFGR8aalpZntoj+7jkm3g86w0XGVRQObzu7QKolWKQK6detmQozOeAkcBlEPPvigCS+6Hoj+W+isGA2NWlEqrz59+pjKk/6sOgVZ18z44IMP5JFHHjH/ziHjeKR5U3tq9Kcp0YgMABV2sua1aKAzD0aMGOG0bt3azLSoUaOG061bNzOzQZsIA/T38OLFi4Oeq01+d9xxh1O7dm2nTp06ZtbDww8/7HTq1Kn4MdpwqI2Z2hSojxk9erRz++23n3RWSGC2SatWrcyYtAH02muvdT755JPi5k19z5J0bCU/orTpUpsZ9efR+1esWFHqz79s2TIzo0RnbXTs2NFZuXJlqT/rv/71L3N/z549T3iNU41X6evqzBF9H90O/fr1cw4cOHDSfxvdLvqe2mhbks4E0fvXrFlzwgwXbdbUMWhjp/4blnSq5k2VlZXl3HfffU7Tpk3N6zRv3twZNGiQs3v37pA1b8bofySMsrKyTDlNm4B0Tq0tTz6pKVLkzjtF/vIXay8LwGe0RK5/pepaDpU9bTTgxf2/vJ/fHAoBAADWeCZY0LwJAID7PBMsqFgAAOA+ggUAALCGYAEApQhzXzvgmf3ec8GCJb0BVEVgBcicnBy3hwKEXWC/P34lVF8u6V2yeVMDly7BCwAVpYtI6XLHgfNU6DLLurw04PVKRU5Ojtnvdf8v7+qeng4WgYqFhgpdzbbEEvQAUCGBpZsrcxIsIJppqKjIUuueDhZ6ThgNWLqUvFYtCBYAKksrFHpOjIYNG5a6dDTgRQkJCVWqVHguWGilUqsWer4ZDRZNm7o9IgDRTn/J2vhFC/iJZ5o3FQ2cAAC4y1PBgtU3AQBwl6eCBWtZAADgLoIFAACwhmABAACs8WSwoHkTAAB3eDJYULEAAMAdngoWzAoBAMBdngoWVCwAAHAXwQIAAFjjyWBB8yYAAO7wZLCgYgEAgDs8FSxo3gQAwF2eChZULAAAcBfBAgAAuBMsCgoKZPz48dK6dWupXr26tGnTRh5//HFxHEciKVgcOSKSn+/2aAAA8J/4ijz4qaeekhkzZsjLL78s5513nmzYsEGGDBkitWvXlvvvv18ipcciMDOkXj03RwMAgP9UKFh88MEHMnDgQLnyyivN7VatWsmCBQtk3bp1Egni40WqVxfJzS06HEKwAAAggg+FXHzxxbJ8+XLZtm2buf3xxx/L+++/L1dccUWZz8nLy5OsrKygSyjRZwEAQJRULB5++GETDNq1aydxcXGm5+KJJ56QQYMGlfmc9PR0mTRpkoSLBovvvydYAAAQ8RWL1157TebNmyfz58+XTZs2mV6LP/7xj+ZrWdLS0iQzM7P4smfPHgklKhYAAERJxWLMmDGmanHTTTeZ2x06dJBvvvnGVCUGDx5c6nOSkpLMJVxY1hsAgCipWOTk5EhsbPBT9JBIYWGhRApW3wQAIEoqFgMGDDA9FS1atDDTTTdv3izPPPOM3HnnnRIpOBQCAECUBItp06aZBbKGDx8uGRkZ0rRpU7n33ntlwoQJEikIFgAAREmwqFmzpkydOtVcIhXBAgAA93jqXCGK5k0AANzjuWBB8yYAAO7xXLDgUAgAAO4hWAAAAGsIFgAAwBrPBguaNwEACD/PBgsqFgAAhJ+nZ4U4jtujAQDAXzxbsdDTl+TkuD0aAAD8xXPBIjlZJHCeNA6HAAAQXp4LFjExNHACAOAWzwULRQMnAADu8GSwYFlvAADc4clgQcUCAAB3ECwAAIA1ng4WNG8CABBeng4WVCwAAAgvTwYLmjcBAHCHJ4MFFQsAANxBsAAAANZ4OljQvAkAQHh5OlhQsQAAILw8GSxo3gQAwB2eDBZULAAAcAfBAgAAWEOwAAAA1ng6WOTmivz0k9ujAQDAPzzdvKmYcgoAQPh4MlgkJIhUq1Z0ncMhAACEjyeDhaLPAgCA8CNYAAAAazwfLOixAAAgfDwfLKhYAAAQPp4NFizrDQBA+Hk2WFCxAAAg/AgWAADAGs8HC5o3AQAIH88HCyoWAACEj2eDBc2bAACEn2eDBRULAADCj2ABAACs8XywoHkTAIDw8XywoGIBAED4eDZY0LwJAED4+aJi4ThujwYAAH/wfLAoKBDJzXV7NAAA+INng0VKikhMTNF1GjgBAAgPzwYLDRU0cAIAEF6eDRaKBk4AAMLL08GCigUAAOFFsAAAANYQLAAAgDW+CBbMCgEAIDw8HSxo3gQAILw8HSw4FAIAQHgRLAAAgDUECwAAYI0vggXNmwAAhIengwXNmwAAhJengwWHQgAACC+CBQAAsIZgAQAArPFFsKB5EwCACA0W3377rdx6661Sv359qV69unTo0EE2bNggkRwssrNFCgrcHg0AAN4XX5EHHzhwQHr06CGXXXaZ/Pvf/5YGDRrI9u3bpW7duhLJs0ICVYs6ddwcDQAA3lehYPHUU09J8+bNZc6cOcX3tW7dWiJVYqJIUpJIXl5RnwXBAgCACDoU8ve//126dOki119/vTRs2FAuuOACmTVr1kmfk5eXJ1lZWUGXcKKBEwCACA0Wu3btkhkzZsiZZ54pb7/9tgwbNkzuv/9+efnll8t8Tnp6utSuXbv4ohWPcKKBEwCA8IlxHMcp74MTExNNxeKDDz4ovk+Dxfr162XNmjVlViz0EqAVCw0XmZmZUivwqR9CF14osnmzyNKlIv36hfztAADwJP381gLBqT6/K1SxaNKkiZx77rlB951zzjmye/fuMp+TlJRkBlDyEk4s6w0AQPhUKFjojJCtW7cG3bdt2zZp2bKlRCp6LAAAiNBg8cADD8jatWtl8uTJsmPHDpk/f7689NJLkpqaKpGKYAEAQIQGi65du8rixYtlwYIF0r59e3n88cdl6tSpMmjQIIlUNG8CABCh61ioq666ylyiBRULAADCx9PnClE0bwIAED6eDxZULAAACB+CBQAAsMY3wYLmTQAAQs83wYKKBQAAoef5YEHzJgAA4eP5YEHFAgCA8PFVsCj/6dYAAEBl+CZY/PSTyJEjbo8GAABv83ywSEkRiYkpus7MEAAAQsvzwSI2VqRGjaLr9FkAABBang8WigZOAADCg2ABAACsIVgAAABrfBUsaN4EACC0fBUsqFgAABBavggWLOsNAEB4+CJYULEAACA8CBYAAMAaXwULmjcBAAgtXwULKhYAAISWL4IFzZsAAISHL4IFFQsAAMKDYAEAAKzxVbCgeRMAgNDyVbCgYgEAQGj5qnnz8GGRggK3RwMAgHf5qmIRCBcAACA0fBEskpJEEhOLrnM4BACA0PFFsFA0cAIAEHq+CxZULAAACB3fBAtW3wQAIPR8EyyoWAAAEHoECwAAYA3BAgAAWOO7YMGsEAAAQsc3wYLmTQAAQs83wYJDIQAAhB7BAgAAWEOwAAAA1vguWNC8CQBA6PguWFCxAAAgdHwTLJgVAgBA6PkmWFCxAAAg9AgWAADAGt8Fi/x8kbw8t0cDAIA3+SZY1Kjx83WqFgAAhIZvgkVs7M/hgmABAEBo+CZYKPosAAAILYIFAACwxpfBgtU3AQAIDV8GCyoWAACEhq+CBatvAgAQWr4KFlQsAAAILYIFAACwxpfBguZNAABCw5fBgooFAACh4atgQfMmAACh5atgQcUCAIDQIlgAAABrCBYAAMAaXwYLZoUAABAavgoWNG8CABBavq1YFBa6PRoAALynSsHiySeflJiYGBk1apREU7BQhw+7ORIAALyp0sFi/fr1MnPmTOnYsaNEi6QkkYSEouscDgEAIEKCxeHDh2XQoEEya9YsqVu3rkSLmBgaOAEAiLhgkZqaKldeeaX06dPnlI/Ny8uTrKysoIubmHIKAEDoxFf0Ca+++qps2rTJHAopj/T0dJk0aZJECmaGAAAQIRWLPXv2yMiRI2XevHlSrVq1cj0nLS1NMjMziy/6Gm6iYgEAQIRULDZu3CgZGRly4YUXFt9XUFAgq1evlueff94c9oiLiwt6TlJSkrlECoIFAAAREix69+4tn376adB9Q4YMkXbt2sm4ceNOCBWRiOZNAAAiJFjUrFlT2rdvH3RfSkqK1K9f/4T7IxUVCwAAQsdXK28qmjcBAIigWSHHW7lypUQTKhYAAISO7yoWBAsAAELHt8GC5k0AAOzzbbCgYgEAgH2+CxY0bwIAEDq+CxZULAAACB2CBQAAsMa3wYLmTQAA7PNtsMjLK7oAAAB7fBcsatT4+TpVCwAA7PJdsNDzpKWkFF2nzwIAALt8FywUDZwAAISGr4MFh0IAALDL18GCigUAAHb5Mliw+iYAAKHhy2BBxQIAgNAgWAAAAGsIFgAAwBpfBwtmhQAAYJevgwUVCwAA7PJlsGBWCAAAoeHLYEHFAgCA0CBYAAAAa3wdLGjeBADALl8HCyoWAADY5ctgQfMmAAChEev3QyGFhW6PBgAA7/B1sHAckexst0cDAIB3+DJYVKsmEh9fdJ0GTgAA7PFlsIiJoYETAIBQ8GWwUDRwAgBgn2+DBRULAADsI1gQLAAAsMb3wYLmTQAA7PF9sKBiAQCAPb4NFjRvAgBgn2+DBRULAADsI1gQLAAAsMb3wYLmTQAA7PF9sKBiAQCAPb4NFjRvAgBgn2+DBRULAADsI1gQLAAAsIZgQbAAAMAa3wcLZoUAAGCP74PFkSMiR4+6PRoAALzBt8GiRo2fr1O1AADADt8Gi/h4keTkouv0WQAAYIdvg4WigRMAALsIFhwKAQDAGoIFFQsAAKzxdbBgWW8AAOzydbCgYgEAgF0EC4IFAADWECxo3gQAwBqCBRULAACs8XWwoHkTAAC7fB0sqFgAAGAXwYJgAQCANQQLmjcBALCGYEHFAgAAa3wdLGjeBADALl8HCyoWAADYRbA41mPhOG6PBgCA6EewEJHCQpGcHLdHAwCAz4JFenq6dO3aVWrWrCkNGzaUa665RrZu3SrRqnp1kbi4ouscDgEAIMzBYtWqVZKamipr166VZcuWSX5+vvTt21eys7MlGsXE0MAJAIBN8RV58NKlS4Nuz50711QuNm7cKD179pRoPRxy8CDBAgCAsAeL42VmZpqv9erVK/MxeXl55hKQFWGf4MwMAQAgApo3CwsLZdSoUdKjRw9p3779SfsyateuXXxp3ry5RBKCBQAAERAstNdiy5Yt8uqrr570cWlpaaayEbjs2bNHIgnLegMA4PKhkBEjRsiSJUtk9erV0qxZs5M+NikpyVwiFRULAABcChaO48h9990nixcvlpUrV0rr1q0l2jErBAAAl4KFHv6YP3++vPXWW2Yti3379pn7tXeiui4KEYWoWAAA4FKPxYwZM0yfRK9evaRJkybFl4ULF0q0IlgAAODioRCvoXkTAAB7fH2uEEXFAgAAe3wfLGjeBADAHt8HCyoWAADYQ7AgWAAAYA3BguZNAACsIVhQsQAAwBrfB4tA82Zurkh+vtujAQAguhEsjgULxeEQAACqxvfBIiFBJLAaOYdDAACoGt8HC0UDJwAAdhAsaOAEAMAaggWrbwIAYA3BgooFAADWECwIFgAAWEOwoHkTAABrCBZULAAAsIZgQfMmAADWECyoWAAAYA3BgmABAIA1BAuaNwEAsIZgQcUCAABrCBYECwAArCFYMCsEAABrCBZULAAAsIZgcVywcBy3RwMAQPQiWJQIFoWFIrm5bo8GAIDoRbAQkeRkkdhjW4LDIQAAVB7BQkRiYmjgBADABoLFMTRwAgBQdQSLYwgWAABUHcHiGJb1BgCg6ggWx1CxAACg6ggWx9C8CQBA1REsjqFiAQBA1REsjiFYAABQdQSLY2jeBACg6ggWx1CxAACg6ggWx9C8CQBA1REsjqFiAQBA1REsjiFYAABQdQSL44LFgQNujwQAgOhFsDimTRuR+HiRXbtEFi1yezQAAEQngsUxTZqIjB1bdD01lcoFAACVQbAoYfx4kbPPFtm3T+Shh9weDQAA0YdgUUK1aiJ/+YtITIzI7Nki777r9ogAAIguBIvj9OhRdChE3XOPSHa22yMCACB6ECxKMXmySPPmIl99VXR4BAAAlA/BooxVOGfOLLo+darIhx+6PSIAAKIDwaIMV1whctttIo4jMnSoyNGjbo8IAIDIR7A4iWefFWnQQOSzz0TS090eDQAAkY9gcRL164tMm1Z0/YknRLZscXtEAABENoLFKdxwg8jVV4vk54vcdZdIQYHbIwIAIHIRLE5B17R44YWic4loE2egggEAAE5EsCiH008XmTKl6PojjxSdTwQAAJyIYFFOehikVy+RnByRe+8tmi0CAACCESzKKTZWZNasomW/danvuXPdHhEAAJGHYFEBbduKPPZY0fXRo0X27nV7RAAARBaCRQU98IBI584iBw+KjBjh9mgAAIgsBIsKio8vOgOqfl20SOSNN9weEQAAkYNgUQmdOok8/HDRdT0T6oEDbo8IAIDIQLCopN//XqRdO5Hvvxd58EG3RwMAQGQgWFRSUpLI//1f0QJac+aILFvm9ogAAHAfwaIKevT4uYHznntEsrPdHhEAAFEYLKZPny6tWrWSatWqyUUXXSTr1q0Tv5o8WaRFC5Gvvy46PAIAgJ9VOFgsXLhQRo8eLRMnTpRNmzZJp06dpF+/fpKRkSF+VKOGyMyZRdefe05k7Vq3RwQAQBQFi2eeeUbuvvtuGTJkiJx77rny4osvSnJyssyePVv8qn9/kdtvL1rme+jQooWzdJ2L3FzOhgoA8Jf4ijz46NGjsnHjRklLSyu+LzY2Vvr06SNr1qwp9Tl5eXnmEpCVlSVe9MwzIkuXinz+uUjTpsHfi4sTSUwsumjT58m+6iUhoagpVC+6lHjgenkvgeeoinwt63vHK+3+ijy2omy8hhfGAADlpatE61m5Iz5Y7N+/XwoKCqRRo0ZB9+vtL7/8stTnpKeny6RJk8Tr6tcvmiVy660anoK/p1ULrV7oBQCAUNO1lqIiWFSGVje0J6NkxaJ58+biRQMGiGRmFh0Syc/XCk/RRQs2Ffmqz9XXKCws+lrWpazv6/0qcAbW8nwt63tlKc/ZXW2cAbaqr8FZaAH4UUqKe+9doWBx2mmnSVxcnHyvq0KVoLcbN25c6nOSkpLMxU+0bB44rAEAgJ9UqHkzMTFROnfuLMuXLy++r7Cw0Nzu3r17KMYHAACiSIUPhehhjcGDB0uXLl2kW7duMnXqVMnOzjazRAAAgL9VOFjceOON8sMPP8iECRNk3759cv7558vSpUtPaOgEAAD+E+M44W1v0+bN2rVrS2ZmptRyq2UVAACE5PObc4UAAABrCBYAAMAaggUAALCGYAEAAKwhWAAAAGsIFgAAwBqCBQAAsIZgAQAArCFYAACA6Dlt+vECC33qCl4AACA6BD63T7Vgd9iDxaFDh8zX5s2bh/utAQCAhc9xXdo7Ys4VoqdZ/+6776RmzZoSExNjNUlpWNmzZw/nILGA7WkP29Iutqc9bEu7vL49HccxoaJp06YSGxsbORULHUyzZs1C9vr6j+nFf1C3sD3tYVvaxfa0h21pVy0Pb8+TVSoCaN4EAADWECwAAIA1ngkWSUlJMnHiRPMVVcf2tIdtaRfb0x62pV1sT5eaNwEAgHd5pmIBAADcR7AAAADWECwAAIA1BAsAAGCNZ4LF9OnTpVWrVlKtWjW56KKLZN26dW4PKeo8+uijZjXUkpd27dq5PayosXr1ahkwYIBZlU633Ztvvhn0fe2TnjBhgjRp0kSqV68uffr0ke3bt7s23mjelnfccccJ+2r//v1dG28kS09Pl65du5rVjhs2bCjXXHONbN26NegxR44ckdTUVKlfv77UqFFDrrvuOvn+++9dG3O0b89evXqdsH/+9re/Fb/wRLBYuHChjB492kzz2bRpk3Tq1En69esnGRkZbg8t6px33nmyd+/e4sv777/v9pCiRnZ2ttn3NOSW5umnn5Y///nP8uKLL8qHH34oKSkpZj/VX+qo2LZUGiRK7qsLFiwI6xijxapVq0xoWLt2rSxbtkzy8/Olb9++ZhsHPPDAA/KPf/xDXn/9dfN4Pe3Cb37zG1fHHc3bU919991B+6f+/+8bjgd069bNSU1NLb5dUFDgNG3a1ElPT3d1XNFm4sSJTqdOndwehifo/1qLFy8uvl1YWOg0btzYmTJlSvF9Bw8edJKSkpwFCxa4NMro3JZq8ODBzsCBA10bUzTLyMgw23TVqlXF+2FCQoLz+uuvFz/miy++MI9Zs2aNiyONzu2pLr30UmfkyJGOX0V9xeLo0aOyceNGU1YueT4Svb1mzRpXxxaNtDSv5eczzjhDBg0aJLt373Z7SJ7w1Vdfyb59+4L2U11zXw/bsZ9WzsqVK00p+uyzz5Zhw4bJjz/+6PaQokJmZqb5Wq9ePfNVf3/qX90l9009BNqiRQv2zUpsz4B58+bJaaedJu3bt5e0tDTJyckRvwj7Schs279/vxQUFEijRo2C7tfbX375pWvjikb6ITd37lzzi1pLd5MmTZJLLrlEtmzZYo4novI0VKjS9tPA91B+ehhES/WtW7eWnTt3yu9+9zu54oorzAdhXFyc28OLWHp26VGjRkmPHj3MB57S/S8xMVHq1KkT9Fj2zcptT3XLLbdIy5YtzR9pn3zyiYwbN870YSxatEj8IOqDBezRX8wBHTt2NEFD/+d47bXXZOjQoa6ODSjppptuKr7eoUMHs7+2adPGVDF69+7t6tgimfYG6B8K9E6Fdnvec889QfunNmzrfqkhWPdTr4v6QyFaatK/UI7vYNbbjRs3dm1cXqB/wZx11lmyY8cOt4cS9QL7IvtpaOihO/1dwL5athEjRsiSJUtkxYoV0qxZs+L7df/TQ8oHDx4Mejz7ZuW2Z2n0jzTll/0z6oOFlvA6d+4sy5cvDypP6e3u3bu7OrZod/jwYZOwNW2jarRkr7+kS+6nWVlZZnYI+2nV/e9//zM9FuyrJ9L+V/0QXLx4sbz33ntmXyxJf38mJCQE7Ztattf+KvbNim/P0nz00Ufmq1/2T08cCtGppoMHD5YuXbpIt27dZOrUqWbqz5AhQ9weWlR56KGHzNoBevhDp5vp9F2tBt18881uDy1qgljJv0i0YVN/oWhTlzbC6bHYP/zhD3LmmWeaX0bjx483x2B1HjzKvy31ov0/utaChjUNv2PHjpW2bdua6bs4sVw/f/58eeutt0yvVKBvQpuHdT0V/aqHOvX3qG7bWrVqyX333WdCxS9+8Qu3hx9123Pnzp3m+7/+9a/NuiDaY6HTeXv27GkO2fmC4xHTpk1zWrRo4SQmJprpp2vXrnV7SFHnxhtvdJo0aWK24emnn25u79ixw+1hRY0VK1aYaWfHX3RqZGDK6fjx451GjRqZaaa9e/d2tm7d6vawo25b5uTkOH379nUaNGhgpkm2bNnSufvuu519+/a5PeyIVNp21MucOXOKH5Obm+sMHz7cqVu3rpOcnOxce+21zt69e10dd7Ruz927dzs9e/Z06tWrZ/4/b9u2rTNmzBgnMzPT8QtOmw4AAKyJ+h4LAAAQOQgWAADAGoIFAACwhmABAACsIVgAAABrCBYAAMAaggUAALCGYAEAAKwhWAAAAGsIFgAAwBqCBQAAsIZgAQAAxJb/B1HIuCr5eQRwAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x0 = np.array([1.0,1.0])\n",
"maxiter = 30\n",
"# Importance de alpha0!\n",
"xopt, fobj = methgradient(fct, x0, maxiter=maxiter, alpha0=0.05)\n",
"plt.plot(fobj, 'b', label=\"Gradient avec Wolfe\")\n",
"plt.legend(loc=\"upper right\")\n",
"print(xopt)"
]
},
{
"cell_type": "markdown",
"id": "c36d5972",
"metadata": {},
"source": [
"## Bonus: Méthode gradient accéléré"
]
},
{
"cell_type": "code",
"execution_count": 108,
"id": "94113279",
"metadata": {},
"outputs": [],
"source": [
"def methgradientaccel(fct, x0, maxiter=100, tol=1e-6, alpha0=1e-6):\n",
" x = x0.copy()\n",
" fobj = np.zeros(maxiter)\n",
"\n",
" xprev = x\n",
" alpha = alpha0\n",
"\n",
" for k in range(maxiter):\n",
" beta = k/(k+3) # Paul Tseng (version plus simple)\n",
" y = x + beta*(x - xprev)\n",
" f, g = fct(y)\n",
" d = -g\n",
" alpha = wolfebissection(fct, y, d, alpha)\n",
" xprev = x.copy()\n",
" x = y + alpha*d\n",
" f, g = fct(x)\n",
" fobj[k] = f\n",
" if np.linalg.norm(g) <= tol:\n",
" break\n",
" return x, fobj[:k]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b8b110f9",
"metadata": {},
"outputs": [],
"source": [
"x0 = np.array([1.0,1.0])\n",
"maxiter = 30\n",
"# Importance de alpha0!\n",
"xopt, fobj = methgradientaccel(fct, x0, maxiter=maxiter, alpha0=0.05)\n",
"plt.plot(fobj, 'b', label=\"Gradient avec Wolfe\")\n",
"plt.legend(loc=\"upper right\")\n",
"print(xopt)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "optinonlin",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}