# Tipos compósitos

[1] (i) ¿Cómo representarías a una partícula en 1D con posición, velocidad y masa en Julia?

(ii) ¿Cómo moverías la partícula en un paso $\delta t$?

(iii) ¿Si necesitas otra partícula con las mismas propiedades, qué harías?

(iv) Para $N$ tales partículas, ¿qué podrías hacer?


El problema aquí es que la representación del concepto "partícula" está repartida en distintas variables. Julia provee una manera de recolectar la información de un "objeto", al definir un *tipo compósito* ("composite type"):


```julia
type MiTipo
    a
    b::Int
end
```

Esto define un tipo de objeto llamado `MiTipo`. Cada objeto de este tipo tendrá *adentro* su propia copia de una variable llamada `a` y otra llamada `b`. En este caso, no hemos especificado ningún tipo para `a`, mientras que `b` está forzado a tener el tipo `Int`. 

[En general, en Julia, para *anotar* a una variable con un tipo dado, usamos esta notación con `::`.]

[2] Define un tipo que se llama `Particula`, que tiene variables para la posición, velocidad y masa en una dimensión.

[3] Experimenta para ver cómo crear un objeto de tipo `Particula`.  [Pista: piensa en funciones]

[4] ¿Cómo podemos definir una función `mover` que mueve la partícula en un paso de tiempo $\delta t$? [Pista: Para especificar que un objeto `t` es de tipo `MiTipo`, usamos la sintaxis `t::MiTipo`.]

[5] Define un objeto `Gas` que representa $N$ partículas, así como una función `mover` que mueve el gas.

[6] Considera una estructura compuesta que denotaremos
${\overline v} = (f_v, d_v)$, que consta de dos campos `f_v` y `d_v`, que son flotantes. Esta estructura está definida de tal manera que se cumplen las siguientes propiedades:

\begin{align}
{\overline c} &= (c,\,0), &\textrm{ para toda constante $c$},\\
{\overline x} &= (x_0,\,1), &\textrm{para toda variable independiente $x = x_0$},\\
c {\overline v} &= {\overline c}\, {\overline v} = (c f_v,\, c d_v), \\
{\overline v} \pm {\overline w} & =  (f_v \pm f_w,\, d_v \pm d_w),\\
{\overline v} \cdot {\overline w} & =  (f_v \cdot f_w,\, f_v \cdot d_w + d_v \cdot f_w),\\
\frac{{\overline v}}{{\overline w}} & =  
\left( \frac{f_v}{f_w},\, \frac{d_v \cdot f_w - f_v \cdot d_w}{f_w^2} \right),\\
{\overline u}^\alpha &= (f_u^\alpha,\, \alpha f_u^{\alpha-1} d_u), &\textrm{donde $\alpha$ 
es un número real}.
\end{align}


i. Implementa esto usando Julia.

ii. Define un polinomio $p(x)$ cuya variable independiente es $x$. Evalúa el polinomio en ${\overline x}$ (variable independiente $x$), en $x_0=0$. ¿Qué interpretación 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})$?

iii. Pensando en la interpretación que le diste a $d_x$, cómo definirías la acción sobre ${\overline x}$ de las siguientes funciones:
- $\exp(\,{\overline x}\,)$
- $\log(\,{\overline x}\,)$
- $\sin(\,{\overline x}\,)$
- $\cos(\,{\overline x}\,)$
- $\tan(\,{\overline x}\,)$

iv. ¿Cómo podemos definir las cosas en Julia de tal manera que ${\overline v} + c$, y las demás posibles operaciones
entre una variable compósita y un flotante $c$, tengan sentido?


[7] En el resto del curso, trataremos con *aritmética de intervalos*. En este nuevo tipo de aritmética, ocupamos intervalos $[a,b]$ de la recta real, que es el conjunto 

$$[a, b] := \{x : a \le x \le b \}$$

(i) Define un tipo composito para representar un intervalo de dos números reales.

(ii) ¿Cómo podríamos tener operaciones sensatas sobre los intervalos? La idea básica es que el resultado de la operación sobre dos intervalos contenga los valores posibles resultantes de operar con los miembros de los dos intervalos respectivos.

(iii) Implementa estas operaciones, sin tomar en cuenta cuestiones de redondeo.

(iv) ¿Cómo nos puede ayudar el redondeo? Impleméntalo.

23647f738447df834f36b122307c193e4e720b4d
ipynb
Jupyter Notebook
notebooks/06. Tipos compositos en Julia.ipynb
dpsanders/MetodosNumericosAvanzados
57ed97526afa7f922a43a34dfdc2509274431034
MIT
2015-02-15T17:46:09.000Z
2020-03-12T02:50:44.000Z
notebooks/06. Tipos compositos en Julia.ipynb
dpsanders/MetodosNumericosAvanzados
57ed97526afa7f922a43a34dfdc2509274431034
MIT
notebooks/06. Tipos compositos en Julia.ipynb
dpsanders/MetodosNumericosAvanzados
57ed97526afa7f922a43a34dfdc2509274431034
MIT
2015-02-15T16:55:23.000Z
2021-08-03T03:43:01.000Z
Qwen/Qwen-72B
1. YES
2. YES