{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Compute root of $f(x)=\\exp(-x)-1$\n",
"\n",
"**Randall Romero Aguilar, PhD**\n",
"\n",
"This demo is based on the original Matlab demo accompanying the Computational Economics and Finance 2001 textbook by Mario Miranda and Paul Fackler.\n",
"\n",
"Original (Matlab) CompEcon file: **demslv01.m**\n",
"\n",
"Running this file requires the Python version of CompEcon. This can be installed with pip by running\n",
"\n",
" !pip install compecon --upgrade\n",
"\n",
"Last updated: 2022-Sept-04 \n",
"
\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## About\n",
"\n",
"Compute root of $f(x)=\\exp(-x)-1$ using Newton and secant methods. Initial value generated randomly. True root is $x=0$."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from compecon import NLP, tic, toc\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Set up the problem"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def f(x):\n",
" fval = np.exp(-x) - 1\n",
" fjac = -np.exp(-x)\n",
" return fval, fjac\n",
"\n",
"problem = NLP(f, all_x=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Randomly generate starting point"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"np.random.RandomState(seed=2022)\n",
"problem.x0 = -10 * np.random.rand(1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Compute root using Newton method"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" x_0 \n",
" \n",
" \n",
" iteration \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" -3.101080e+00 \n",
" \n",
" \n",
" 1 \n",
" -2.146081e+00 \n",
" \n",
" \n",
" 2 \n",
" -1.263022e+00 \n",
" \n",
" \n",
" 3 \n",
" -5.458203e-01 \n",
" \n",
" \n",
" 4 \n",
" -1.251866e-01 \n",
" \n",
" \n",
" 5 \n",
" -7.518848e-03 \n",
" \n",
" \n",
" 6 \n",
" -2.819583e-05 \n",
" \n",
" \n",
" 7 \n",
" -3.974987e-10 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x_0\n",
"iteration \n",
"0 -3.101080e+00\n",
"1 -2.146081e+00\n",
"2 -1.263022e+00\n",
"3 -5.458203e-01\n",
"4 -1.251866e-01\n",
"5 -7.518848e-03\n",
"6 -2.819583e-05\n",
"7 -3.974987e-10"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t0 = tic()\n",
"x1 = problem.newton()\n",
"t1 = 100 * toc(t0)\n",
"n1, x_newton = problem.fnorm, problem.x_sequence\n",
"x_newton"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Compute root using Broyden method"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" x_0 \n",
" \n",
" \n",
" iteration \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" -3.101080e+00 \n",
" \n",
" \n",
" 1 \n",
" -2.146081e+00 \n",
" \n",
" \n",
" 2 \n",
" -1.618567e+00 \n",
" \n",
" \n",
" 3 \n",
" -1.009726e+00 \n",
" \n",
" \n",
" 4 \n",
" -5.480429e-01 \n",
" \n",
" \n",
" 5 \n",
" -2.160518e-01 \n",
" \n",
" \n",
" 6 \n",
" -5.221796e-02 \n",
" \n",
" \n",
" 7 \n",
" -5.393952e-03 \n",
" \n",
" \n",
" 8 \n",
" -1.394817e-04 \n",
" \n",
" \n",
" 9 \n",
" -3.758318e-07 \n",
" \n",
" \n",
" 10 \n",
" -2.621013e-11 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" x_0\n",
"iteration \n",
"0 -3.101080e+00\n",
"1 -2.146081e+00\n",
"2 -1.618567e+00\n",
"3 -1.009726e+00\n",
"4 -5.480429e-01\n",
"5 -2.160518e-01\n",
"6 -5.221796e-02\n",
"7 -5.393952e-03\n",
"8 -1.394817e-04\n",
"9 -3.758318e-07\n",
"10 -2.621013e-11"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t0 = tic()\n",
"x2 = problem.broyden()\n",
"t2 = 100 * toc(t0)\n",
"n2, x_broyden = problem.fnorm, problem.x_sequence\n",
"x_broyden"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Print results"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hundredths of seconds required to compute root of exp(-x)-1,\n",
"via Newton and Broyden methods, starting at x = -3.10.\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Time \n",
" Norm of f \n",
" Final x \n",
" \n",
" \n",
" \n",
" \n",
" Newton \n",
" 0.199866 \n",
" 3.974987e-10 \n",
" -3.974987e-10 \n",
" \n",
" \n",
" Broyden \n",
" 0.899768 \n",
" 2.621015e-11 \n",
" -2.621013e-11 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Time Norm of f Final x\n",
"Newton 0.199866 3.974987e-10 -3.974987e-10\n",
"Broyden 0.899768 2.621015e-11 -2.621013e-11"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print('Hundredths of seconds required to compute root of exp(-x)-1,')\n",
"print('via Newton and Broyden methods, starting at x = %4.2f.' % problem.x0)\n",
"\n",
"pd.DataFrame({\n",
" 'Time': [t1, t2],\n",
" 'Norm of f': [n1, n2],\n",
" 'Final x': [x1, x2]},\n",
" index=['Newton', 'Broyden']\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### View current options for solver"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Options for solving a NLP:\n",
"\n",
"\t all_x = True\n",
"\t initb = None\n",
"\t initi = False\n",
"\t maxit = 100\n",
"\t maxsteps = 10\n",
"\t method = broyden\n",
"\t show = False\n",
"\t squeeze = True\n",
"\t tol = 1.4901161193847656e-08\n",
"\ttransform = ssmooth\n",
"\n"
]
}
],
"source": [
"print(problem.opts)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Describe the options"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" A container for options to find a zero for a NLP or MCP\n",
"\n",
" Attributes: default in brackets\n",
" method: either ['newton'] or 'broyden'\n",
" maxit: maximum number of iterations [100]\n",
" maxsteps: maximum number of backsteps [10]\n",
" tol: convergence tolerance [sqrt(machine eps)]\n",
" initb: an initial inverse Jacobian aprroximation matrix [None]\n",
" initi: if True, use the identity matrix to initialize Jacobian,\n",
" if [False], a numerical Jacobian will be used\n",
" transform: either ['ssmooth'] or 'minmax', required for MC problems\n",
" show: print to screen if [True], quiet if False\n",
" all_x: whether to output the full solution sequence too [False]\n",
" squeeze: if problem has ony one dimension, return solution as scalar [True]\n",
" \n"
]
}
],
"source": [
"print(problem.opts.__doc__)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plot the convergence"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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vPKKHn/8cR08eFB+v18zZ87U1VdfrS9/+cvKz89PdHlIsHfffVe//e1vtW/fPjU3NystLU2LFi3Spz/9af3pn/6pDMNIdIlIEo7j6Pbbb9fu3bt18OBBuVz8VzBZdHV16dFHH9VLL72kqqoqpaena9myZbrjjju0cePGRJeHJPTEE0/oO9/5jr773e/qs5/9bKLLQYLV1NToscce09atW1VdXS1Jmj17du/vo7m5uQmuEIlUXl6un//853rvvfdUX1+vqVOnauXKlfr85z+v9evXJ7q8hDAcx3ESXQQu7B/+4R/01FNPSZKmTZumvLw8VVRUqLOzU1OmTNEjjzyitWvXJrhKJMr3v/99PfbYY5KktLQ0FRUVqba2Vo2NjZKkTZs26d/+7d/kdrsTWSaSxA9/+EP94he/kCTC9iTS2dmpO++8U3v37pXb7daCBQvU3Nzc+wvzvffeq2984xsJrhLJZN++fbrzzjvV0dFB2IZ27typu+++W62trbIsS4WFhbJtW1VVVQqFQpo2bZoeffRRLV68ONGlIgG2bt2qb3zjG+ru7lZqaqqKiorU2Nios2fPSpK+/OUv62/+5m8SXGX8sYx8HHjyySf11FNPyeVy6Qc/+IHeffddPfvss9q6datuvPFGtba26t5771VXV1eiS0UCPP/883rsscdkWZb+7u/+Th999JGeffZZvf/++/rxj3+s9PR0vfnmm/q3f/u3RJeKBAuFQvr+97/fG7QxuTz44IPau3evlixZoj/+8Y965pln9NZbb+n73/++XC6XHnroIb333nuJLhNJYvv27brrrrvU0dGR6FKQBHp+12xtbdWGDRv09ttv65VXXtFrr72mV199VWvWrFFdXZ3uuece+Xy+RJeLOGtsbNT999+v7u5uffKTn9TWrVv13HPPaevWrfrhD38oy7L02GOP6dVXX010qXFH2B4HfvnLX0qSvvKVr+hP//RPex/PyMjQP//zP2vq1KlqaGjQH//4x0SViATqeX187nOf05133inTjHxb33DDDfq7v/s7SdJ//Md/yO/3J6RGJF55ebnuvPPO3hUQmFwqKyv1/PPPyzRN/fCHP9TMmTN7j91666266667JEkPPfRQokpEkvD5fHrooYf0pS99SS0tLYkuB0ni6aefVmNjo6ZPn64f/ehHmj59eu+xOXPm6Kc//ammTp2q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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"b = -abs(problem.x0)\n",
"a = -b\n",
"xx = np.linspace(a, b, 100)\n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.hlines(0, a, b, 'gray')\n",
"ax.plot(xx, f(xx)[0], 'b-', alpha=0.4)\n",
"ax.plot(x_newton,f(x_newton)[0],'ro:', alpha=0.4);"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.9.7 ('base')",
"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.9.7"
},
"vscode": {
"interpreter": {
"hash": "ad2bdc8ecc057115af97d19610ffacc2b4e99fae6737bb82f5d7fb13d2f2c186"
}
}
},
"nbformat": 4,
"nbformat_minor": 1
}