Você está na página 1de 23

Roberto F.

Ausas

ICMC - Ramal 736628, rfausas@gmail.com

Cálculos estocásticos

• Nesta aula vamos realizar alguns cálculos estocásticos


para estimar a probabilidade de certos eventos em sis-
temas complexos, tais como uma rede hidráulica com-
posta de centenas o milhares de arestas.
• Estes cálculos estocásticos são a base dos chamados
métodos Monte Carlo, que são uma classe de métodos
computacionais baseados em amostragens aleatórias.
• Estes métodos são muitos poderosos e flexı́veis para re-
solver problemas complexos. Muitas vezes são a única
forma de resolver-los.

O problema que vamos tentar resolver é o seguinte:


Análise de risco

• Um bairro conta com uma rede hidráulica conhecida,


alimentada desde um reservatório a pressão P = 5.
• Dois tipos de canos: grossos, com “condutância” C =
20, e os finos, com C = 2.
• De todos os nós é extraı́da uma vazão nominal Q = 0.1.
• Anualmente, os canos finos (apenas eles) ficam obstru-
idos com probabilidade a. Quando obstruidos, seu valor
de C se reduz a C = 0.2.
Pergunta: Qual é a probabilidade de que, passado um
ano, algum dos nós esteja a pressão menor que 1.15?

Reservatorio

houseconsumo

P1 = 5
O primeiro passo é montar o cálculo da rede hidráulica com-
pleta dados os valores das conductâncias em cada cano. Para
isto vamos fazer um programa de Octave que resolva todo de
uma vez:

• Construimos os dados da rede sem obstruções. Por ex-


emplo, vamos fazer um bairro com n=m=10. Começamos
com apenas canos finos de CH=CV=2,

[nv nc conec C coord] = RedeHidraBairro(n,m,CH,CV);

Agora, vamos colocar canos grossos em alguns lugares


(só por inventar um exemplo)

C(1) = 20; C(2) = 20; C(3) = 20;


C(94) = 20; C(104) = 20; C(114)= 20;
C(31) = 20; C(32) = 20; C(33) = 20;
Agora, vamos fazer uma função que resolve a rede, que
utilizará as funções:

– Assembly.m
– NewBuildSystem.m

Forma vetorizada da função (ver lista anterior)

function A = Assembly(nv, nc, conec, C)


A = zeros(nv);
for k=1:nc
p = conec(k,1);
q = conec(k,2);
aux = [C(k) -C(k) ; -C(k) C(k)];
A([p q],[p q]) = A([p q],[p q]) + aux;
end
end
function [Atilde b] = NewBuildSystem(nv,A,houseconsumo)

Atilde = A;

% Cada casa consumira houseconsumo


b = -houseconsumo * ones(nv,1);

% Colocamos o reservatorio sempre no no 1


Atilde(1,:)=0; Atilde(1,1)=1;
b(1) = 5;

end
function P = ResolveRede(nv,nc,conec,C)

A = Assembly(nv,nc,conec,C);

houseconsumo = 0.1;
[Atilde b] = NewBuildSystem(nv,A,houseconsumo);

P = sparse(Atilde) \ b;

end
• A rede nominal se resolve como

P=ResolveRede(nv,nc,conec,C);

max(P)=5, min(P)=1.6745
Vamos fazer um parentesis - Cálculos estocásticos:
Exemplo muito simples:

Vamos estimar el valor do número π da seguinte forma:


Se consideramos a região quadrada [−1, 1] × [−1, 1] e
um cı́rculo inscrito, a razãos das áreas entre estes é
π/4.

Então, podemos propor um cálculo estocástico para cal-


cularla, os passos são:

1. Gerar (xi , yi ), formado por dois números xi e yi en-


tre −1 e 1, independentes e com probabilidade uni-
forme.
2. Calcular θi , definida como igual a 1 se xi2 + yi2 < 1 e
igual a 0 se não. Seja Θ = {θi } a sequência gerada.
3. Tirar a média
1 N
θ̂ = ⟨Θ⟩ = ∑ θi
N i=1

A implementação em Octave é:

som=0;
for i=1:N
x = -1 + 2*rand();
y = -1 + 2*rand();
if (x^2+y^2<1)
som=som+1;
end
end
p=som/N
Resultados para 4p:
# N = 103 N = 104 N = 105 N = 106 N = 107
1 3.0800 3.1492 3.1450 3.1418 3.1405
2 3.2320 3.1340 3.1396 3.1400 −−
3 3.1240 3.1412 3.1469 3.1376 −−
4 3.0800 3.1660 3.1488 3.1406 −−

– Observar que os resultados são mais precisos quando


N é maior.
– Como podemos apreciar, é uma maneira muito cos-
tosa de cálcular π, porém este tipo de cálculos po-
dem nos ajudar a resolver problema muito com-
plexos.
Terminamos o parentesis, então, voltemos ao problema
da rede hidráulica:

– Seja M o número de canos finos, todos distintos


por ocuparem lugares distintos na rede.
– Existem 2M casos diferentes. Então, supondo M =
100 teremos 2100 = 1.27 × 1030 casos.
– Cada caso que deve ser analisado corresponde a
um vetor C diferente.
– Para cada caso, podemos calcular deterministica-
mente todas as pressões, em particular a mı́nima:
P=ResolveRede(nv,nc,conec,C); pmin=min(P);
– Se formos calcular todos os possı́veis casos surge
uma dificuldade:
Se o cálculo de um caso particular demora 1
nanosegundo, para analisar todos demoramos
4×1013 anos.

– Motivados pelo exemplo anterior, para estimar a


probabilidade de falha, vamos explorar de maneira
aleatória todo o conjunto de possibilidades.
Então vamos propor um vetor C de conductâncias
aleatório, e para este definimos um θi , que será
igual a 1 se a pressão for menor que 1.15 e 0 em
caso contrario, i.e.,

⎪1
⎪ se min(P) < 1.15
θi = ⎨

⎪0 se não

Uma estimativa da probabilidade desejada será

1 N
θ̂ = ∑ θi
N i=1

1. Gerar um vetor C com a probabilidade adequada


function Cnew = RandomFailFinos(nc,C,a,Centup)
Cnew=C;
for i=1:nc
if (C(i)==2) %Eh um cano fino
numrand = rand(); %Distribuido unif em [0,1]
if(numrand < a)
Cnew(i) = Centup;
end
end
end
2. Determinar as pressões P, se min(P) < 1.15 con-
siderar dentro dos casos falhos. Desta forma va-
mos fazer N (dezenas de milhares) de realizações
som = 0;
for i=1:N
Cnew = RandomFailFinos(nc,C,a,Centup)
P = ResolveRede(nv,nc,conec,Cnew);
pmin=min(P);
if (pmin<1.15)
som = som + 1;
end
end
3. A probabilidade pedida é estimada por x̂,
x = som/N
– Esse algoritmo percorre apenas uma minúscula fração
do conjunto de possibilidades se N é pequeno.
– Quando N → +∞ podemos esperar um resultado
correto.
• Começamos fazer realizações:

Cnew = RandomFailFinos(nc,C,a,Centup);
P = ResolveRede(nv,nc,conec,Cnew);

max(P)=5, min(P)=0.93263
• e outra realização

Cnew = RandomFailFinos(nc,C,a,Centup);
P = ResolveRede(nv,nc,conec,Cnew);

max(P)=5, min(P)=1.1423
• Podemos agora fazer N realizações:
# N = 1000 N = 4000 N = 16000 N = 64000
1 0.176 0.179 0.193 0.190
2 0.185 0.195 0.197
3 0.194 0.194
3 0.236 0.186
4 0.198 0.195

• Das quais poderia se inferir que a probabilidade de falha


do sistema é aproximadamente 20%.
• A probabilidade calculada se estabiliza quando N cresce,

mas ainda é necessária uma inferência estatı́stica para


extrair alguma conclusão quantitativa ou qualitativa.
• Mudando a probabilidade p de obstrução de cada cano
individual para a = 0.05, o resultado é bem diferente,

A estimativa de probabilidade de falha cai para ∼0.7%.


• Quando a se reduz para 0.035 a probabilidade de falha
cai para ∼ 0.2%, e 8000 realizações são certamente in-
suficientes:

a= 20% 10% 5% 3.5%

P ∼x = 94% 20% 0.7% 0.2%


Exercı́cio: Implementar todos os programas e funções
desenvolvidos até aqui e reproduzir os resultados mostra-
dos. Em cada caso não precisa ir allém de 8000
realizações nos calculos.

Você também pode gostar