-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
9961054
commit 47c2807
Showing
3 changed files
with
574 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,341 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 14, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"import numpy as np\n", | ||
"\n", | ||
"# Acá les dejo un regalito. \n", | ||
"# Para que todo lo que printeamos tenga 3 decimales y sin notación científica\n", | ||
"np.set_printoptions(precision=3)\n", | ||
"np.set_printoptions(suppress=True)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"Defino algunas funciones que nos van a servir" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 15, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"def matriz_ruina_apostador(n,p):\n", | ||
" \"\"\"Devuelve la matriz de transición de la ruina del apostador \n", | ||
" de tamaño nxn, cuando se gana con probabilidad p\"\"\"\n", | ||
" \n", | ||
" A = np.zeros((n,n))\n", | ||
" A[0,0] = 1\n", | ||
" A[-1,-1] = 1\n", | ||
" for j in range(1,n-1):\n", | ||
" A[j-1,j] = 1-p\n", | ||
" A[j+1,j] = p\n", | ||
" return(A)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 16, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"def p_inf_v(P, v ,k , tol = 10**-6):\n", | ||
" \"\"\"Itera v = P@v hasta que converja o se llegue a k iteraciones.\n", | ||
" tol es como el espilón del límite, si la distancia entre dos iteraciones\n", | ||
" consecutivas es menor a tol consideramos que llegamos al límite\"\"\"\n", | ||
" \n", | ||
" for i in range(k):\n", | ||
" if np.linalg.norm(P @ v - v) < tol:\n", | ||
" break\n", | ||
" else:\n", | ||
" v = P @ v\n", | ||
" return(v)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 17, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"def canonico(n,j):\n", | ||
" \"\"\"Devuelve el canoninco e_j de R^n\"\"\"\n", | ||
"\n", | ||
" v = np.zeros(n)\n", | ||
" v[j] = 1\n", | ||
" return(v)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"## Tenis" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 5, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"[[1. 0.333 0. 0. 0. ]\n", | ||
" [0. 0. 0.333 0. 0. ]\n", | ||
" [0. 0.667 0. 0.333 0. ]\n", | ||
" [0. 0. 0.667 0. 0. ]\n", | ||
" [0. 0. 0. 0.667 1. ]]\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"#Armo la matriz de proceso\n", | ||
"n=5\n", | ||
"p=2/3\n", | ||
"\n", | ||
"P = matriz_ruina_apostador(n,p)\n", | ||
"print(P)\n" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 6, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"[0. 0. 1. 0. 0.]\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"# Estado inicial 40-40 (deuce), o sea el tercer canoninco\n", | ||
"v = canonico(n,2) # Acuerdense que python cuenta desde 0\n", | ||
"print(v)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 7, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"[0.2 0. 0. 0. 0.8]\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"# Iteramos\n", | ||
"v_inf = p_inf_v(P,v,1000)\n", | ||
"print(v_inf)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 8, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"data": { | ||
"text/plain": [ | ||
"array([0.2 , 0.8 , 1.275, 0.778, 0. ])" | ||
] | ||
}, | ||
"execution_count": 8, | ||
"metadata": {}, | ||
"output_type": "execute_result" | ||
} | ||
], | ||
"source": [ | ||
"# Cómo se escribe v en base de autovectores?\n", | ||
"\n", | ||
"Cbe = np.linalg.eig(P)[1]\n", | ||
"np.linalg.solve(Cbe,v)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 9, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"[[1. 0.467 0.2 0.067 0. ]\n", | ||
" [0. 0. 0. 0. 0. ]\n", | ||
" [0. 0. 0. 0. 0. ]\n", | ||
" [0. 0. 0. 0. 0. ]\n", | ||
" [0. 0.533 0.8 0.933 1. ]]\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"# Cómo se ve P^inf\n", | ||
"\n", | ||
"P_inf = np.linalg.matrix_power(P,1000)\n", | ||
"print(P_inf)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"¿Qué nos dicen las columnas de $ P^\\infty $ ?" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"## Figuritas" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 22, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"def matriz_figuritas(n):\n", | ||
" \"\"\"Devuelve la matriz de transición para el problema de n figuritas\"\"\"\n", | ||
" \n", | ||
" diag = np.linspace(0,1,n+1) # esto me arma la suc k/n con k de 0 hasta n\n", | ||
" \n", | ||
" # Armo una matriz diagonal con diag en la diagonal\n", | ||
" P = np.diag(diag)\n", | ||
"\n", | ||
" # abajo de la diagonal recorro la suc k/n al revés desde n hasta 1\n", | ||
" for i in range(1,n+1):\n", | ||
" P[i,i-1] = diag[-i] \n", | ||
" return(P)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 23, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"P = matriz_figuritas(638)\n", | ||
"v = canonico(639,0)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 27, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"data": { | ||
"text/plain": [ | ||
"array([[0. , 0. , 0. , ..., 0. , 0. , 0. ],\n", | ||
" [1. , 0.002, 0. , ..., 0. , 0. , 0. ],\n", | ||
" [0. , 0.998, 0.003, ..., 0. , 0. , 0. ],\n", | ||
" ...,\n", | ||
" [0. , 0. , 0. , ..., 0.997, 0. , 0. ],\n", | ||
" [0. , 0. , 0. , ..., 0.003, 0.998, 0. ],\n", | ||
" [0. , 0. , 0. , ..., 0. , 0.002, 1. ]])" | ||
] | ||
}, | ||
"execution_count": 27, | ||
"metadata": {}, | ||
"output_type": "execute_result" | ||
} | ||
], | ||
"source": [ | ||
"P" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 12, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"5553\n", | ||
"[0. 0. 0.005 0.095 0.9 ]\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"# Itero hasta que la última coordeanda de v sea mayor o igual a 0.9\n", | ||
"# y cuento cuantas figuritas compre\n", | ||
"figus = 0\n", | ||
"while v[-1] < 0.9:\n", | ||
" v = P @ v\n", | ||
" figus += 1 # esto equivale a figus = figus + 1\n", | ||
"print(figus)\n", | ||
"print(v[-5:])" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 13, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"Neccesito comprar 1111 paquetes para tener un 90% de probabilidades de llenar el álbum\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"# Suponiendo 5 figuritas por paquete:\n", | ||
"print('Neccesito comprar', round(figus/5), 'paquetes para tener un 90% de probabilidades de llenar el álbum')" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"### ¿Se les ocurren otros juegos o problemas que se puedan modelar con procesos de Markov?" | ||
] | ||
} | ||
], | ||
"metadata": { | ||
"kernelspec": { | ||
"display_name": "Python 3 (ipykernel)", | ||
"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.8.10" | ||
}, | ||
"vscode": { | ||
"interpreter": { | ||
"hash": "369f2c481f4da34e4445cda3fffd2e751bd1c4d706f27375911949ba6bb62e1c" | ||
} | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 2 | ||
} |
Oops, something went wrong.