Testo. Un server è in uno di tre stati a ogni secondo: 1= libero, 2= occupato, 3= guasto. Le transizioni, indipendenti dal passato, hanno matrice
P=0,70,40,50,20,500,10,10,5.
Verificare che P è stocastica e calcolare P2. Il server parte libero: probabilità di essere guasto dopo 3 secondi.
Classificare la catena e calcolare la distribuzione stazionaria π.
Tempo medio di ritorno in ciascuno stato.
Tempo medio per arrivare al guasto partendo da libero e da occupato.
Quanti secondi servono perché Pn approssimi π a meno di 10−3 per entrata? Qual è la frazione di tempo guasto su 1000 secondi?
Soluzione
1. Le righe sommano a 1: 0,7+0,2+0,1=0,4+0,5+0,1=0,5+0+0,5=1. Il prodotto riga per colonna dà, per esempio, (P2)11=0,7⋅0,7+0,2⋅0,4+0,1⋅0,5=0,62:
P2=0,620,530,600,240,330,100,140,140,30.
La probabilità di guasto al terzo secondo è (P3)13, cioè (riga 1 di P2) per (colonna 3 di P): 0,62⋅0,1+0,24⋅0,1+0,14⋅0,5=0,062+0,024+0,07=0,156(=39/250).
2. Da 1 si va in 2 e in 3; da 2 in 1; da 3 in 1: ogni stato raggiunge ogni altro (per esempio 2→1→3 e 3→1→2): irriducibile. Ha cappi (P11>0), quindi è aperiodica. Per il teorema fondamentale esiste un'unica π, ed è il limite di Pn. Le equazioni πP=π per le colonne 2 e 3:
La colonna 1 è ridondante. Normalizzando: π1(1+0,4+0,28)=1,68π1=1, quindi
π=(4225,215,61)≈(0,5952;0,2381;0,1667).
Controllo con la colonna 1: 0,7⋅4225+0,4⋅4210+0,5⋅427=4217,5+4+3,5=4225.
3. Dal teorema hii=1/πi: h11=2542=1,68, h22=521=4,2, h33=6 secondi. Partendo da guasto, il server torna guasto in media dopo 6 secondi.
4. Sia gi il tempo medio per raggiungere lo stato 3 da i. Condizionando al primo passo (g3=0):
g1=1+0,7g1+0,2g2,g2=1+0,4g1+0,5g2.
Dalla seconda 0,5g2=1+0,4g1, quindi g2=2+0,8g1; nella prima: 0,3g1=1+0,2(2+0,8g1)=1,4+0,16g1, cioè 0,14g1=1,4, g1=10 e g2=2+8=10. In entrambi i casi 10 secondi. Coerenza con il punto 3: da 3 si resta (probabilità 0,5, un passo) oppure si va in 1 (probabilità 0,5) e poi servono in media g1 passi per tornare in 3, quindi h33=1+0,5g1=1+5=6, come sopra.
5. Gli autovalori di P sono 1, 0,4, 0,3 (calcolati con numpy; la traccia 0,7+0,5+0,5=1,7 è la loro somma). L'errore decade come 0,4n a meno di una costante; le entrate della prima riga sono (potenze esatte):
n
1
2
3
5
8
10
(Pn)11
0,7
0,62
0,6
0,59492
0,59517
0,59522
(Pn)13
0,1
0,14
0,156
0,16496
0,16656
0,16665
Con π1=0,59524 e π3=0,16667, l'errore massimo su tutte le 9 entrate di Pn vale 2,4⋅10−3 per n=7 e 9,99⋅10−4<10−3 per n=8 (calcolo numerico): servono n=8 secondi. La frazione di tempo guasto su 1000 secondi è, per il teorema ergodico, ≈π3=61, cioè circa 167 secondi.
Codice di verifica
python
import numpy as np
P = np.array([[.7, .2, .1], [.4, .5, .1], [.5, 0, .5]])
print(np.linalg.matrix_power(P, 2))
print("P^3[0,2] =", np.linalg.matrix_power(P, 3)[0, 2])
w, v = np.linalg.eig(P.T)
pi = np.real(v[:, np.argmax(np.real(w))]); pi /= pi.sum()
print("pi =", pi, " ritorni =", 1 / pi, " autovalori =", np.sort(np.real(w)))
# tempi di raggiungimento dello stato 3 (indice 2)
Q = P[:2, :2]
print("g =", np.linalg.solve(np.eye(2) - Q, np.ones(2)))
rng = np.random.default_rng(1); x = 0; n3 = 0for _ inrange(1000):
x = rng.choice(3, p=P[x]); n3 += (x == 2)
print("secondi guasti su 1000:", n3)
Output (il numero di secondi guasti dipende dal seme):