Una barca è in grado di navigare quando almeno la metà dei motori risulta funzionante. Supponiamo che ogni motore si possa guastare con probabilità in modo indipendente dagli altri. Per quali valori di un traghetto con quattro motori ha maggior probabilità di navigare di un traghetto con due motori?
L'idea è di trovare per quali si ottiene che
ovvero
Possiamo modellare in generale lo scenario in cui ad una barca con motori se ne rompano impiegando una variabile aleatoria la cui densità
descrive la probabilità che di ottenere successi (la rottura di motori) nell'esecuzione di esperimenti aleatori (l'avere motori a disposizione) ciascuno dei quali può manifestare un successo con probabilità . In questo modo, il calcolo (2) si converte in
dove è la funzione di ripartizione (cumulative distribution function, da cui la cdf che si vede nel codice) che descrive .
using Statistics, Distributions
using Plots
ps = range(0,1,length=1000)
p_navigare(k,p) = cdf(Binomial(k,p),div(k,2))
plot(ps,p_navigare.(2,ps), label="2 motori")
plot!(ps,p_navigare.(4,ps), label="4 motori")
Questa è quindi la formulazione più comoda per il contesto informatico; altrimenti a mano converrebbe sommare i vari valori puntuali (cioè ) e lavorare da quelli la disequazione. Procedendo in questo modo infatti otterremo
Si potrebbero infine anche confrontare più motori ma l'idea è sempre la stessa: per basse (i motori sono affidabili) sono avvantaggiate le barche con molti motori; per alte (un motore si guasta facilmente) diventa conveniente passare ad un modello con 2 soli motori, avendo in questo modo "meno occasioni" di manifestare un guasto.
plot(ps,p_navigare.(2,ps), label="2 motori")
plot!(ps,p_navigare.(4,ps), label="4 motori")
plot!(ps,p_navigare.(6,ps), label="6 motori")
plot!(ps,p_navigare.(8,ps), label="8 motori")
plot!(ps,p_navigare.(10,ps), label="10 motori")
Concludiamo con una simpatica gif che mostra l'andamento delle varie probabilità, con anche un effetto Matrix/zoom nella parte centrale più interessante.
ps1 = range(0.0, 0.3, length=500) # less dense before 0.3
ps2 = range(0.3, 0.5, length=2000) # denser in [0.3, 0.5]
ps3 = range(0.5, 1.0, length=500) # less dense after 0.5
ps = unique(vcat(ps1, ps2, ps3))
ys = [p_navigare.(n, ps) for n in 2:2:10]
labels = string.(collect(2:2:10)," motori")
colors = [:blue, :green, :red, :orange, :purple]
@gif for i in 1:length(ps)
plt = plot(dpi=300)
for j in 1:length(ys)
plot!(ps[1:i], ys[j][1:i], label=labels[j], color=colors[j])
end
end every 10