Documentaciónestacionaria(P, tolerancia, max_iter)
Nombre
estacionaria - Aproxima la distribucion estacionaria de una cadena de Markov por iteracion.
Sinopsis
pi = markov.estacionaria(P, tolerancia, max_iter)
Descripcion
Itera sucesivos pasos de la cadena hasta que la distribucion deje de cambiar dentro de una tolerancia dada.
Parte de una distribucion uniforme y repite la actualizacion hasta aproximar un estado estacionario.
Formula:
Validaciones y casos borde
- Valida que
Psea cuadrada y estocastica por filas. - Valida que
toleranciasea mayor que cero. - Valida que
max_itersea entero y mayor que cero. - Si la iteracion no converge antes de
max_iter, emiteERROR().
Comportamiento
- Inicializa una distribucion uniforme sobre todos los estados.
- Repite
markov.paso(pi_, P)hasta que la diferencia entre iteraciones sea menor quetolerancia. - Usa internamente una funcion utilitaria para medir convergencia.
- Retorna el ultimo vector calculado como matriz fila.
Funciones API relacionadas
markov.paso()markov.evolucion()markov.es_estocastica()
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
| P | MATRIZ | Matriz de transicion o probabilidades. |
| tolerancia | NUMERICO | Tolerancia numerica usada como criterio de convergencia. |
| max_iter | NUMERICO | Cantidad maxima de iteraciones permitidas. |
Valor de retorno
MATRIZ - Distribucion estacionaria aproximada, representada como matriz fila.
Ejemplo
ejemplo.blox
// Cadenas de MARKOV
//
// Problema
//
// Una cadena climática con 3 estados:
// 0 = Soleado
// 1 = Nublado
// 2 = Lluvioso
//
// Matriz de transición:
// Sol Nub Llu
// P = Sol [ [0.5, 0.3, 0.2],
// Nub [0.2, 0.5, 0.3],
// Llu [0.4, 0.1, 0.5] ]
//
//
// Distribución inicial:
//
// pi0 = [1, 0, 0]
//
// Objetivo
//
// Calcular la distribución después de 10 días.
// pi1 = pi0 * P <-- dia 1
// pi2 = pi1 * P <-- dia 2
// pi3 = pi2 * P <-- dia 3
// pi4 = pi3 * P <-- dia 4
// ...
INCLUIR "matrices.api"
INCLUIR "markov.api"
INCLUIR "graficos.api"
FUNCION PRINCIPAL
INICIO "ejemplo_paso"
NUMERICO i
// 1. Preparacion de los datos
//
MATRIZ P[3][3]
P = [ [0.5, 0.3, 0.2],
[0.2, 0.5, 0.3],
[0.4, 0.1, 0.5] ]
MATRIZ pi0[1][3], pi1[1][3]
pi0[0][0] = 0
pi0[0][1] = 0
pi0[0][2] = 1
// 2. Calculo de la distribución después de 10 días
//
VECTOR X[10], Sol[10], Nub[10], Llu[10]
PARA i = 0 HASTA 9 HACER
pi1 = markov.paso(pi0, P)
X[i] = i
Sol[i] = pi0[0][0]
Nub[i] = pi0[0][1]
Llu[i] = pi0[0][2]
pi0 = pi1
FIN_PARA
// 3. Grafico de la distribucion después de 10 días
//
TABLA curvas
curvas[1] = { X = X, Y = Sol, nombre = "Sol" }
curvas[2] = { X = X, Y = Nub, nombre = "Nub" }
curvas[3] = { X = X, Y = Llu, nombre = "Llu" }
graficos.graficar_trayectorias_n(curvas, "Markov", "PROG95 - MARKOV - ejemplo2 - loop de paso().png")
// 4. Calculo de la matriz estacionaria
//
MATRIZ pi_est[][]
pi_est = markov.estacionaria(P, 0.00001, 100)
IMPRIMIR("\npi0 = ")
matrices.imprimir(pi0)
IMPRIMIR("\nP = ")
matrices.imprimir(P)
IMPRIMIR("\npi_est = ")
matrices.imprimir(pi_est)
FINAL