Documentaciónestacionaria(P, tolerancia, max_iter)

estacionaria(P,tolerancia,maxiter)\texttt{estacionaria}(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:

π=πP\pi=\pi P

Validaciones y casos borde

  • Valida que P sea cuadrada y estocastica por filas.
  • Valida que tolerancia sea mayor que cero.
  • Valida que max_iter sea entero y mayor que cero.
  • Si la iteracion no converge antes de max_iter, emite ERROR().

Comportamiento

  • Inicializa una distribucion uniforme sobre todos los estados.
  • Repite markov.paso(pi_, P) hasta que la diferencia entre iteraciones sea menor que tolerancia.
  • 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ámetroTipoDescripción
PMATRIZMatriz de transicion o probabilidades.
toleranciaNUMERICOTolerancia numerica usada como criterio de convergencia.
max_iterNUMERICOCantidad 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