{ "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:c00850d6b7569f22545c5651628e574e31bd3957bdd48addb1575dec7ddd8f38" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Tipos comp\u00f3sitos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[1] (i) \u00bfC\u00f3mo representar\u00edas a una part\u00edcula en 1D con posici\u00f3n, velocidad y masa en Julia?\n", "\n", "(ii) \u00bfC\u00f3mo mover\u00edas la part\u00edcula en un paso $\\delta t$?\n", "\n", "(iii) \u00bfSi necesitas otra part\u00edcula con las mismas propiedades, qu\u00e9 har\u00edas?\n", "\n", "(iv) Para $N$ tales part\u00edculas, \u00bfqu\u00e9 podr\u00edas hacer?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El problema aqu\u00ed es que la representaci\u00f3n del concepto \"part\u00edcula\" est\u00e1 repartida en distintas variables. Julia provee una manera de recolectar la informaci\u00f3n de un \"objeto\", al definir un *tipo comp\u00f3sito* (\"composite type\"):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "type MiTipo\n", " a\n", " b::Int\n", "end" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Esto define un tipo de objeto llamado `MiTipo`. Cada objeto de este tipo tendr\u00e1 *adentro* su propia copia de una variable llamada `a` y otra llamada `b`. En este caso, no hemos especificado ning\u00fan tipo para `a`, mientras que `b` est\u00e1 forzado a tener el tipo `Int`. \n", "\n", "[En general, en Julia, para *anotar* a una variable con un tipo dado, usamos esta notaci\u00f3n con `::`.]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[2] Define un tipo que se llama `Particula`, que tiene variables para la posici\u00f3n, velocidad y masa en una dimensi\u00f3n." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[3] Experimenta para ver c\u00f3mo crear un objeto de tipo `Particula`. [Pista: piensa en funciones]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[4] \u00bfC\u00f3mo podemos definir una funci\u00f3n `mover` que mueve la part\u00edcula en un paso de tiempo $\\delta t$? [Pista: Para especificar que un objeto `t` es de tipo `MiTipo`, usamos la sintaxis `t::MiTipo`.]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[5] Define un objeto `Gas` que representa $N$ part\u00edculas, as\u00ed como una funci\u00f3n `mover` que mueve el gas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[6] Considera una estructura compuesta que denotaremos\n", "${\\overline v} = (f_v, d_v)$, que consta de dos campos `f_v` y `d_v`, que son flotantes. Esta estructura est\u00e1 definida de tal manera que se cumplen las siguientes propiedades:\n", "\n", "\\begin{align}\n", "{\\overline c} &= (c,\\,0), &\\textrm{ para toda constante $c$},\\\\\n", "{\\overline x} &= (x_0,\\,1), &\\textrm{para toda variable independiente $x = x_0$},\\\\\n", "c {\\overline v} &= {\\overline c}\\, {\\overline v} = (c f_v,\\, c d_v), \\\\\n", "{\\overline v} \\pm {\\overline w} & = (f_v \\pm f_w,\\, d_v \\pm d_w),\\\\\n", "{\\overline v} \\cdot {\\overline w} & = (f_v \\cdot f_w,\\, f_v \\cdot d_w + d_v \\cdot f_w),\\\\\n", "\\frac{{\\overline v}}{{\\overline w}} & = \n", "\\left( \\frac{f_v}{f_w},\\, \\frac{d_v \\cdot f_w - f_v \\cdot d_w}{f_w^2} \\right),\\\\\n", "{\\overline u}^\\alpha &= (f_u^\\alpha,\\, \\alpha f_u^{\\alpha-1} d_u), &\\textrm{donde $\\alpha$ \n", "es un n\u00famero real}.\n", "\\end{align}\n", "\n", "\n", "i. Implementa esto usando Julia.\n", "\n", "ii. Define un polinomio $p(x)$ cuya variable independiente es $x$. Eval\u00faa el polinomio en ${\\overline x}$ (variable independiente $x$), en $x_0=0$. \u00bfQu\u00e9 interpretaci\u00f3n tiene *el valor* obtenido para $d_x$? Y si en lugar de un polinomio utilizas un cociente de polinomios $r({\\overline x}) = p({\\overline x}) / q({\\overline x})$?\n", "\n", "iii. Pensando en la interpretaci\u00f3n que le diste a $d_x$, c\u00f3mo definir\u00edas la acci\u00f3n sobre ${\\overline x}$ de las siguientes funciones:\n", "- $\\exp(\\,{\\overline x}\\,)$\n", "- $\\log(\\,{\\overline x}\\,)$\n", "- $\\sin(\\,{\\overline x}\\,)$\n", "- $\\cos(\\,{\\overline x}\\,)$\n", "- $\\tan(\\,{\\overline x}\\,)$\n", "\n", "iv. \u00bfC\u00f3mo podemos definir las cosas en Julia de tal manera que ${\\overline v} + c$, y las dem\u00e1s posibles operaciones\n", "entre una variable comp\u00f3sita y un flotante $c$, tengan sentido?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[7] En el resto del curso, trataremos con *aritm\u00e9tica de intervalos*. En este nuevo tipo de aritm\u00e9tica, ocupamos intervalos $[a,b]$ de la recta real, que es el conjunto \n", "\n", "$$[a, b] := \\{x : a \\le x \\le b \\}$$\n", "\n", "(i) Define un tipo composito para representar un intervalo de dos n\u00fameros reales.\n", "\n", "(ii) \u00bfC\u00f3mo podr\u00edamos tener operaciones sensatas sobre los intervalos? La idea b\u00e1sica es que el resultado de la operaci\u00f3n sobre dos intervalos contenga los valores posibles resultantes de operar con los miembros de los dos intervalos respectivos.\n", "\n", "(iii) Implementa estas operaciones, sin tomar en cuenta cuestiones de redondeo.\n", "\n", "(iv) \u00bfC\u00f3mo nos puede ayudar el redondeo? Implem\u00e9ntalo." ] } ], "metadata": {} } ] }