{ "metadata": { "kernelspec": { "display_name": "Julia 0.3.7-pre", "language": "julia", "name": "julia 0.3" }, "language": "Julia", "language_info": { "name": "julia", "version": "0.3.7" }, "name": "", "signature": "sha256:9360144e6ac94a16a235f3a861e380329f41969150a9c64bc3f015f616826319" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Redondeo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\newcommand{\\RR}{\\mathbb{R}}$\n", "$\\newcommand{\\FF}{\\mathbb{F}}$\n", "\n", "Tenemos una representaci\u00f3n del conjunto no-numerable $\\RR$ a trav\u00e9s del conjunto finito $\\FF$. \u00bfC\u00f3mo podemos pasar de un n\u00famero real a un n\u00famero flotante, si el n\u00famero real no es exactamente representable (lo cual es el caso para \u00a1*casi todos* los n\u00fameros reales!)? Extenderemos para este fin los n\u00fameros reales y los flotantes con $\\pm \\infty$, y hablaremos de los reales extendidos $\\RR^* := \\RR \\cup \\{-\\infty, +\\infty \\}$ y $\\FF^* := \\FF \\cup \\{-\\infty, +\\infty \\}$.\n", "\n", "Un mapeo $\\bigcirc: \\RR^* \\to \\FF^*$ es una *operaci\u00f3n de redondeo* si \n", "\n", "- Para toda $x \\in \\FF^*$, $\\bigcirc(x) = x$.\n", "- Si $x, y \\in \\RR^*$, y $x \\le y$, entonces $\\bigcirc(x) \\le \\bigcirc(y)$.\n", "\n", "Es decir, el redondeo deja invariantes los n\u00fameros representables en el sistema de punto flotante, y preserva el orden." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utilizaremos dos modos de redondeo: $\\bigtriangleup$, que redondea para arriba (hacia $+\\infty$), y $\\bigtriangledown$, que redondea para abajo (hacia $-\\infty$). Se definen como sigue:\n", "\n", "- $\\bigtriangleup \\! (x) := \\min \\{y \\in \\FF^*: y \\ge x \\}$\n", "- $\\bigtriangledown(x) := \\max \\{y \\in \\FF^*: y \\le x \\}$\n", "\n", "Hablamos de $x$ redondeado para arriba y $x$ redondeado para abajo, respectivamente; estos dos modos de redondeo se llaman modos de redondeo *dirigidos*.\n", "\n", "Nota que no es evidente c\u00f3mo implementar estas operaciones en la computadora, ya que \u00a1*no podemos representar los n\u00fameros reales originales*!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[1] (i) Si tuvi\u00e9ramos un n\u00famero real positivo $x$ (es decir, con precisi\u00f3n infinita), \u00bfc\u00f3mo podr\u00edamos encontrar $\\bigtriangleup(x)$ y $\\bigtriangledown(x)$?\n", "\n", "(ii) Encuentra $\\bigtriangleup(0.1)$ y $\\bigtriangledown(0.1)$ para aritm\u00e9tica flotante de IEEE. \u00bfEn cu\u00e1nto difieren? \u00bfQu\u00e9 podemos decir sobre el *error de redondeo*?\n", "\n", "[2] Haz de nuevo el ejercicio anterior para $x=1.1$ y para $x=10.1$.\n", "\n", "[3] \u00bfQu\u00e9 pasa con $\\bigtriangleup(x)$ y $\\bigtriangledown(x)$ si $x \\in \\FF^*$?\n", "\n", "[4] \u00bfCu\u00e1l es la relaci\u00f3n entre $\\bigtriangleup(-x)$ y $\\bigtriangledown(x)$?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Existen otros modos de redondeo adem\u00e1s de los redondeos arriba mencionados:\n", "\n", "- Redondeo a cero (truncamiento): $\\square_z(x) = {\\rm sign}(x) \\max\\{y \\in \\FF^*: y\\leq |x| \\}$\n", "\n", "- Redondeo al m\u00e1s cercano (*round to nearest*): como su nombre lo indica, se redondea al n\u00famero de punto flotante m\u00e1s cercano, usando $\\bigtriangleup(x)$ o $\\bigtriangledown(x)$ seg\u00fan sea el caso. Definiendo $\\mu = (\\bigtriangleup(x) + \\bigtriangledown(x))/2$, entonces:\n", "\n", "\\begin{equation}\n", "\\square_n(x) = \\left\\{\n", "\\begin{array}{1 1}\n", "\\bigtriangledown(x), &x\\in[\\bigtriangledown(x),\\mu)\\\\\n", "\\bigtriangleup(x), &x\\in[\\mu,\\bigtriangleup(x)].\\\\\n", "\\end{array}\n", "\\right.\n", "\\end{equation}\n", "\n", "- Redondeo al m\u00e1s cercano *parejo* (*round to nearest even*): es parecido al modo anterior *logrando* que el redondeo hacia arriba y hacia abajo ocurran con la misma probabilidad. (La sutileza en la definici\u00f3n de $\\square_n(x)$ est\u00e1 en que la definici\u00f3n involucra un intervalo cerrado y uno semicerrado.) Este redondeo involucra en la definici\u00f3n la paridad del \u00faltimo d\u00edgito de la representaci\u00f3n de punto flotante de $\\bigtriangleup(x)$ y $\\bigtriangledown(x)$. Este modo de redondeo es el modo m\u00e1s com\u00fan." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Aritm\u00e9tica de punto flotante" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00bfC\u00f3mo podemos hacer aritm\u00e9tica en el mundo de punto flotante?\n", "\n", "[5] Encuentra unos ejemplos de pares de n\u00fameros $x , y \\in \\FF$ tal que $x \\oplus y \\notin \\FF$. (Aqu\u00ed, $\\FF$ denota a los flotantes de doble precisi\u00f3n de IEEE, y $\\oplus$ es alguna operaci\u00f3n aritm\u00e9tica entre $x$ y $y$.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[6] \u00bfQu\u00e9 podemos hacer al respecto?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[7] En los reales tenemos que, si se cumple $x+y = x+y'$, entonces $y = y'$. \u00bfSe cumple esto entre los n\u00fameros de punto flotante? Si tu respuesta es **no**, da un ejemplo." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[8] Analiza el caso de iterar el mapeo $f:[0,1] \\to [0,1]$ dado por $f(x) = 3x \\mathrm{\\ mod\\ } 1$, con la condici\u00f3n inicial $x_0 = \\frac{1}{10}$:\n", "\n", "1. \u00bfQu\u00e9 pasa anal\u00edticamente?\n", "2. \u00bfQu\u00e9 pasa num\u00e9ricamente?\n", "3. \u00bfQu\u00e9 pasa si consideras una condici\u00f3n inicial $x_0$ arbitraria?\n", "\n", "[Nota: $\\mathrm{mod\\ } 1$ quiere decir que s\u00f3lo consideramos la parte fraccionaria entre $0$ y $1$ de la respuesta en cada paso.]" ] }, { "cell_type": "heading", "level": 2, "metadata": { "collapsed": false }, "source": [ "Aplicando redondeo para obtener resultados garantizados" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ya estamos en condiciones para empezar a hacer c\u00e1lculos \u00fatiles.\n", "\n", "Siguiendo al libro de Tucker, consideremos la suma infinita\n", "\n", "$$S = \\sum_{n=1}^\\infty \\frac{1}{n^2}.$$\n", "\n", "Se sabe que $S = \\frac{\\pi^2}{6}$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[9] Calcula $S$ num\u00e9ricamente de manera ingenua. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para calcular $S$ de forma num\u00e9rica pero *garantizada*, tenemos dos tareas: debemos lidiar con la suma infinita, y luego garantizar que el resultado realmente contenga el valor verdadero." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[10] Sea la cola de la suma $T_N := \\sum_{n=N+1}^\\infty \\frac{1}{n^2}$. Utiliza un argumento geom\u00e9trico para mostrar que\n", "\n", "$$\\int_{N+1}^\\infty \\frac{1}{x^2} dx < T_N < \\int_{N+1}^\\infty \\frac{1}{(x-1)^2} dx,$$\n", "\n", "y as\u00ed encuentra cotas para $T_N$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[11] Usa redondeo para abajo y arriba para calcular cotas para la parte inicial $S_N := \\sum_{n=1}^N n^{-2}$.\n", "\n", "[Para cambiar el modo del redondeo en Julia, usamos\n", "\n", " set_rounding(Float64, RoundUp)\n", " \n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[12] Utiliza tus dos \u00faltimos resultados para dar cotas *rigurosas* (es decir, garantizadas) para $S$.\n", "\n", "Verifica que el valor verdadero s\u00ed est\u00e9 contenido adentro de tus cotas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[13] Repite el c\u00e1lculo con `BigFloat` para obtener m\u00e1s precisi\u00f3n.\n", "\n", "[En Julia, para cambiar la precisi\u00f3n de los `BigFloat`, usamos\n", "\n", " set_bigfloat_precision(100).\n", " \n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[14] \u00bfCambia en algo las cotas que obtuviste arriba, si haces las sumas invirtiendo el orden de los sumandos? (Por ejemplo, sumando desde $n=N$ hasta $n=1$ en lugar de $n=1$ hasta $n=N$.) Si s\u00ed hay alg\u00fan cambio, \u00bfcu\u00e1l de las maneras de hacer la suma es mejor, y por qu\u00e9?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[15] Aproxima num\u00e9ricamente la suma:\n", "\\begin{equation}\n", "S = \\sum_{n=1}^\\infty \\frac{1}{n}.\n", "\\end{equation}" ] } ], "metadata": {} } ] }