{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def max_descida_armijo( f, grad, x, step = 1.0, sigma = 0.1, eta = 0.1, epsilon = 1e-6, return_niter = False ):\n", "\n", " g_k = grad( x )\n", "\n", " niter = 0\n", "\n", " while np.linalg.norm( g_k ) > epsilon:\n", "\n", " step_k = step\n", "\n", " f_k = f( x )\n", " ns_g_k = np.linalg.norm( g_k ) ** 2\n", "\n", " x_try = x - step_k * g_k\n", " while f( x_try ) > f_k - sigma * step_k * ns_g_k:\n", " step_k = step_k * eta\n", " x_try = x - step_k * g_k\n", "\n", " x = x_try\n", " g_k = grad( x )\n", "\n", " niter = niter + 1\n", "\n", " if return_niter:\n", " return ( x, niter )\n", " else:\n", " return x" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def rosenbrock( x, a = 100, b = 1 ):\n", "\n", " return a * ( x[ 1 ] - x[ 0 ] ** 2 ) ** 2 + ( x[ 0 ] - b ) ** 2\n", "\n", "def rosenbrock_grad( x, a = 100, b = 1 ):\n", "\n", " return np.array(\n", " (\n", " -400 * ( x[ 1 ] - x[ 0 ] ** 2 ) * x[ 0 ] + 2 * ( x[ 0 ] - 1 ),\n", " 200 * ( x[ 1 ] - x[ 0 ] ** 2 )\n", " )\n", " )" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(array([1., 1.]), 7473)\n" ] } ], "source": [ "print( max_descida_armijo( rosenbrock, rosenbrock_grad, np.zeros( ( 2, ) ), 1e-2, epsilon = 1e-10, return_niter = True ) )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercício\n", "\n", "Instrumente a função acima para retornar o número de avaliações da função objetivo que o algoritmo realiza. Compare esse número com o custo computacional das iterações extra realizadas pelo método com passo fixo. Tire conclusões a respeito da eficiência relativa dentre os dois métodos.\n", "\n", "Lembre-se de alterar o método com passo fixo para utilizar o mesmo critério de parada que o da rotina acima." ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.10.12" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }