{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Line-search methods" ] }, { "cell_type": "code", "execution_count": 411, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pylab as pl\n", "import matplotlib.pyplot as plt\n", "plt.rcParams['figure.dpi']= 100 # parameter for resolution of graphics\n", "import time\n", "\n", "v = 2 # variant corresponding to the number of the function below\n", "Maxiter = 200 # Number of iterations\n", "x0 = 2 # Initialization\n", "a = 0 # Lower bound for the plot interval\n", "b = 4 # Upper bound for the plot interval\n", "Tol = 1e-15\n", "\n", "InitStep = 1 # initial step\n", "m1 = 0.1 #Parameters\n", "m2 = 0.7" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Various objective functions" ] }, { "cell_type": "code", "execution_count": 412, "metadata": {}, "outputs": [], "source": [ "def fun(x,v): # function definition\n", " if v==0:\n", " return 3*(1.5*x-1)**2\n", " if v==1:\n", " return x**3-5*x+1\n", " if v==2:\n", " return x**4-2*x**3-5*x\n", " if v==3:\n", " return np.cos(5*x)-8*x+2.5*x**2\n", " if v==4:\n", " return np.cos(5*x)-8*x+1.5*x**2\n", "\n", "def der(x,v): # first derivative\n", " if v==0:\n", " return 3*2*(1.5*x-1)*1.5\n", " if v==1:\n", " return 3*x**2-5\n", " if v==2:\n", " return 4*x**3-6*x**2-5\n", " if v==3:\n", " return -5*np.sin(5*x)-8+2.5*2*x\n", " if v==4:\n", " return -5*np.sin(5*x)-8+1.5*2*x\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Algorithm: Generic Line Search\n", "\n", "
\n", "\n", " **Initialization:** Start with $t_l=t_r=0$ and pick an initial $t>0$.\n", "\n", " **Iterate:** \n", " - **Step 1**\n", " - **if** (a) then exit: you found a good $t$\n", " - **if** (b) then $t_r = t$: you found a new upper bound for $t$\n", " - **if** (c) then $t_l = t$: you found a good new lower bound for $t$\n", " - **Step 2**\n", " - **if** no valid $t_r$ exists then choose a new $t>t_r$\n", " - **else** choose a new $t \\in (t_l,t_r)$\n", "
\n", "\n", "\n", "\n", "\n", "\n", "## Goldstein-Price\n", "\n", "\n", "
\n", "\n", "Recall the three conditions for the **Goldstein-Price line-search**\n", "\n", "$\\star$ $m_1,m_2 \\in (0,1)$ are chosen constants such that $m_1<0.5$ and $m_2>0.5$.\n", " \n", "(a) $m_2 q'(0) \\leq \\frac{q(t)-q(0)}{t} \\leq m_1 q'(0)$ (then we have a good $t$)\n", "\n", "(b) $m_1q'(0)< \\frac{q(t)-q(0)}{t}$ (then $t$ is too big)\n", "\n", "(c) $\\frac{q(t)-q(0)}{t}\n", "\n" ] }, { "cell_type": "code", "execution_count": 413, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0\n", "0 4\n", "2.0 4\n", "2.0 3.0\n", "2.5\n" ] }, { "data": { "image/png": "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AuCmm26iY8eOPlfUtMV1wGQMrgbK8XoesoB/A3/wtSIREUk499xzD3l5efTs2ZOrrrrK73KaPHPO+V3DLgmerllYWFhIdna23+WIiEgDy83NZc8992Tr1q1Mnz6ds846y++SUkZRURE5OTkAOc65oljX08mxIiKS0K677jq2bt3KUUcdxZlnnul3OYLCg4iIJLAPP/yQl156ibS0NKZMmaIz7BKEwoOIiCSkHTt2VNxm+9JLL2W//fbzuSIJUXgQEZGE9Pjjj/Pdd9/Rtm3biltvS2JQeBARkYSzfv16xo0bB8DkyZNp3769zxVJOIWNC1QJAAAgAElEQVQHERFJOOPGjWPDhg0MHDiQSy+91O9yJILCg4iIJJQ5c+bw2GOPAfDAAw+Qnu73JYkkksKDiIgkjB07djB69Gicc5x//vkcffTRfpckUSg8iIhIwnj44Yf5+uuvadOmDXfffbff5Ug1FB5ERCQhrFq1qmKQ5J133kmnTp18rkiqo/AgIiIJ4eqrr2bTpk0MHjyYSy65xO9ypAYKDyIi4rv33nuv4kqSjzzyCGlp+nlKZPp2RETEV8XFxfzhD94Nla+44gr2339/nyuS2ig8iIiIryZOnMjixYvp3r07kyZN8rsciYHCg4iI+Gbu3Lncc889ADzyyCNkZ2f7XJHEQuFBRER8sX37di666CLKy8s566yzOPnkk/0uSWKk8CAiIr64++67+fbbb2nXrh1TpkzxuxypA4UHERFpdAsWLODWW28F4L777tM1HZKMwoOIiDSq8vJyLr74YkpKSjjhhBM477zz/C5J6kjhQUREGtVDDz3Exx9/TMuWLXnssccwM79LkjpSeBARkUbz008/ccMNNwDw5z//mV69evlckdSHwoOIiDSKsrIyRo4cydatWzn++OMZM2aM3yVJPSk8iIhIo7j77rv57LPPyM7O5sknn9ThiiSm8CAiInH3/fffM2HCBACmTJlCjx49fK5IdoXCg4iIxFVpaSkjR46ktLSUk08+mZEjR/pdkuwihQcREYmrSZMm8fXXX9OuXTsef/xxHa5IAQoPIiISNx999BF33HEHAI8++ihdunTxuSJpCAoPIiISFxs2bOC8887DOceoUaMYMWKE3yVJA1F4EBGRBuecY/To0axYsYL+/ftz//33+12SNCCFBxERaXDTpk3jpZdeIj09neef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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def LinesearchGP(q,dq,m1,m2): \n", " tl = 0\n", " tr = 0\n", " t = b\n", " qp = dq(0,v)\n", " q0 = fun(0,v)\n", " xs = np.linspace(a,b)\n", " ys = q0+m1*qp*xs\n", " ys2 = q0+m2*qp*xs\n", " plt.plot(xs,ys,label=\"m1\")\n", " plt.plot(xs,ys2,label=\"m2\")\n", " qt = q(t,v)\n", " plt.plot(t,qt,'.g')\n", " while (1==1):\n", " qt = q(t,v)\n", " plt.plot(t,qt,'xr')\n", " print(tl,\" \",tr)\n", " if ((qt-q0)/t<=(m1*qp)) and ((qt-q0)/t>=(m2*qp)):\n", " step=t # we found a good step\n", " break\n", " if ((qt-q0)/t>(m1*qp)):\n", " # step too big\n", " tr = t\n", " if ((qt-q0)/t<(m2*qp)):\n", " # step too small\n", " tl = t\n", " if(tr==0):\n", " t = 2*tl\n", " else:\n", " t = 0.5*(tl+tr)\n", " if (tr-tl)<1e-15:\n", " break\n", " print(t)\n", " plt.plot(t,q(t,v),'xb')\n", "\n", "uplim = max(fun(a,v),fun(b,v))+1 # set limits for the plot window\n", "dnlim = -3\n", "t1 = np.linspace(a,b,100) # Create a discretization to be used with the plots\n", "plt.figure(1)\n", "plt.plot(t1,fun(t1,v),'k') # Plot the function to be optimized on the interval [a,b]\n", "\n", "LinesearchGP(fun,der,m1,m2)\n", "plt.title('Goldstein-Price')\n", "plt.legend()\n", "plt.show() \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Armijo\n", "\n", "
\n", "\n", "Recall the three conditions for the **Armijo line-search**\n", "\n", "$\\star$ $m_1,m_2 \\in (0,1)$ are chosen constants such that $m_1<0.5$ and $m_2>0.5$.\n", "\n", "(a) $\\frac{q(t)-q(0)}{t} \\leq m_1 q'(0)$ (then we have a good $t$)\n", "\n", "(b) $m_1q'(0)< \\frac{q(t)-q(0)}{t}$ (then $t$ is too big)\n", "\n", "(c) Never. You may take $t_l=0$ always.\n", "
" ] }, { "cell_type": "code", "execution_count": 414, "metadata": {}, "outputs": [], "source": [ "def LinesearchArmijo(q,dq,m1): \n", " tl = 0\n", " tr = 0\n", " t = b\n", " qp = dq(0,v)\n", " q0 = fun(0,v)\n", " xs = np.linspace(a,b)\n", " ys = q0+m1*qp*xs\n", " plt.plot(xs,ys,label=\"m1\")\n", " qt = q(t,v)\n", " plt.plot(t,qt,'.g')\n", " while (1==1):\n", " qt = q(t,v)\n", " plt.plot(t,qt,'xr')\n", " print(tl,\" \",tr)\n", " if ((qt-q0)/t<=(m1*qp)):\n", " step=t # we found a good step\n", " break\n", " if ((qt-q0)/t>(m1*qp)):\n", " # step too big\n", " tr = t\n", " if(tr==0):\n", " t = 2*tl\n", " else:\n", " t = 0.5*(tl+tr)\n", " if (tr-tl)<1e-15:\n", " break\n", " plt.plot(t,q(t,v),'xb')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "\n" ] }, { "cell_type": "code", "execution_count": 415, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0\n", "0 4\n" ] }, { "data": { "image/png": "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oSd4bAy+ZpdZJztiWSnOuULn3M7QBOyqrWJFRCQ1FRQUhB9jPXbsWI+riX+xCAzvAb3KzOsJ5AZ/XkMgGAwILQyOS+gHfBCDekRERA7w9NNPs337drp168YZZ5zhdTlxLxZXSTwAvG9mfwL+DzgOuDw44ZxzZvYgcJuZrSQQICYB+cArMahHRESkFOccDz/8MBAYu6DnRkRX64HBOfexmQ0lMO5gAoFAcJ1z7pmI1e4DsoDHgWbAu8Bpzrl9tV2PiIhIWW+99RZffvklWVlZjBw5MvoGEpMeBpxzrwGvVbLcEQgTE2Lx+SIiIpUJ9S6MGDGCpk2belxNYtCzJEREJKWsXr2aV199FdCllNWhwCAiIill8uTJOOc47bTT6NWr7Bh9qYgCg4iIpIydO3cydepUQJdSVpcCg4iIpIwnn3ySnTt30qdPH3JycrwuJ6EoMIiISEooLi7mwQcfBOCGG27A59OfwOrQb0tERFLC7NmzWbduHa1bt9ZTKWtAgUFERJKec46//e1vAFx99dXUr1/f44oSjwKDiIgkvbfffpulS5dSv359rrrqKq/LSUgKDCIikvRCvQuXXHIJrVq18riaxKTAICIiSe2rr77i1Vdfxcy4/vrrvS4nYSkwiIhIUnvggQcAGDRokG7UdBAUGEREJGl9//33zJgxA4A//OEPHleT2BQYREQkaT300EPs27ePY489ll/+8pdel5PQFBhERCQp7dy5kylTpgAwbtw4zMzjihKbAoOIiCSlRx99lB07dtC7d28GDx7sdTkJT4FBRESSzr59+8KDHW+++WbdBroW6DcoIiJJZ/r06WzcuJEOHTowfPhwr8tJCgoMIiKSVPbv3899990HwI033khGRobHFSUHBQYREUkqL774IqtXr+aQQw7hsssu87qcpKHAICIiScM5x9133w3A2LFjycrK8rii5KHAICIiSWPevHksX76crKwsrrnmGq/LSSoKDCIikhScc9x5550AXHHFFbRo0cLjipKLAoOIiCSF+fPns2TJEurXr88f//hHr8tJOgoMIiKS8JxzTJw4EYDLL7+cNm3aeFxR8lFgEBGRhLd48WLeffddMjIyuOmmm7wuJykpMIiISMIL9S5cdtlltG/f3uNqkpMCg4iIJLR33nmHhQsXkp6ezs033+x1OUlLgUFERBLapEmTABg5ciSdOnXy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ziQtLY0XXniBE0880euyJEEoMIiIpADnHGPHjuXJJ5/E5/PxzDPPMHDgQK/LkgSiwCAikuScc9x4441MmTIFM2PatGkMGzbM67IkwSgwiIgkMecct912G/fffz8ATzzxBBdddJHHVUki0vNKRUSSlHOOW265JXznxilTpjBq1CiPq5JEpcAgIpKEnHNcd911PPzwwwA8/PDDjB492uOqJJEpMIiIJBm/38/o0aN57LHHMDMeffRRLr/8cq/LkgSnwCAikkRKSkoYNWoU06dPx+fz8c9//pNLLrnE67IkCSgwiIgkiX379jF8+HBefvll0tLSmDlzJueff77XZUmSUGAQEUkCO3bsYPDgwSxevJiMjAxmzZrF0KFDvS5LkogCg4hIgtuwYQOnn346y5cvp0mTJsyZM4f+/ft7XZYkGQUGEZEEtnLlSnJyclizZg3Z2dnMmzePI4880uuyJAnpxk0iIgnqnXfe4fjjj2fNmjUceuihvP/++woLEjMKDCIiCWjmzJkMGDCArVu3ctxxx/Hee+/RrVs3r8uSJKbAICKSQJxzTJgwgYsvvpji4mLOPvtsFi5cSHZ2ttelSZJTYBARSRAFBQWcf/75TJo0CYBx48bx/PPP07BhQ48rk1SgQY8iIglg9erVDB06lM8++4x69erx+OOPM3LkSK/LkhSiwCAiEufeeOMNzj//fLZt20Z2djazZ8/mF7/4hddlSYrRKQkRkTjl9/u55557OOOMM9i2bRv9+vVj6dKlCgviCfUwiIjEoR9++IERI0Ywd+5cAC677DImT55MZmamx5VJqlJgEBGJM++88w7nn38+69evJzMzk4cfflhPmxTP6ZSEiEic8Pv9/OUvf+GUU05h/fr19OzZk48++khhQeKCZ4HBzK42s7Vmts/MlpjZcV7VIiLitdzcXE499VRuvfVWSkpKuPDCC1m6dCmHH36416WJAB4FBjMbBtwP3AkcDSwH3jCz1l7UIyLiFecc06ZNo2/fvixevJisrCymTp3KjBkzaNSokdfliYR51cNwA/CEc+4p59yXwJXAHuBSj+oREalzmzdv5qyzzmLkyJHs2rWLE044geXLl3PppZdiZl6XJ1JKnQ96NLMM4Bjg7tA855zfzOYDP6/rekLmvvNfnKXRtk0bmjRuhM9npJmR5jPMIC34PjTfZ4bPF5jvC67nM8Nn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APH111+Hp8qu5mjSpEk4PIQCRe/evenevbtGoEut+vzzz5k6dSozZ85ky5YtQOCOg4MGDWLMmDEMGDBA4VWSggKDJCTnHBs3biwVIL766iu+/vpr1q5dW+GVHKFeibJhQr0SUh3r1q1j1qxZPPvssyxbtiw8v3379owYMYJRo0bRtWtXDysUqX0KDJJ09u3bx7fffhsOEJFhYseOHRVu16RJk1LjJEJTjx49aNiwYR22QOLRunXrmDNnDs8//zzvvvtueH69evU488wzGTVqFDk5OboPiSQtBQZJGc45vv/++3KDxJo1ayq9v0THjh1LDbgMTZ07d9YfiCTlnOOLL75gzpw5vPLKK+EbLEHglMNJJ53E8OHDOeuss3Qlj6QEBQYRAgPWvv3221KnOEJTZc/myMjI4NBDDz3gvhI9evSgXbt2urdEgtm+fTsLFixg3rx5zJs3r9SgWzPjxBNPZOjQoZx77rl06NDBw0pF6p4Cg0gUW7ZsKTXoMnQlx8qVK6PeWyIUJkK30A69duzYUXe9jAM7duzg3XffZdGiRSxevJilS5eW6mmqX78+p556KkOHDmXQoEFkZ2d7WK2ItxQYRGrI7/ezbt26cHiIfF27dm2l95aoV68enTt3Dj/QK/KJoV26dKFFixYagFnL/H4/33zzDR9++GF4+t///nfAqag+ffpw2mmnkZOTw0knnaRLIUWCFBhEYqC4uJjvvvsufKfLyNtor169utKeCQjcDbBLly507ty51NSxY0c6duxI27Ztk6aH4o7+i0hLg/EL+h+wbNKARZSUwB2LDlxWmYKCAr766iuWL1/Op59+yrJly1i+fHm5l+J2796d/v37079/f04++WSdahCpQE0DQ3L8l0okRtLT08NP88zJySm1zO/3k5+fz+rVq0tNoSeHbtiwgd27d/P555/z+eefl7v/tLQ02rVrR/v27enQoQPt27enffv2tGvXjrZt24anpk2bxn1PRVoaTHirPwxYVCo0TBqwiAlv9WfiqYvK3a64uLjUc01WrVrFihUrWLFiRfg2zGU1aNCAY489luOPP57jjz+efv360a5du9pvlIiEqYdBJEb27dtHbm5u+BHkodd169bx3XffsX79+kpPd0TKzMykdevWZGdn07p1a1q3bk3Lli3DU4sWLWjevHmpKSsrq85DRmQ4uPG1fvz512/z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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "uplim = max(fun(a,v),fun(b,v))+1 # set limits for the plot window\n", "dnlim = -3\n", "t1 = np.linspace(a,b,100) # Create a discretization to be used with the plots\n", "plt.figure(1)\n", "plt.plot(t1,fun(t1,v),'k') # Plot the function to be optimized on the interval [a,b]\n", "\n", "LinesearchArmijo(fun,der,m1)\n", "plt.title('Armijo')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Wolfe\n", "\n", "
\n", "\n", "Recall the three conditions for the **Wolfe line-search**\n", "\n", "$\\star$ $m_1,m_2 \\in (0,1)$ are chosen constants such that $m_1<0.5$ and $m_2>0.5$.\n", "\n", "(a) $\\frac{q(t)-q(0)}{t} \\leq m_1 q'(0)$ and $q'(t) \\geq m_2 q'(0)$ (then we have a good $t$)\n", "\t\n", "(b) $\\frac{q(t)-q(0)}{t}> m_1q'(0) $ (then $t$ is too big)\n", "\t\n", "(c) $\\frac{q(t)-q(0)}{t}\\leq m_1q'(0)$ and $q'(t) < m_2 q'(0)$ (then $t$ is too small)\n", "
" ] }, { "cell_type": "code", "execution_count": 417, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0\n" ] }, { "data": { "image/png": "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+DXBsSAeAfKBhcBZzrnKiPdcQjAwLCB4lcUrBMeGkFb4+OOP6dOnD08//TSDBg1i8eLFXH311fj9fq677jqvyxMRkRYIn7L4zne+g9/v97iaplnkzZVSUeh0SElJSQm5ubkNllVWVrJ27VoKCwvJysqKvYEkdMopp3D44Yfj9/uZNWsWGRkZ/OIXv+Diiy/muuuu4+WXX6Zv377cf//9nH322TG3MWnSJD777DPee++9Rn9Oqv5+REQ6m5qaGvr160dRURHvvfcep556aof83NLSUvLy8gDyQl0BWiR5e2MkgHOO8ppyT6bWhrRZs2ZRUFDARx99xOTJk5k4cSLjxo3jhBNO4JNPPuHMM8/ksssuo7y8POb7S0pK2G+//eLxaxMRkQR7//33KSoqonfv3nz961/3upxmdalbclfUVjDyWW8uffnw4g/plt6txesfeeSR3HLLLQBMmzaNO++8k4KCAn7wgx8AMGPGDB566CGWL1/OqFGjGrx38eLFvPDCC7z11lvx2wEREUmYVDplAV2s5SGVHHHEEfXP/X4/vXr14vDDD6+f17dv8CrYbdsajLPFihUrOO+887j11ls588wzO6ZYERFps9raWl599VUgee9lEa1LtTxkp2Xz4cWNXgWa8J/dGunp6Q1em1mDeeEhSwOBQP28f//734wePZqrr766vtVCRESS23vvvceOHTvo3bt3h/V1aK8uFR7MrFWnDlLJv/71L0477TSuuOIKfvnLX3pdjoiItNDzzz8PBMd2SEtLjcNyalQpTVqxYgWnnXYa3/zmN7nhhhvYsiU4QKff76d3794eVyciIo2prq7mtddeA+Ciiy7yuJqWU5+HTuDll19m+/btPP300/Tv379+StZbuYqISND8+fMpLi6mf//+nHTSSV6X02JqeUhC77///j7z1q1bt8+88OWfY8eO5bbbbktsUSIiEnfhUxYXXnhhSlxlEaaWBxEREQ9UVFTU38silU5ZgMKDiIiIJ95++212797NkCFD9hmvJ9kpPIiIiHjghRdeAIKnLMKX36cKhQcREZEOtnv3bubOnQvA+PHjPa6m9RQeREREOtibb75JRUUFw4cP5+ijj/a6nFbrEuEhchRG2Uu/FxERb4RPWYwfPz7lTllAJ79UMyMjA5/Px+bNm+nduzcZGRkp+SHFm3OO6upqtm/fjs/nIyMjw+uSRES6jJKSEubNmwek3lUWYZ06PPh8PgoLC/nyyy/ZvHmz1+UknW7dujF48GB8vi7RACUikhReeeUVqqurOfTQQznssMO8LqdNOnV4gGDrw+DBg6mtraWurs7rcpKG3+8nLS1NLTEiIh3smWeeAeCSSy7xuJK26/ThAfbekTL6TpUiIiIdadOmTfzlL38B4OKLL/a4mrZTe7WIiEgHef7553HOcdJJJzFkyBCvy2kzhQcREZEO0hlOWYDCg4iISIf47LPPWLp0KWlpaYwbN87rctpF4UFERKQDhFsdzj77bHr16uVxNe2j8CAiIpJgzjmeffZZIPVPWYDCg4iISMItWbKEtWvXkpOTwznnnON1Oe2m8CAiIpJg4VMW559/Pt26dfO4mvZTeBAREUmgmpoaXnzxRaBznLIAhQcREZGEmj9/Pjt27KBPnz6MHj3a63LiQuFBREQkgZ566ikgeAfNtLTOMbCzwoOIiEiCFBcXM2fOHACuuOIKj6uJH4UHERGRBHnxxRepqqrisMMO4+ijj/a6nLhReBAREUmQ8CmLyy+/vFPdxVjhQUREJAFWr17NokWL8Pl8XHrppV6XE1cKDyIiIgkQbnU488wz6d+/v8fVxFdCw4OZ+c1sppmtNbMKM/vczKZbRNuNBd1uZl+G1nnXzEYksi4REZFECgQCzJ49GwiesuhsEt3ycDMwEbgOODj0+iZgcsQ6NwHXA9cCI4E9wDtmlpXg2kRERBLi73//O+vWrSM3N5exY8d6XU7cJfqC0xOAOc65t0Kv15nZ94DjIdjqAEwFfuGcmxOadzmwFRgLPJ/g+kREROJu1qxZAIwbN47s7GyPq4m/RLc8LAZGm9mBAGZ2JHASMC+0vBDoB7wbfoNzrgT4EPhagmsTERGJu/Lycl566SWgc43tECnRLQ93ArnAf8ysDvAD/+uceya0vF/ocWvU+7ZGLGvAzDKBzIhZPeJXroiISPu89tpr7N69m8LCQk466SSvy0mIRLc8XAhcAlwMHANcAfzYzNoTxaYBJRHTxvYWKSIiEi9PPvkk0PnGdoiU6PDwG+BO59zzzrl/OudmA3cTDAAAW0KPfaPe1zdiWbQ7gLyIaWB8SxYREWmbdevWsWDBAqDznrKAxIeHbkAgal5dxM9dSzAk1N9mzMxyCV51sSTWBp1zVc650vAElMW9ahERkTZ48skncc5x2mmnUVhY6HU5CZPoPg9vAv9rZuuBfwFHAzcAjwM455yZ3QPcYmarCIaJmcBm4PUE1yYiIhI3gUCAJ554AoArr7zS42oSK9HhYTLBMPB7oA/BUPAH4PaIdX4NdAceAfKBhcBZzrnKBNcmIiISNwsWLGD9+vXk5eVx/vnne11OQiU0PDjnygiO4zC1iXUcMCM0iYiIpKTHH38cgEsuuaRTju0QSfe2EBERaaeioiJee+01AL7//e97XE3iKTyIiIi007PPPktVVRVHHnkkxxxzjNflJJzCg4iISDs99thjQLDVobOO7RBJ4UFERKQdli5dyrJly8jIyOCSSy7xupwOofAgIiLSDuFWh7Fjx9KrVy+Pq+kYCg8iIiJtVFFRwTPPBG/X1NnHdoik8CAiItJGL730EsXFxQwZMoTRo0c3/4ZOQuFBRESkjf7whz8A8IMf/AC/3+9xNR1H4UFERKQNVqxYweLFi/H7/UyYMMHrcjqUwoOIiEgbPPLIIwCce+657L///h5X07EUHkRERFqpvLycp556CoBrrrnG42o6nsKDiIhIK7300kuUlJQwdOhQzjjjDK/L6XAKDyIiIq0U2VHS5+t6h9Kut8ciIiLt8M9//pMlS5aQlpbWJW6CFYvCg4iISCuEO0qed9559OvXz+NqvKHwICIi0kLl5eXMnj0bgKuvvtrjaryj8CAiItJCzz33HCUlJRQWFnL66ad7XY5nFB5ERERawDnHgw8+CMDEiRO7ZEfJsK675yIiIq3wwQcfsHTpUrKysrpsR8kwhQcREZEWCLc6jB8/vsvcersxCg8iIiLN2LZtGy+99BIAkyZN8rga7yk8iIiINOOPf/wj1dXVHH/88Rx77LFel+M5hQcREZEm1NbW8vDDDwNqdQhTeBAREWnC3Llz2bBhAwUFBVx44YVel5MUFB5ERESaEO4oeeWVV5KVleVxNclB4UFERKQRK1eu5N1338XMuPbaa70uJ2koPIiIiDQi3OowZswYhg4d6m0xSUThQUREJIaSkhKeeOIJAK6//nqPq0kuCg8iIiIxPP744+zevZtDDz2U0aNHe11OUlF4EBERiVJXV8d9990HwJQpUzAzjytKLgoPIiIiUd544w3WrVtHr169uPTSS70uJ+koPIiIiES55557ALj66qvJzs72uJrko/AgIiISYenSpfzt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VwVUhV/rml4Rka7j5ptvpqqqitNOO41zzz3X63K6rESGhwXA4VHzngD+A/wK2ADUAKOBVwDM7CBgMLAkgXWJiEgKWrhwIS+++CI+n4+7775bXx49lLDw4JwrA1ZEzjOzPcBO59yK0OvHgN+ZWRFQCtwPLHHOfZCoukREJPUEAgGmTp0KwFVXXcURRxzhcUVdW0I7TLbAj4AAwZaHTOAd4IeeViQiIknnySef5OOPPyY3N5eZM2d6XU6X16HhwTl3StTrSmBSaBIREdnHrl276geEmjFjBn369PG4ItG9LUREJKlNnz6dHTt2cMghh3D99dd7XY6g8CAiIkls6dKlPPTQQwA88MADpKene1yRgMKDiIgkqUAgwKRJkwgEAowfP55TTz3V65IkROFBRESS0lNPPcWSJUvIycmpHxhKkoPCg4iIJJ1du3Zx0003AXDrrbcyYMAAjyuSSAoPIiKSdKZPn8727ds5+OCDmTJlitflSBSFBxERSSoffPABv//97wF48MEH1UkyCSk8iIhI0qipqeHqq6/GOccVV1yhTpJJSuFBRESSxu9+9zv++c9/0qtXL3WSTGIKDyIikhTWrFnDz3/+cyAYIgoKCjyuSBqj8CAiIp5zzjFx4kQqKioYPXo0l112mdclSRMUHkRExHPPPfcc8+fPJzMzk4ceeki3205yCg8iIuKpHTt21N9ue/r06YwYMcLjiqQ5Cg8iIuKpyZMns337dg477DB+8pOfeF2OtIDCg4iIeOa1117j+eefx+/388QTT5CRkeF1SdICCg8iIuKJnTt3MnHiRABuuukmjj32WI8rkpZSeBAREU9MnTqVrVu3cvDBBzNjxgyvy5FWUHgQEZEO9+abb/L000/j8/l44oknyMrK8rokaQWFBxER6VC7du3immuuAeDGG29k5MiRHlckraXwICIiHeqHP/whX375JQceeGD9iJKSWhQeRESkwzz33HP1V1fMnj2b7Oxsr0uSNlB4EBGRDrFhwwZ++MMfAsHBoI4//niPK5K2UngQEZGECwQCTJgwgeLiYo4//nh+9rOfeV2StIPCg4iIJNz999/PggULyM7OZvbs2aSnp3tdkrSDwoOIiCTUv/71L26++WYA7rrrLg488ECPK5L2UngQEZGEqaioYPz48VRVVXHWWWdx7bXXel2SxIHCg4iIJMwNN9zAihUr6Nu3L08++aRutd1JKDyIiEhCvPLKKzz88MMAzJ49m759+3pckcSLwoOIiMTdF198wVVXXQXAzTffzBlnnOFxRRJPCg8iIhJXNTU1fO9736O4uJiRI0cyc+ZMr0uSOFN4EBGRuLr11ltZsmQJubm5PPfcc7ossxNSeBARkbh58803ueOOOwB49NFHKSws9LgiSQSFBxERiYs1a9Zw2WWXATB58mQuvPBCjyuSREloeDCzaWb2DzMrM7NtZva6mR0UtU6WmT1oZjvNbLeZvWJm6pIrIpJCKioquOCCCygpKWHUqFH89re/9bokSaBEtzziBK9VAAAgAElEQVR8A3gQGAWcAaQD882se8Q6dwPnAONC6+8PvJrgukREJI4mT57M0qVLKSgo4KWXXiIjI8PrkiSB0hK5cefcWZGvzex/gG3AV4G/mVkecCVwsXPuvdA6E4DPzGyUc+6DRNYnIiLt99hjj/HYY4/h8/l4/vnnGThwoNclSYJ1dJ+HvNBjUejxqwRbI94Nr+Cc+w+wHvharA2YWaaZ5YYnoEcC6xURkSZ89NFHTJo0CYCZM2cyevRojyuSjtBh4cHMfMA9wCLn3IrQ7H5AtXOuOGr1raFlsUwDSiKmjQkoV0REmrF582bGjh1LVVUV5513Hj/96U+9Lkk6SEe2PDwIHAaMb+d27iDYghGe1D4mItLBKisr+c53vsOXX37JoYceyuzZs/H5dAFfV5HQPg9hZvYAMAb4unMusqVgC5BhZvlRrQ99Q8v24ZyrAqoitp2AikVEpDHOOa699lo+/PBDevbsyZw5c+jRQ2eQu5JEX6ppoeBwPnCac25t1CofAzXA6Ij3HAQMBpYksjYREWmbe+65h1mzZuHz+XjxxRcZNmyY1yVJB0t0y8ODwMXAeUCZmYX7MZQ45yqccyVm9hjwOzMrAkqB+4ElutJCRCT5zJs3jx//+McA3HXXXZx++ukeVyReSHR4mBh6fD9q/gTgydDzHwEB4BUgE3gH+GGC6xIRkVb69NNPufDCCwkEAkyYMIEpU6Z4XZJ4xJxzXtfQLqHLNUtKSkrIzc31uhwRkU5p06ZNjBw5kk2bNnHaaacxb948DQTVCZSWlpKXlweQ55wrben71DVWRESaVFZWxpgxY9i0aRMHH3wwr7zyioJDF6fwICIijaqtrWX8+PEsW7aMPn368Pbbb5Ofn+91WeIxhQcREYnJOcekSZN4++23ycrK4s0332To0KFelyVJQOFBRERimjFjBo888ghmxjPPPMPxxx/vdUmSJBQeRERkH/fffz+/+MUvAHjooYf4zne+43FFkkwUHkREpIHnnnuO66+/HoDbb7+da665xuOKJNkoPIiISL358+dzxRVXAHDddddxyy23eFyRJCOFBxERAeBvf/sbY8eOpaamhvHjx3Pvvffq/kESk8KDiIiwZMkSvv3tb1NRUcHZZ59df+8KkVj0L0NEpIv7+OOPOeuss9i9ezejR4/WIFDSLIUHEZEubPny5Zx55pmUlpZy8sknM2fOHLKzs70uS5KcwoOISBe1fPlyTj/9dIqKihg5ciRz586le/fuXpclKUDhQUSkC/rkk0849dRT2b59O8cccwx/+tOfdHNBaTGFBxGRLuajjz5i9OjRFBUVcfzxx7NgwQLdr0JaReFBRKQLWbx4MaeffjrFxcWceOKJ/PnPf1ZwkFZTeBAR6SLee+89zjzzTMrKyjjllFN0qkLaTOFBRKQLePnllzn77LPZs2cPp59+Om+99RY5OTlelyUpSuFBRKSTe/jhh7nwwguprq7mggsuYO7cuXTr1s3rsiSFKTyIiHRSzjlmzpzJxIkTcc5xzTXX8Pzzz5OZmel1aZLiFB5ERDqh2tpaJk2axIwZMwCYPn06Dz30EH6/3+PKpDNI87oAERGJr7KyMi666CLmzZuHmXHPPffU32JbJB4UHkREOpGNGzcyZswYPv30U7Kzs3nmmWc4//zzvS5LOhmFBxGRTmLp0qWMGTOGzZs307dvX958802OO+44r8uSTkh9HkREOoEXXniBE088kc2bN3PooYfy4YcfKjhIwig8iIiksLq6On76058yfvx4Kioq+OY3v8miRYsYMmSI16VJJ6bwICKSonbt2sWYMWP41a9+BcDNN9/MW2+9RV5enseVSWenPg8iIilo2bJljBs3jtWrV5Odnc3jjz/O+PHjvS5Lugi1PIiIpBDnHH/4wx8YNWoUq1evZvDgwSxatEjBQTqUwoOISIooKyvjkksu4dprr6Wqqopvf/vbfPLJJxx99NFelyZdjMKDiEgKWLZsGccddxzPPfccfr+fX/3qV7zxxhv06tXL69KkC1KfBxGRJFZXV8ddd93FLbfcQk1NDQMGDOD555/npJNO8ro0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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def LinesearchWolfe(q,dq,m1,m2): \n", " tl = 0\n", " tr = 0\n", " t = 1\n", " qp = dq(0,v)\n", " q0 = fun(0,v)\n", " xs = np.linspace(a,b)\n", " ys = q0+m1*qp*xs\n", " plt.plot(xs,ys,label=\"m1\")\n", " qt = q(t,v)\n", " plt.plot(t,qt,'.g')\n", " while (1==1):\n", " qt = q(t,v)\n", " plt.plot(t,qt,'xr')\n", " print(tl,\" \",tr)\n", " if ((qt-q0)/t<=(m1*qp)) and dq(t,v)>=m2*qp:\n", " step=t # we found a good step\n", " break\n", " if ((qt-q0)/t>(m1*qp)):\n", " # step too big\n", " tr = t\n", " if ((qt-q0)/t<=(m1*qp)) and dq(t,v)