{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Tipos compósitos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Modelar una partícula:\n", "\n", "Yo estaba esperando" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 1\n", "v = 2\n", "m = 0.5" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.25" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt = 0.125\n", "x += v*dt" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x2 = 2\n", "v2 = 10" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = 10 # numero de particulas" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = zeros(N)\n", "v = ones(N);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Muchos hicieron" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3-element Array{Float64,1}:\n", " 1.0\n", " 2.0\n", " 0.5" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "particula = [1, 2, 0.5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La posición es" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "particula[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para actualizar su posición:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.5" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "particula[1] += dt*particula[2]\n", "# equivalente a particula[1] = particula[1] + dt*particula[2]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "¡Es illegible! Queremos nombres que *reflejen* la función de cada variable: `x` y `v`, o `pos`y `vel`, o `posicion` y `velocidad`\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Tipos compósitos " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Es la solución: combinación de variables con nombres, adentro de una sola estructura." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "type Particula\n", " x\n", " v\n", " m\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aquí estamos definiendo un nuevo *tipo* de datos, que se llama `Particula`, y especificamos las características / propiedades internas de lo que es una `Particula` -- la estructura de una `Particula`.\n", "\n", "Define una *plantilla* de una cajita que contiene espacio para estas tres variables (`x`, `v` y `m`)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "¡Todavía no hay ninguna partícula! Para crear un objeto de este tipo (`Particula`): Utilizo `Particula` como si fuera una función:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula(1.0,2.0,0.5)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = Particula(1., 2., 0.5)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula(1.0,2.0,0.5)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.x" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2.0" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.v" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p.m" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula (constructor with 1 method)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "typeof(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Funciones que actúan sobre objetos de este tipo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quiero definir una función `mover` que acepte un objeto de tipo `Particula`:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "mover (generic function with 1 method)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function mover(p, dt)\n", " p.x + p.v*dt\n", "end" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula(1.0,2.0,0.5)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.2" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mover(p, 0.1)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula(1.0,2.0,0.5)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "¡No se movió! Sólo se calculó la posición nueva.\n", "Para mover realmente el objeto, tenemos que cambiar sus propiedades internas:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "mover! (generic function with 1 method)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function mover!(p, dt) \n", " # ! es una convención en Julia que dice que la función\n", " # *modifica* su argumento -- tiene un *efecto secundario* (side effect)\n", " p.x += p.v*dt\n", "end" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3.0" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mover!(p, 1)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula(3.0,2.0,0.5)" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No llamé a la función `mover_particula`" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "ename": "LoadError", "evalue": "type Int64 has no field x\nwhile loading In[27], in expression starting on line 1", "output_type": "error", "traceback": [ "type Int64 has no field x\nwhile loading In[27], in expression starting on line 1", "", " in mover! at In[24]:4" ] } ], "source": [ "mover!(1, 0.1)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": true }, "outputs": [], "source": [ "workspace() # borra todo lo que está definido" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [], "source": [ "type Prueba\n", " x\n", " v\n", " David\n", "end" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "ename": "LoadError", "evalue": "Particula not defined\nwhile loading In[32], in expression starting on line 1", "output_type": "error", "traceback": [ "Particula not defined\nwhile loading In[32], in expression starting on line 1", "" ] } ], "source": [ "p = Particula(1,2,3) # borré la definición" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "mover! (generic function with 1 method)" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function mover!(p, dt) \n", " # ! es una convención en Julia que dice que la función\n", " # *modifica* su argumento -- tiene un *efecto secundario* (side effect)\n", " p.x += p.v*dt\n", "end" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Prueba(1,2,3)" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = Prueba(1, 2, 3)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.2" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mover!(d, 0.1)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Prueba(1.2,2,3)" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mi función como tal mueve *cualquier cosa* que tenga un `x` y `v` adentro. Si no quiero esto:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": true }, "outputs": [], "source": [ "type Particula\n", " x::Float64 # sólo puede ser de tipo Float64 \n", " v\n", " m\n", "end" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "mover! (generic function with 2 methods)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function mover!(p::Particula, dt) \n", " # sólo actúa sobre objetos de tipo Particula\n", " p.x += p.v*dt\n", "end" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula(1.0,2,0.5)" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = Particula(1, 2, 0.5)\n" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.2" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mover!(p, 0.1)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula(1.2,2,0.5)" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "2 methods for generic function mover!:" ], "text/plain": [ "# 2 methods for generic function \"mover!\":\n", "mover!(p::Particula,dt) at In[43]:3\n", "mover!(p,dt) at In[34]:4" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "methods(mover!)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "mover! (generic function with 2 methods)" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mover!(p, dt) = println(\"¡HOLA!\")" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula(1.2,2,0.5)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.4" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mover!(p, 0.1)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Particula(1.4,2,0.5)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "¡HOLA!\n" ] } ], "source": [ "mover!(d, 0.1)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "mover! (generic function with 3 methods)" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mover!(i::Int) = println(i)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "3 methods for generic function mover!:" ], "text/plain": [ "# 3 methods for generic function \"mover!\":\n", "mover!(p::Particula,dt) at In[43]:3\n", "mover!(i::Int64) at In[54]:1\n", "mover!(p,dt) at In[49]:1" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "methods(mover!)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "mover!(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Un Gas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Un gas consiste en muchas partículas." ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": true }, "outputs": [], "source": [ "workspace()" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": true }, "outputs": [], "source": [ "type Particula\n", " x\n", " v\n", " m\n", "end" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": true }, "outputs": [], "source": [ "type Gas_Malo\n", " x::Vector{Float64}\n", " v::Vector{Float64}\n", " m::Vector{Float64}\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Esto es una mala idea, ya que no vemos que un `Gas` consiste en un montón de `Partículas`." ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": true }, "outputs": [], "source": [ "type Gas\n", " N::Int\n", " particulas::Vector{Particula}\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Julia automáticamente (por defecto) crea una función *constructora* (o un *constructor*): una función con el mismo nombre que el tipo, que toma los datos y crea un objeto nuevo de este tipo, con los datos adentro." ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Gas(2,[Particula(1,2,3),Particula(4,5,6)])" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g = Gas(2, [Particula(1,2,3), Particula(4, 5, 6)] )" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.N" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2-element Array{Particula,1}:\n", " Particula(1,2,3)\n", " Particula(4,5,6)" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g.particulas" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Gas(5,[Particula(1,2,3),Particula(4,5,6)])" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g2 = Gas(5, [Particula(1,2,3), Particula(4, 5, 6)] )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aquí estamos violando un *invariante*: queremos que el número `N` siempre sea igual al número de partículas en la lista: yo creo un *nuevo constructor* (que utiliza el constructor que ya había):" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Gas (constructor with 3 methods)" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function Gas(particulas::Vector{Particula})\n", " Gas(length(particulas), particulas)\n", "end" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "3 methods for generic function Gas:" ], "text/plain": [ "# 3 methods for generic function \"Gas\":\n", "Gas(N::Int64,particulas::Array{Particula,1})\n", "Gas(particulas::Array{Particula,1}) at In[71]:2\n", "Gas(N,particulas)" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "methods(Gas)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Gas(2,[Particula(1,2,3),Particula(4,5,6)])" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g2 = Gas([Particula(1,2,3), Particula(4, 5, 6)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si quiero hacer una lista vacía de partículas e irla ampliando:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0-element Array{Particula,1}" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "particulas = Particula[]" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0-element Array{None,1}" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "l = []" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NB: En Julia 0.4, `l=[]` hace un arreglo de `Any`, ya no de `None`." ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2-element Array{Int64,1}:\n", " 3\n", " 4" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[3,4]" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2-element Array{Int64,1}:\n", " 3\n", " 4" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v = Int[3,4]" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3-element Array{Int64,1}:\n", " 3\n", " 4\n", " 7" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "push!(v, 7)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false }, "outputs": [ { "ename": "LoadError", "evalue": "`convert` has no method matching convert(::Type{Int64}, ::ASCIIString)\nwhile loading In[85], in expression starting on line 1", "output_type": "error", "traceback": [ "`convert` has no method matching convert(::Type{Int64}, ::ASCIIString)\nwhile loading In[85], in expression starting on line 1", "", " in push! at array.jl:460" ] } ], "source": [ "push!(v, \"David\")" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2-element Array{Float64,1}:\n", " 3.0\n", " 4.0" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Float64[3,4]" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "ename": "LoadError", "evalue": "`convert` has no method matching convert(::Type{String}, ::Int64)\nwhile loading In[79], in expression starting on line 1", "output_type": "error", "traceback": [ "`convert` has no method matching convert(::Type{String}, ::Int64)\nwhile loading In[79], in expression starting on line 1", "", " in getindex at array.jl:121" ] } ], "source": [ "String[3,4]" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2-element Array{Any,1}:\n", " 3\n", " 4" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = Any[3,4]" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3-element Array{Any,1}:\n", " 3 \n", " 4 \n", " \"David\"" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "push!(w, \"David\")" ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0-element Array{Particula,1}" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "particulas = Particula[]" ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1-element Array{Particula,1}:\n", " Particula(1,2,3)" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "push!(particulas, Particula(1, 2, 3))" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [ { "ename": "LoadError", "evalue": "mover! not defined\nwhile loading In[88], in expression starting on line 1", "output_type": "error", "traceback": [ "mover! not defined\nwhile loading In[88], in expression starting on line 1", "" ] } ], "source": [ "methods(mover!)" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "mover! (generic function with 1 method)" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "function mover!(g::Gas)\n", " # algo\n", "end" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ¡Tarea! " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Haz un gas ideal:\n", "\n", "- Partículas en 2D (`x` y `v` que son vectores con 2 entradas)\n", "- Hacer una función que genere al azar una partícula\n", "- Hacer una función que agregue una partícula al `Gas` (cuidar que el número de partículas se actualice)\n", "- Hacer una función que genere un gas\n", "- Mover el gas: actualizar todas las partículas y hacer algo en las fronteras (de preferencia, colisiones elásticas con vectores)\n", "- [Para empezar: colisiones inelásticas: si se sale, se queda donde está; y/o condiciones periódicas: si se sale, se regresa del otro lado]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Pregunta 6 del notebook 6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Objetos que representan pares $(u(x_0), u'(x_0))$ para una función $u: \\mathbb{R} \\to \\mathbb{R}$" ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "collapsed": true }, "outputs": [], "source": [ "workspace()" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": true }, "outputs": [], "source": [ "type ValorDeriv\n", " val\n", " der\n", "end\n", " " ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "ValorDeriv(3,4)" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = ValorDeriv(1, 2)\n", "b = ValorDeriv(3, 4)" ] }, { "cell_type": "code", "execution_count": 119, "metadata": { "collapsed": false }, "outputs": [ { "ename": "LoadError", "evalue": "`+` has no method matching +(::ValorDeriv, ::ValorDeriv)\nwhile loading In[119], in expression starting on line 1", "output_type": "error", "traceback": [ "`+` has no method matching +(::ValorDeriv, ::ValorDeriv)\nwhile loading In[119], in expression starting on line 1", "" ] } ], "source": [ "a + b" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "+ (generic function with 120 methods)" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "+(a::ValorDeriv, b::ValorDeriv) = ValorDeriv(a.val+b.val, a.der+b.der)" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "ValorDeriv(4,6)" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a + b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`a` y `b` representan funciones $a(x)$ y $b(x)$ en algún lugar $x_0$ (implícito -- no viene representado explícitamente): `a` representa\n", "\n", "$\\bar{a} = (a(x_0), a'(x_0))$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`a + b` representa $((a+b)(x_0), (a+b)'(x_0))$" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "* (generic function with 118 methods)" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "*(z::Number, a::ValorDeriv) = ValorDeriv(z*a.val, z*a.der)" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "* (generic function with 119 methods)" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "*(a::ValorDeriv, b::ValorDeriv) = \n", "ValorDeriv(a.val*b.val, a.val*b.der + a.der*b.val)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El lugar en el cual evalúo las funciones queda codificado en `x`:" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "ValorDeriv(2,1)" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = ValorDeriv(2, 1) # el lugar es el x_0=2" ] }, { "cell_type": "code", "execution_count": 125, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "p (generic function with 1 method)" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p(x) = x*x + 2*x" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p(1)" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "5.25" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p(1.5)" ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "ValorDeriv(8,6)" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Este resultado contiene $(p(x_0), p'(x_0))$ --es decir, ¡¡se calculó *automáticamente* la derivada!!" ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import Base.sin" ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "sin (generic function with 12 methods)" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sin(a::ValorDeriv) = ValorDeriv(sin(a.val), cos(a.val)*a.der)" ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "f (generic function with 1 method)" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(x) = sin(x)" ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "ValorDeriv(0.9092974268256817,0.4161468365471424)" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(x)" ] }, { "cell_type": "code", "execution_count": 137, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "g (generic function with 1 method)" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g(x) = sin(x*x + 3x)" ] }, { "cell_type": "code", "execution_count": 138, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "ValorDeriv(-0.5440211108893698,-5.873500703535167)" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g(x)" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.7568024953079282" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sin(2*2)" ] }, { "cell_type": "code", "execution_count": 134, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-2.6145744834544478" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cos(2*2) * 2*2" ] }, { "cell_type": "code", "execution_count": 139, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "h (generic function with 1 method)" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h(x) = sin(sin(x*x + 3x))" ] }, { "cell_type": "code", "execution_count": 140, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "ValorDeriv(-0.5175807674647733,-5.025568985012155)" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h(x)" ] }, { "cell_type": "code", "execution_count": 142, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import Base.show" ] }, { "cell_type": "code", "execution_count": 145, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "show (generic function with 92 methods)" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show(io::IO, a::ValorDeriv) = print(io::IO, \"Función con valor $(a.val) y \n", "derivada $(a.der)\") " ] }, { "cell_type": "code", "execution_count": 146, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Función con valor -0.5175807674647733 y \n", "derivada -5.025568985012155" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h(x)" ] }, { "cell_type": "code", "execution_count": 147, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "show (generic function with 92 methods)" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show(io::IO, a::ValorDeriv) = print(io::IO, \"[$(a.val), $(a.der)]\") " ] }, { "cell_type": "code", "execution_count": 148, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[-0.5175807674647733, -5.025568985012155]" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h(x)" ] }, { "cell_type": "code", "execution_count": 150, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "\"-0.51758\"" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = h(x)\n", "@sprintf \"%.5f\" z.val" ] }, { "cell_type": "code", "execution_count": 151, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "show (generic function with 92 methods)" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "show(io::IO, a::ValorDeriv) = print(io::IO, \"[$(@sprintf \"%.5f\" a.val), $(a.der)]\") " ] }, { "cell_type": "code", "execution_count": 152, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[-0.51758, -5.025568985012155]" ] }, "execution_count": 152, "metadata": {}, "output_type": "execute_result" } ], "source": [ "h(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\"0.1\"" ] } ], "metadata": { "kernelspec": { "display_name": "Julia 0.3.7-pre", "language": "julia", "name": "julia 0.3" }, "language_info": { "name": "julia", "version": "0.3.7" } }, "nbformat": 4, "nbformat_minor": 0 }