Árvore de falhas e diagrama de blocos de confiabilidade

tree.jpg

“Uma Árvore de Falhas é um diagrama lógico que mostra a relação entre uma falha do sistema e falhas de componentes deste sistema.” Aven T. Reliability and risk analysis

Uma árvore de falhas descreve a relação das falhas dos componentes (eventos-base) com um modo de falha específico do sistema (evento-topo) através de portas lógicas. A análise de uma árvore de falhas segue os seguintes estágios:

  1. Definição do evento-topo e do escopo de estudo;
  2. Construção da árvore de falhas;
  3. Identicação dos conjutos de corte mínimo;
  4. Análise qualitativa da árvore;
  5. Análise quantitativa da árvore.

No propósito de praticarmos a construção das árvores de falhas e alguns conceitos básicos de confiabilidade, tomemos como exemplo uma simples torre de destilação e os equipamentos associados a ela. Para os não-conhecedores dos mistérios destas torres, segue descrição do funcionamento do processo.

cln01.png
Fig. 01: P & I - Torre de destilação
  1. A alimentação da torre é regulada por um controlador de vazão (FRC-101);
  2. O controlador de temperatura (TRC-101) manipula a vazão de vapor que entra no trocador de calor para aquecer a corrente de alimentação até o setpoint;
  3. Um analizador (An-101) na entrada fornece a composição química da alimentação a um controlador feedfoward. Tal controlador fornece o setpoint ao controlador de vazão do refluxo (FRC-102);
  4. Os produtos mais voláteis da torre saem por cima e são resfriados por uma corrente de água dentro do condensador de topo cuja vazão é gerida pelo controlador FRC-103;
  5. A corrente resfriada é conduzida a um acumulador de refluxo. Parte do líquido é bombeada e reconduzida à torre na corrente de refluxo. A outra fração deixa o processo e sua vazão é manipulada para controlar (LIC-101) o nível dentro do tambor de acumulação de condensado;
  6. A pressão da torre é controlada pelo PIC-101 manipulando a válvula do vent aclopado ao acumulador;
  7. Na base da destiladora os produtos pesados são aquecidos e a vazão do vapor de aquecimento é controlada pelo FRC-104;
  8. O nível de líquido na base da torre é manejado pelo LIC-102 através da manipulação da vazão com que os produtos pesados deixam o processo.

Vamos empregar dois pacotes neste conjunto de exercícios: o dplyr e o FaultTree. Vamos carregá-los:

# Instalaçao dos pacotes
if (!require("FaultTree")) install.packages("FaultTree", repos="http://R-Forge.R-project.org") ; library(FaultTree)
if (!require("dplyr")) install.packages("dplyr") ; library(dplyr)

Agora estamos preparados para as análises!

Sistema com arranjo em série

Partimos do controle de pressão da coluna. Por hora vamos acrescentar ao sub-sistema um transmissor de pressão (PT-101). Logo teremos a seguinte configuração para o sub-sistema em estudo:

cln02.png
Fig. 02: Sistema de controle de pressão

Neste exercício, o evento-topo é a “Falha no contole da pressão da destiladora”. O nível de detalhamento da análise se limita aos equipamentos responsáveis pelo controle da pressão da torre. Ou seja, a série que vai do sensor/transmissor até o elemento final de controle. Logo, podemos iniciar a construção da árvore de falhas.

# Construção da árvore (ex. confiabilidade em série)
ex01 <- ftree.make(type="or", name="Falha no contole da", name2="pressao da destiladora")
  • ex01 é o nome que estamos dando ao dataframe que conterá as informações da árvore;
  • ftree.make é a função que cria a árvore ao inserir seu evento-topo;
  • type é o argumento da função que indica a porta lógica que conduz ao referido evento;
  • As variáveis name e name2 definem o nome dado à falha. name2 fica logo abaixo de name, como uma quebra.
arv01.png
Fig. 03: Evento-topo da árvore de falhas

Já definimos o evento-topo e o escopo de estudo. Agora, passamos à construção da árvore. Que eventos são causas imediatas (sem necessidade de eventos intermediários) do evento-topo?

É imediato notarmos que a falha em qualquer um dos equipamentos da série leva diretamente ao evento-topo. Portanto, eles estão diretamente ligados ao evento-topo. Além disso, como a fronteira de nosso escopo são os equipamentos em si e não nenhum componente interno dos mesmos, então a falha de cada um destes equipamentos é um evento-base.

ex01 <- addProbability(ex01, at=1, prob=0.1, name="Falha no transmissor", name2="de pressao (PT-101)") %>%
  addProbability(at=1, prob=0.1, name="Falha no controlador", name2="de pressao (PIC-101)") %>%
  addProbability(at=1, prob=0.1, name="Falha na valvula", name2="de controle (Vent)")
  • Chamamos o dataframe ex01 que contém a árvore para adicionar a ela os outros eventos;
  • A função addProbability adiciona um evento-base à árvore;
  • O argumento at indica a ID do evento superior ao qual o evento deve se ligar. As ID’s são dadas aos eventos na ordem em que eles são inseridos na árvore;
  • prob é a probabilidade de ocorrência da falha, ou seja, F(t);
note.png

O símbolo %>% (pipe) nos permite propagar a variável que está sendo modificada pelas várias linhas de comando sem a necessidade de chamar a mesma variável várias vezes.

Por hora, iremos ignorar a definição dos conjuntos de cortes mínimos. Assim sendo, podemos enfim propagar as probabilidades ao longo da árvore, obter a probabilidade de ocorrência do evento-topo e gerar um documento html contendo a árvore datravés da funções ftree.calc e ftree2html.

ex01 <- ftree.calc(ex01)
ftree2html(ex01, write_file=TRUE)
Fig. 04.1: Árvore de falhas - Componentes funcionando em série
dbc01.png
Fig. 04.2: Diagrama de blocos de confiabilidade - Componentes funcionando em série

Note que os elementos que aparecem em série no diagrama de blocos de confiabilidade, na árvore de falhas têm suas falhas ligadas ao evento-topo por uma porta lógica OU. Essa inversão ocorre por causa da complementariedade dos conceitos de falha e confiabilidade (não-falha).

note.png

Quando uma árvore contém somente portas E e OU ela pode ser descrita alternativamente por meio de um diagrama de confiabilidade.

Ainda, é importante notar que a probabilidade de um evento associado a uma porta lógica OU não é a mera soma das probabilidade dos eventos que afluem para a mesma e sim esta soma compensada pelas recontagens de eventos combinados. Todavia, se tais eventos são raros a soma é uma aproximação adequada.

Fig. 05: Probabilidade de evento-topo com porta lógica OU calculada precisamente ou por aproximação
note.png

O cálculo de probabilidades unidas por uma porta lógica OU pode ser aproximado para uma soma se tais eventos são raros.

Sistema com arranjo em paralelo

Agora, deixemos de lado o sistema de controle de pressão e observemos o sistema de supervisão do nível da coluna. Vamos ignorar a válvula e o controlador de nível (LIC-102) e iremos acrescentar um indicador de nível (LI-101) e um alarme de nível baixo (LAL-101) ambos montados no painel principal de controle. Incluiremos também um visor de nível (LG-101) montado no corpo da coluna.

cln03.png
Fig. 06: Sistema de supervisão do nível

Neste exemplo, o evento-topo é a “Falha em detectar nível baixo”. Mais uma vez iremos descrever os eventos até os equipamentos sem maior detalhamento. Em verdade, em alguns aspectos este caso é análogo ao exemplo em série. Assim, as falhas dos equipamentos irão levar diretamente ao modo de falha sob estudo e também serão eventos-base. A diferença entre os exemplos é a relação funcional entre os componentes do sistema. Neste exemplo temos instrumentos redundantes. O que implica afirmar que eles estão em paralelo.

# Construção da árvore (ex. confiabilidade em paralelo)
ex02 <- ftree.make(type="and", name="Falha em detectar", name2="nivel baixo")
  • O argumento type agora assume o valor “and”, pois o arranjo é em paralelo.
arv02.png
Fig. 07: Evento-topo da árvore de falhas

Enfim podemos propagar as probabilidades ao longo da árvore.

ex02 <- addProbability(ex02, at=1, prob=0.1, name="Falha no indicador", name2="de nivel (LI-101)") %>%
  addProbability(at=1, prob=0.1, name="Falha no visor", name2="de nivel (LG -101)") %>%
  addProbability(at=1, prob=0.1, name="Falha no alarme de", name2="nivel baixo (LAL - 101)") %>%
  ftree.calc()
ftree2html(ex02, write_file=TRUE)
Fig. 08.1: Árvore de falhas - Componentes funcionando em paralelo
dbc02.png
Fig. 08.2: Diagrama de blocos de confiabilidade - Componentes funcionando em paralelo

Redundância e cortes mínimos (minimal cut sets)

Redundância em alto nível

Ainda trabalhando no problema de supervisão do nível da coluna, inserimos transmissores comunicando-se com alarmes no painel principal de controle de forma a termos um arranjo em paralelo com redundância em alto nível.

cln04.png
Fig. 09: Sistema de supervisão do nível com redundância em alto nível

Dado o evento-topo, “Falha em detectar nível baixo”, construímos a árvore:

# Construção da árvore (ex. confiabilidade em paralelo - redundância em alto nível)
ex03 <- ftree.make(type="and", name="Falha em detectar", name2="nivel baixo") %>%
  addLogic(at=1, type="or", name="Falha no sinal", name2=" da conexao 01") %>%
  addProbability(at=2, prob=0.1, name="Falha no transmissor", name2="de nivel (LT-101)") %>%
  addProbability(at=2, prob=0.1, name="Falha no alarme de", name2="nivel baixo (LAL - 101)") %>%
  addLogic(at=1, type="or", name="Falha no sinal", name2=" da conexao 02") %>%
  addProbability(at=5, prob=0.1, name="Falha no transmissor", name2="de nivel (LT-102)") %>%
  addProbability(at=5, prob=0.1, name="Falha no alarme de", name2="nivel baixo (LAL - 102)") %>%
  ftree.calc()
ftree2html(ex03, write_file=TRUE)
  • addLogic é a função que adiciona à árvore um evento intermediário ao qual será associada uma porta lógica.
Fig. 10.1: Árvore de falhas - Componentes funcionando em paralelo (redundância em alto nível)
dbc03.png
Fig. 10.2: Diagrama de blocos de confiabilidade - Componentes funcionando em paralelo (redundância em alto nível)

Para confirmar se a árvore está estruturalmente correta vamos calcular a probabilidade do evento-topo de duas formas: uma usando a equação da confiabilidade para sistemas em redundância em alto nível e outra usando a fórmula para um sistema de redundância k-N.

Confiabilidade de um sistema com redundância em alto nível com dois subsistemas com dois componentes cada apresentando confiabilidades idênticas (com \(F = 0.1\), \(n = 2\) e \(m = 2\)):

\[R_{SIST} = 1 - (1-R^n)^m\] \[R_{SIST} = 1 - (1-R^2)^2\] \[R_{SIST} = 2R^2 - R^4\] \[1-F_{SIST} = 2(1-F)^2 - (1-F)^4\] \[F_{SIST} =1 - 2(1-0.1)^2 + (1-0.1)^4\] \[F_{SIST} = 0.0361\]

Agora calculemos a probabilidade de falha de um sistema 2-4 (com \(k = 2\), \(N = 4\) e \(F = 0.1\)):

\[R_{SIST} = \sum_{x=k}^{N} \frac{N!}{x!(N-x)!} R^{x} (1-R)^{N-x}\] \[1-F_{SIST} = \sum_{x=2}^{4} \frac{4!}{x!(4-x)!} (1-F)^{x} F^{4-x}\] \[F_{SIST} = 1 - \sum_{x=2}^{4} \frac{4!}{x!(4-x)!} (1-F)^{x} F^{4-x}\] \[F_{SIST} = 1 -\frac{4!}{2!(4-2)!} (1-0.1)^{2} 0.1^{4-2}-\frac{4!}{3!(4-3)!} (1-0.1)^{3} 0.1^{4-3}-\frac{4!}{4!(4-4)!} (1-0.1)^{4} 0.1^{4-4}\] \[F_{SIST} = 0.0037\]

Tivemos um valor abaixo do esperado. A que se deve tal erro? O que acontece é que esta equação considera que todos os casos onde ao menos 4, 3 ou 2 componentes funcionam geram sucesso. Todavia dos seis possíveis arranjos onde ao menos dois componentes funcionam apenas dois levam ao sucesso. Observe a tabela abaixo:

tab01.png
Fig. 11: Possíveis arranjos do sistema com dois sucessos e duas falhas (alto nível)

Para corrigir isto, basta adicionarmos as probabilidades de ocorrência dos quatro cenários que geram falha:

\[F_{SIST} = 0.0037 + 4(F^{2}(1-F)^{2})\] \[F_{SIST} = 0.0037 + 4(0.1^{2}(1-0.1)^{2})\] \[F_{SIST} = 0.0037 + 0.0324\] \[F_{SIST} = 0.0361\]

Redundância em baixo nível

Passemos agora a um arranjo com redundância em baixo nível.

cln05.png
Fig. 12: Sistema de supervisão do nível com redundância em baixo nível

Dado o evento-topo, “Falha em detectar nível baixo”, construímos a árvore:

# Construção da árvore (ex. confiabilidade em paralelo - redundância em baixo nível)
ex04.1 <- ftree.make(type="and", name="Falha em detectar", name2="nivel baixo") %>%
  addLogic(at=1, type="or", name="Falha no sinal", name2=" da conexao 01") %>%
  addProbability(at=2, prob=0.1, name="Falha no alarme de", name2="nivel baixo (LAL - 101)") %>%
  addLogic(at=2, type="and", name="Falha na transmissao", name2=" de nivel") %>%
  addProbability(at=4, prob=0.1, name="Falha no transmissor", name2="de nivel (LT-101)") %>%
  addProbability(at=4, prob=0.1, name="Falha no transmissor", name2="de nivel (LT-102)") %>%
  addLogic(at=1, type="or", name="Falha no sinal", name2=" da conexao 02") %>%
  addProbability(at=7, prob=0.1, name="Falha no alarme de", name2="nivel baixo (LAL - 102)") %>%
  addDuplicate(at=7, dup_id=4) %>%
  ftree.calc()
ftree2html(ex04.1, write_file=TRUE)
  • addDuplicate é a função que adiciona à árvore uma duplicata de certo evento escolhido (dup_id) e dos seus eventos mais básicos.
Fig. 13.1: Árvore de falhas - Componentes funcionando em paralelo (redundância em baixo nível)
dbc04.1.png
Fig. 13.2: Diagrama de blocos de confiabilidade - Componentes funcionando em paralelo (redundância em baixo nível)

Novamente, para confirmar se a árvore está estruturalmente correta vamos calcular a probabilidade do evento-topo de duas formas: uma usando a equação da confiabilidade para sistemas em redundância em baixo nível e outra usando a fórmula para um sistema de redundância k-N.

Confiabilidade de um sistema com redundância em baixo nível com dois subsistemas com dois componentes cada apresentando confiabilidades idênticas (com \(F = 0.1\), \(n = 2\) e \(m = 2\)):

\[R_{SIST} = (1 - (1-R^n))^m\] \[R_{SIST} = 1 - (1-R^2)^2\] \[R_{SIST} = (2R - R^2)^2\] \[1 - F_{SIST} = (2(1-F) - (1-F)^2)^2\] \[F_{SIST} = 1 - (2(1-0.1) - (1-0.1)^2)^2\] \[F_{SIST} = 0.0199\]

Desta vez, o próprio resultado da árvore foi contradito pelo cálculo da fórmula. Por hora, vamos nos ater à diferença entre os arranjos em paralelo. Já calculamos a probabilidade de falha de um sistema 2-4 (com \(F = 0.1\)) e obtivemos \(F_{SIST} = 0.0037\). Fica evidente mais uma vez, que alguns eventos não foram contabilizados entre os cenários com dois sucessos e duas falhas:

tab02.png
Fig. 14: Possíveis arranjos do sistema com dois sucessos e duas falhas (baixo nível)

A correção advém da adição das probabilidades de ocorrência dos dois cenários que geram falha:

\[F_{SIST} = 0.0037 + 2(F^{2}(1-F)^{2})\] \[F_{SIST} = 0.0037 + 2(0.1^{2}(1-0.1)^{2})\] \[F_{SIST} = 0.0037 + 0.0162\] \[F_{SIST} = 0.0199\]

Este resultado reconcilia as duas fórmulas. Comparando as probabilidades de falha nos cenários de alto (\(F_{SIST} = 0.0361\)) e baixo nível (\(F_{SIST} = 0.0199\)) notamos a superior confiabilidade do sistema de baixo nível.

Cortes mínimos (minimal cut sets)

Agora, retomemos ao problema estrutural da árvore proposta para o sistema de baixo nível. Apesar de sua aparência promissora, ela subestimou a probabilidade do evento-topo. Como obter então a verdadeira estrutura de uma árvore de falhas equivalente a tal sistema proposto?

Neste momento a determinação dos conjuntos de corte mínimo se torna providencial para auxiliar na identificação de erros estruturais da árvore e, ainda além, como alternativa para calcular a probabilidade do evento-topo sem a necessidade de propagar as chances dos eventos-base por vários eventos intermediários.

note.png

Os cortes mínimos são os conjuntos que agregam a menor porção de eventos cuja ocorrência simultânea leva diretamente ao evento-topo. A ocorrência de qualquer um dos cortes mínimos leva ao evento-topo.

É evidente que obter tais conjuntos por inspeção visual pode ser extremamente demandante, logo, vamos fazer bom uso do R e do pacote FaultTree:

# Cortes mínimos (ex. confiabilidade em paralelo - redundância em baixo nível)
ex04.1_cs <- cutsets(ex04.1)
out01.png
Fig. 15.1: Tabela de cortes mínimos de 2ª ordem (Console do RStudio)
Cortes mínimos de 2ª ordem
Evento-base 1 Evento-base 2
Corte mínimo 1 Falha no alarme de nivel baixo (LAL - 101) Falha no alarme de nivel baixo (LAL - 102)
Corte mínimo 2 Falha no transmissor de nivel (LT-101) Falha no transmissor de nivel (LT-102)
Fig. 15.2: Tabela de cortes mínimos de 2ª ordem

Esta função fornece os cortes mínimos de 1ª a 4ª ordem. A árvore deste exemplo somente apresenta dois conjutos os quais são de 2ª ordem. Na posse desta informação vamos reconstruir a árvore:

# Construção da árvore (ex. confiabilidade em paralelo - redundância em baixo nível)
ex04.2 <- ftree.make(type="or", name="Falha em detectar", name2="nivel baixo") %>%
  addLogic(at=1, type="and", name="Falha na exibicao", name2=" de nivel baixo") %>%
  addProbability(at=2, prob=0.1, name="Falha no alarme de", name2="nivel baixo (LAL - 101)") %>%
  addProbability(at=2, prob=0.1, name="Falha no alarme de", name2="nivel baixo (LAL - 102)") %>%
  addLogic(at=1, type="and", name="Falha na transmissao", name2=" de nivel") %>%
  addProbability(at=5, prob=0.1, name="Falha no transmissor", name2="de nivel (LT-101)") %>%
  addProbability(at=5, prob=0.1, name="Falha no transmissor", name2="de nivel (LT-102)") %>%
  ftree.calc()
ftree2html(ex04.2, write_file=TRUE)
Fig. 16.1: Árvore de falhas - Componentes funcionando em paralelo (redundância em baixo nível) - Nova estrutura
dbc04.2.png
Fig. 16.2: Diagrama de blocos de confiabilidade - Componentes funcionando em paralelo (redundância em baixo nível) - Nova estrutura

Agora, com o auxílio dos cortes mínimos, atingimos de maneira exata a probabilidade esperada. Em verdade, estes conjuntos apresentam duas excelentes funções:

  • A organização em conjuntos mínimos ligados diretamente ao evento-topo é um método alternativo de cálculo da probabilidade do evento-topo e fornece uma sugestão para a reorganização mais precisa da árvore;
  • A probabilidade de um cortes mínimo de ser o provocador do evento-topo, ou seja, sua medida de importância, permite observar os pontos de maior fraqueza do sistema.
note.png

Os cortes mínimos são úteis na correção de problemas estruturais das árvores, mas é preciso cuidado na análise. Verifique sempre a coerência dos cortes propostos. Estruturas muito absurdas podem produzir cortes mínimos absurdos.

Passo-a-passo detalhado

Vamos, enfim, discutir de maneira completa o procedimento de análise de uma árvore de falhas. Para tal, iremos estudar o controle de nível de líquido na torre além de outros elementos que afetam este nível.

rsm01.png
Fig. 17: Sistema de controle de nível e elementos associados

A estes elementos são associados os seguintes modos de falha:

modos <- data.frame(
  Componentes = c(rep("Fluido de aquecimento",2), rep("Controlador de vazão - FRC-104",2), "Válvula de controle (FRC-104)", "Válvula de controle (LIC-102)", "Refervedor", rep("Controlador de nível - LIC-102",2)),
  Modos = c("Temperatura do fluido é inadequada", "Vazão do fluido é inadequada", "Controlador comprometido (FRC-104)", "Ação de controle além do limite físico (FRC-104)", "Falha na válvula (FRC-104)", "Falha na válvula (LIC-102)", "Refervedor comprometido", "Controlador comprometido (LIC-102)", "Ação de controle além do limite físico (LIC-102)"),
  Distribuicao = c(rep("Exponencial",2), rep("Weibull",2), rep("Exponencial",2), "Lognormal", rep("Weibull",2)),
  Par1 = c(1, 1, 2000, 1000, 1, 1, 8, 2000, 1000),
  Par2 = c(1/1000, 0.002, 0.8, 0.8, 0.004, 0.004, 0.7, 0.8, 0.8),
  Prob = rep(NA, 9),
  MTTF = rep(NA, 9)
)

tempo <- 10 # Instante representado no estudo
modos$Prob[c(1:2,5:6)] <- 1-exp(-modos$Par2[c(1:2,5:6)]*tempo) # Prob. de falha (dist. Exponencial)
modos$Prob[c(3:4,8:9)] <- 1-exp(-(tempo/modos$Par1[c(3:4,8:9)])^(modos$Par2[c(3:4,8:9)])) # Prob. de falha (dist. Weibull)
modos$Prob[7] <- 1-pnorm((-log(tempo) + modos$Par1[7])/modos$Par2[7]) # Prob. de falha (dist. Lognormal)
modos$MTTF[c(1:2,5:6)] <- 1/modos$Par2[c(1:2,5:6)] # MTTF (dist. Exponencial)
modos$MTTF[c(3:4,8:9)] <- round(modos$Par1[c(3:4,8:9)]*gamma(1+1/modos$Par2[c(3:4,8:9)])) # MTTF (dist. Weibull) - Arredondado
modos$MTTF[7] <- round(exp(modos$Par1[7] + (modos$Par2[7]^2)/2))  # MTTF (dist. Lognormal) - Arredondado
  
colnames(modos)[c(2:6)] = c("Modos de falha", "Distribuição", "Parâmetros de localização e forma", "Parâmetros de escala e de frequência", "Prob. de falha")
Componentes Modos de falha Distribuição Parâmetros de localização e forma Parâmetros de escala e de frequência Prob. de falha MTTF
Fluido de aquecimento Temperatura do fluido é inadequada Exponencial 1 0.001 0.0099502 1000
Vazão do fluido é inadequada 0.002 0.0198013 500
Controlador de vazão - FRC-104 Controlador comprometido (FRC-104) Weibull 2000 0.800 0.0143234 2266
Ação de controle além do limite físico (FRC-104) 1000 0.0248060 1133
Válvula de controle (FRC-104) Falha na válvula (FRC-104) Exponencial 1 0.004 0.0392106 250
Válvula de controle (LIC-102) Falha na válvula (LIC-102) 0.0392106 250
Refervedor Refervedor comprometido Lognormal 8 0.700 0.0000000 3809
Controlador de nível - LIC-102 Controlador comprometido (LIC-102) Weibull 2000 0.800 0.0143234 2266
Ação de controle além do limite físico (LIC-102) 1000 0.0248060 1133
Fig. 18: Tabela de modos de falha

Para cada modo de falha dos equipamentos temos uma expressão conhecida para sua confiabilidade em função do tempo. Portanto, dado um instante qualquer podemos calcular a confiabilidade do equipamento em relação a cada falha. Analogamente podemos calcular as probabilidades de falha conforme as equações já conhecidas:

\[F(t) = 1-e^{-\lambda t}\] \[F(t) = 1-e^{ -\left (t/\beta \right )^{\alpha }}\] \[F(t) = \Phi \left ( \frac{ln t - \mu }{\sigma} \right )^{2} ; \Phi \left ( z \right ) = \frac{1}{\sqrt{2\pi z}} exp\left ( \frac{-z^{2}}{2} \right )\] Onde:

  • \(\lambda\) é o parâmetro de frequência da distribuição exponencial;
  • \(\beta\) é o parâmetro de forma e \(\alpha\) é o parâmetro de escala da distribuição Weibull;
  • \(\mu\) é o parâmetro de localização e \(\sigma\) é o parâmetro de escala da distribuição lognormal;
  • \(t\) é o intervalo de tempo passado desde o início do estudo. Foi definido como 10 dias para este estudo.

Para criar o objeto que guardará a árvore partimos do evento-topo. Para tal é preciso definir com zelo o conceito de falha do sistema (evento-topo) e indicar qual a porta lógica ligada a tal evento. Neste exemplo, o evento-topo é nível fora de especificacao e controle. As causas imediatas de falha que supomos são: nível fora de especificacao e nível fora de controle. Podemos então buscar as causas-raiz até o nível dos equipamentos e elementos em si (escopo).

# Construção da árvore
ex <- ftree.make(type="and", name="Nivel fora de", name2="especificacao e controle")
Fig. 19: Evento-topo da árvore de falhas

1ª etapa: Definição do evento-topo e do escopo de estudo - Concluída!

Devemos, agora, detalhar a combinação de eventos em cada ramo da árvore. As causas imediatas e suficientes para deixar o nível fora de especificacao são ligadas ao processo de troca de calor entre os fluidos:

  • Refervedor comprometido;
  • Problemas com o fluido aquecedor;
  • Problemas com o líquido dentro da torre.
ex <- addLogic(ex, at=1, type="or", name="Nivel fora", name2="de especificacao")
ftree2html(ex, write_file=TRUE)
Fig. 20: Árvore em construção

Temos informações sobre as duas primeiras causas, mas não sobre a última. Na ausência de dados, informação da literatura ou interesse em modelar um modo de falha, a árvore será construída sem poder de previsão dos cenários relacionados a tal falha. Esta situação é um importante lembrete das limitações e hipóteses de nossos modelos.

O comprometimento do refervedor já é um evento-base e não precisa de maior detalhamento. Já os problemas com o fluido aquecedor partem dos problemas com vazão e temperatura.

ex <- addProbability(ex, at=2, prob=modos[7,6], name="Refervedor", name2="comprometido")
ftree2html(ex, write_file=TRUE)
Fig. 21: Árvore em construção

Quando simultaneamente:

  • a vazão do fluido é inadequada (evento-base),
  • e a malha de controle de vazão é inefetiva,

então o fluido aquecedor tem problemas devido à vazão.

ex <- addLogic(ex, at=2, type="or", name="Problemas com o", name2="fluido aquecedor") %>%
  addLogic(at=4, type="and", name="Problemas com", name2="a vazao") %>%
  addProbability(at=5, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addLogic(at=5, type="or", name="Malha de controle", name2="de vazao inefetiva")
ftree2html(ex, write_file=TRUE)
Fig. 22: Árvore em construção

Quando a temperatura do fluido é inadequada (evento-base), então o fluido aquecedor tem problemas devido à temperatura. Lembre que o controlador FRC-104 está cego à temperatura do fluido de aquecimento.

ex <- addProbability(ex, at=4, prob=modos[1,6], name="Temperatura do fluido", name2="inadequada")
ftree2html(ex, write_file=TRUE)
Fig. 23: Árvore em construção

Porém, o que pode tornar a ação da malha de controle de vazão inefetiva?

Sabemos que a ação de controle parte do controlador, é transmitida para a válvula de controle e é efetuada pela mesma. A falha da válvula ou do controlador já é suficiente para que o controle não seja efetivo. Outra forma de falha ocorre quando o sinal de saída do controlador exige da válvula uma abertura além de 0% ou 100% (limites físicos). O sinal de erro continuará chegando ao controlador, mas o problema não será resolvido.

ex <- addLogic(ex, at=7, type="or", name="Falha de componentes", name2="da malha de vazao") %>%
  addProbability(at=7, prob=modos[4,6], name="Acao de controle alem", name2="do limite fisico (FRC-104)") %>%
  addProbability(at=9, prob=modos[3,6], name="Controlador FRC-104", name2="comprometido") %>%
  addProbability(at=9, prob=modos[5,6], name="Falha na", name2="valvula (FRC-104)")
ftree2html(ex, write_file=TRUE)
Fig. 24: Árvore em construção

A estrutura dos modos de falha que levam a uma ação inefetiva da malha de controle de nível é a mesma que foi discutida logo acima para a malha de vazão.

ex <- addLogic(ex, at=1, type="or", name="Nivel fora", name2="de controle") %>%
  addLogic(at=13, type="or", name="Falha de componentes", name2="da malha de nivel") %>%
  addProbability(at=13, prob=modos[9,6], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
  addProbability(at=14, prob=modos[8,6], name="Controlador LIC-102", name2="comprometido") %>%
  addProbability(at=14, prob=modos[6,6], name="Falha na", name2="valvula (LIC-102)")
ftree2html(ex, write_file=TRUE)
Fig. 25: Árvore construída

Com a árvore completa, podemos efetuar a parte inicial da análise qualitativa e calcular uma estimativa da probabilidade do evento-topo:

ex <- ftree.calc(ex)
Prob.Topo <- ex$PBF[1]
ftree2html(ex, write_file=TRUE)
Fig. 26: Evento-topo

2ª etapa: Construção da árvore de falhas - Concluída!

Adentramos, então, nas análises qualitativa e quantitativa:

# Cortes mínimos
ex_cs <- cutsets(ex)
Evento-base 1 Evento-base 2 Evento-base 3
Cortes mínimos de 2ª ordem
Corte mínimo 1 Refervedor comprometido Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 2 Controlador LIC-102 comprometido
Corte mínimo 3 Falha na valvula (LIC-102)
Corte mínimo 4 Temperatura do fluido inadequada Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 5 Controlador LIC-102 comprometido
Corte mínimo 6 Falha na valvula (LIC-102)
Cortes mínimos de 3ª ordem
Corte mínimo 7 Vazao do fluido inadequada Acao de controle alem do limite fisico (FRC-104) Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 8 Controlador LIC-102 comprometido
Corte mínimo 9 Falha na valvula (LIC-102)
Corte mínimo 10 Controlador FRC-104 comprometido Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 11 Controlador LIC-102 comprometido
Corte mínimo 12 Falha na valvula (LIC-102)
Corte mínimo 13 Falha na valvula (FRC-104) Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 14 Controlador LIC-102 comprometido
Corte mínimo 15 Falha na valvula (LIC-102)
Fig. 27: Tabela de cortes mínimos

3ª etapa: Identicação dos conjutos de corte mínimo - Concluída!

A priori, apenas observando a estrutura dos cortes mínimos notamos a onipresença dos eventos relacionados à falhas na malha de controle de nível. O que é extremamente coerente já que tal malha é diretamente responsável pela variável afetada pelo evento-topo. Ainda ignorando a informação da probabilidade de ocorrência, supomos que esse conjunto de eventos é o maior ponto-fraco do sistema.

4ª etapa: Análise qualitativa da árvore - Concluída!

Agora, estruturamos a árvore de acordo com seus cortes mínimos:

exCM <- ftree.make(type="or", name="Nivel fora de", name2="especificacao e controle") %>%
  addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 01") %>%
  addProbability(at=2, prob=modos[7,6], name="Refervedor", name2="comprometido") %>%
  addProbability(at=2, prob=modos[9,6], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 02") %>%
  addProbability(at=5, prob=modos[7,6], name="Refervedor", name2="comprometido") %>%
  addProbability(at=5, prob=modos[8,6], name="Controlador LIC-102", name2="comprometido") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 03") %>%
  addProbability(at=8, prob=modos[7,6], name="Refervedor", name2="comprometido") %>%
  addProbability(at=8, prob=modos[6,6], name="Falha na", name2="valvula (LIC-102)") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 04") %>%
  addProbability(at=11, prob=modos[1,6], name="Temperatura do fluido", name2="inadequada") %>%
  addProbability(at=11, prob=modos[9,6], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 05") %>%
  addProbability(at=14, prob=modos[1,6], name="Temperatura do fluido", name2="inadequada") %>%
  addProbability(at=14, prob=modos[8,6], name="Controlador LIC-102", name2="comprometido") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 06") %>%
  addProbability(at=17, prob=modos[1,6], name="Temperatura do fluido", name2="inadequada") %>%
  addProbability(at=17, prob=modos[6,6], name="Falha na", name2="valvula (LIC-102)") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 01") %>%
  addProbability(at=20, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addProbability(at=20, prob=modos[4,6], name="Acao de controle alem", name2="do limite fisico (FRC-104)") %>%
  addProbability(at=20, prob=modos[9,6], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 02") %>%
  addProbability(at=24, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addProbability(at=24, prob=modos[4,6], name="Acao de controle alem", name2="do limite fisico (FRC-104)") %>%
  addProbability(at=24, prob=modos[8,6], name="Controlador LIC-102", name2="comprometido") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 03") %>%
  addProbability(at=28, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addProbability(at=28, prob=modos[4,6], name="Acao de controle alem", name2="do limite fisico (FRC-104)") %>%
  addProbability(at=28, prob=modos[6,6], name="Falha na", name2="valvula (LIC-102)") %>%

  addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 04") %>%
  addProbability(at=32, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addProbability(at=32, prob=modos[3,6], name="Controlador FRC-104", name2="comprometido") %>%
  addProbability(at=32, prob=modos[9,6], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 05") %>%
  addProbability(at=36, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addProbability(at=36, prob=modos[3,6], name="Controlador FRC-104", name2="comprometido") %>%
  addProbability(at=36, prob=modos[8,6], name="Controlador LIC-102", name2="comprometido") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 06") %>%
  addProbability(at=40, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addProbability(at=40, prob=modos[3,6], name="Controlador FRC-104", name2="comprometido") %>%
  addProbability(at=40, prob=modos[6,6], name="Falha na", name2="valvula (LIC-102)") %>%

  addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 07") %>%
  addProbability(at=44, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addProbability(at=44, prob=modos[5,6], name="Falha na", name2="valvula (FRC-104)") %>%
  addProbability(at=44, prob=modos[9,6], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 08") %>%
  addProbability(at=48, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addProbability(at=48, prob=modos[5,6], name="Falha na", name2="valvula (FRC-104)") %>%
  addProbability(at=48, prob=modos[8,6], name="Controlador LIC-102", name2="comprometido") %>%
  
  addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 09") %>%
  addProbability(at=52, prob=modos[2,6], name="Vazao do fluido", name2="inadequada") %>%
  addProbability(at=52, prob=modos[5,6], name="Falha na", name2="valvula (FRC-104)") %>%
  addProbability(at=52, prob=modos[6,6], name="Falha na", name2="valvula (LIC-102)")

ftree2html(exCM, write_file=TRUE)
rsm10.png
Fig. 28: Árvore construída por cortes mínimos

Comparemos os valores de probabilidade do evento-topo calculados a partir da árvore original e da árvore composta de corte mínimos:

Prob. Topo (Árvore original) Prob. Topo (Cortes mínimos)
0.0008755 0.0009007
Fig. 29: Probabilidade do evento-topo comparada

Aparentemente a estrutura proposta originalmente para a árvore de falhas subestimou a probabilidade do evento-topo. Todavia perceba que há eventos que pertencem a múltiplos cortes mínimos. Quando isso ocorre, a árvore construída diretamente a partir dos cortes mínimos perde precisão, pois ignora a identidade dos eventos-bases durante os cálculos. Mais a frente iremos explicar como surge a imprecisão. Por hora, vamos reconstruir a árvore condensando os cortes mínimos de acordo com suas semelhanças e também nomeando os eventos intermediários necessários.

Partamos do 1º corte mínimo que contém os eventos Refervedor comprometido e Ação de controle além do limite físico (LIC-102). Sabemos que a ocorrência simultânea de todos os eventos de um corte mínimo é condição suficiente para a ocorrência do evento-topo. Ou seja, eles estão ligados a um evento intermediário, ainda indefinido, por meio de uma porta E.

rsm11.png
Fig. 30.1: Corte mínimo 1
Evento-base 1 Evento-base 2 Evento-base 3
Cortes mínimos de 2ª ordem
Corte mínimo 1 Refervedor comprometido Acao de controle alem do limite fisico (LIC-102)
Fig. 30.2: Corte mínimo 1

Agora, observando os cortes de 1 a 3, notamos que o evento Refervedor comprometido é comum a todos os conjuntos. Qualquer um dos três outros eventos que ocorrer simultaneamente com o comprometimento do refervedor leva ao evento-topo. Ou seja, os três eventos estão ligados a um evento intermediário por meio de uma porta OU. Já este evento intermediário e o comprometimento do refervedor estão ligados a outro evento intermediário.

rsm12.png
Fig. 31.1: Cortes mínimos de 1 a 3
Evento-base 1 Evento-base 2 Evento-base 3
Cortes mínimos de 2ª ordem
Corte mínimo 1 Refervedor comprometido Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 2 Controlador LIC-102 comprometido
Corte mínimo 3 Falha na valvula (LIC-102)
Fig. 31.2: Cortes mínimos de 1 a 3

Esta estrutura proposta para condensar os cortes mínimos de 1 a 3 é conveniente para explicar como é gerado um erro no cálculo da probabilidade do evento-topo advindo de cortes mínimos com eventos em comum. Inicialmente temos a estrutura condensada:

rsm13.png
Fig. 32.1: Cortes mínimos condensados

A probabilidade do evento intermediário que engloba \(P_{2}\), \(P_{3}\) e \(P_{4}\) é dada por:

\[P_{2} + P_{3} + P_{4} -P_{2}P_{3} -P_{2}P_{4} -P_{3}P_{4} +P_{2}P_{3}P_{4}\]

A probabilidade do evento-topo, enfim, é dada por:

\[P_{1}P_{2} + P_{1}P_{3} + P_{1}P_{4} -P_{1}P_{2}P_{3} -P_{1}P_{2}P_{4} -P_{1}P_{3}P_{4} +P_{1}P_{2}P_{3}P_{4}\]

Retornamos, assim, à árvore composta por cortes mínimos:

rsm14.png
Fig. 32.2: Cortes mínimos completos

As probabilidades dos eventos intermediários são: \(P_{1}P_{2}\), \(P_{1}P_{3}\) e \(P_{1}P_{4}\). Já a probabilidade do evento-topo é:

\[P_{1}P_{2} + P_{1}P_{3} + P_{1}P_{4} -P_{1}P_{2}P_{1}P_{3} -P_{1}P_{2}P_{1}P_{4} -P_{1}P_{3}P_{1}P_{4} +P_{1}P_{2}P_{1}P_{3}P_{1}P_{4}\]

Note que há as quatro últimas parcelas da soma apresentam produtos de \(P_{1}\) por si mesmo. Porém, \(P_{1} \times P_{1} = P_{1}\), pois este produto representa a interseção entre dois eventos. A interseção de um evento consigo mesmo é o próprio evento (\(P_{1} \cap P_{1} = P_{1}\)).

Se aplicarmos esta propriedade ao resultado obtido, alcançamos a mesma formulação advinda da árvore condensada:

\[P_{1}P_{2} + P_{1}P_{3} + P_{1}P_{4} -P_{1}P_{2}P_{3} -P_{1}P_{2}P_{4} -P_{1}P_{3}P_{4} +P_{1}P_{2}P_{3}P_{4}\]

Infelizmente, o pacote não é capaz de fazer a identificação necessária para corrigir esta imprecisão. Logo, somente poderemos utilizar os cortes mínimos para efetuar a análise qualitativa da árvore e corrigir sua estrutura apenas observando se existiram caminhos para a falha que não foram representados. Com a estrutura ratificada, poderemos confirmar o valor da probabilidade do evento-topo.

Retornando aos cortes mínimos, entre os de 4 a 6, percebemos que podemos sintetizar a estrutura de maneira análoga à apresentada logo acima. Ainda melhor, o trio de eventos que conduzem ao evento intermediário é o mesmo tanto nos cortes de 1 a 3 quanto nos cortes de 4 a 6. Portanto podemos aplicar a mesma lógica que utilizamos na discussão anterior e unir os eventos Refervedor comprometido e Temperatura do fluido inadequada sob um outro evento intermediário acessado por uma porta OU.

rsm15.png
Fig. 33.1: Cortes mínimos de 1 a 6
Evento-base 1 Evento-base 2 Evento-base 3
Cortes mínimos de 2ª ordem
Corte mínimo 1 Refervedor comprometido Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 2 Controlador LIC-102 comprometido
Corte mínimo 3 Falha na valvula (LIC-102)
Corte mínimo 4 Temperatura do fluido inadequada Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 5 Controlador LIC-102 comprometido
Corte mínimo 6 Falha na valvula (LIC-102)
Fig. 33.2: Cortes mínimos de 1 a 6

Deixando de lado os cortes mínimos de 2ª ordem por um instante, observemos os cortes de 3ª ordem. Para tal conjunto de cortes ocorre uma situação análoga à que acabamos de analisar.

rsm16.png
Fig. 34.1: Cortes mínimos de 7 a 15
Evento-base 1 Evento-base 2 Evento-base 3
Cortes mínimos de 23ª ordem
Corte mínimo 7 Vazao do fluido inadequada Acao de controle alem do limite fisico (FRC-104) Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 8 Controlador LIC-102 comprometido
Corte mínimo 9 Falha na valvula (LIC-102)
Corte mínimo 10 Controlador FRC-104 comprometido Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 11 Controlador LIC-102 comprometido
Corte mínimo 12 Falha na valvula (LIC-102)
Corte mínimo 13 Falha na valvula (FRC-104) Acao de controle alem do limite fisico (LIC-102)
Corte mínimo 14 Controlador LIC-102 comprometido
Corte mínimo 15 Falha na valvula (LIC-102)
Fig. 34.2: Cortes mínimos de 7 a 15

Enfim, vamos observar a árvore com todos seus conjuntos, mas somente exibindo os eventos intermediários:

rsm17.png
Fig. 35: Cortes mínimos de 1 a 15

Observe mais uma repetição na estrutura: desta vez o evento intermediário 02 está presente em duas seções da árvore. Ou seja, a ocorrência do evento intermediário 02 simultânea à ocorrência dos eventos intermediários 03 e 04 OU da ocorrência simultânea apenas do evento intermediário 01 leva ao evento-topo.

rsm18.png
Fig. 36: Cortes mínimos de 1 a 15

Alcançamos então uma organização bastante simples da árvore. Assim, podemos definir a identidade dos eventos intermediários:

  • Evento intermediário 01: Inadequação térmica ou mecânica
  • Evento intermediário 02: Malha de controle de nível inefetiva (ou Nível fora de controle)
  • Evento intermediário 03: Malha de controle de vazão inefetiva
  • Evento intermediário 04: Evento intermediário desnecessário, apenas usado para ajudar na organização
  • Evento intermediário 03-04: Inadequação hidráulica (ou Problemas com a vazão)
  • Eventos intermediários 01-03-04: Nível fora de especificação

Com a árvore completa, podemos reordená-la para verificar visualmente se algum encadeamento de eventos foi ignorado na estimativa original.

Fig. 37.1: Árvore original
Fig. 37.2: Árvore gerada a partir dos cortes mínimos

Com as duas árvores lado a lado fica claro que a estrutura original e a nova são descrições equivalentes para o sistema. Tanto que produzem o mesmo resultado para a probabilidade do evento-topo.

Por fim, temos uma estrutura corroborada para a árvore de falhas, conhecemos seus cortes mínimos e a probabilidade de ocorrência da falha do sistema. A última análise que nos resta é a avaliação dos pontos de fragilidade do sistema. Tal feito é atingido sob estudo das medidas de importância dos cortes mínimos.

# Medidas de importância (Porcentagem)
Mimp <- 100*exCM$PBF[c(2,5,8,11,14,17,20,24,28,32,36,40,44,48,52)]/exCM$PBF[1]
Evento-base 1 Evento-base 2 Evento-base 3 Medida de importância
Cortes mínimos de 2ª ordem
Corte mínimo 1 Refervedor comprometido Acao de controle alem do limite fisico (LIC-102) 0 %
Corte mínimo 2 Controlador LIC-102 comprometido 0 %
Corte mínimo 3 Falha na valvula (LIC-102) 0 %
Corte mínimo 4 Temperatura do fluido inadequada Acao de controle alem do limite fisico (LIC-102) 27.4 %
Corte mínimo 5 Controlador LIC-102 comprometido 15.82 %
Corte mínimo 6 Falha na valvula (LIC-102) 43.31 %
Cortes mínimos de 3ª ordem
Corte mínimo 7 Vazao do fluido inadequada Acao de controle alem do limite fisico (FRC-104) Acao de controle alem do limite fisico (LIC-102) 1.35 %
Corte mínimo 8 Controlador LIC-102 comprometido 0.78 %
Corte mínimo 9 Falha na valvula (LIC-102) 2.14 %
Corte mínimo 10 Controlador FRC-104 comprometido Acao de controle alem do limite fisico (LIC-102) 0.78 %
Corte mínimo 11 Controlador LIC-102 comprometido 0.45 %
Corte mínimo 12 Falha na valvula (LIC-102) 1.23 %
Corte mínimo 13 Falha na valvula (FRC-104) Acao de controle alem do limite fisico (LIC-102) 2.14 %
Corte mínimo 14 Controlador LIC-102 comprometido 1.23 %
Corte mínimo 15 Falha na valvula (LIC-102) 3.38 %

Note que se houver uma falha exatamente após 10 dias de estudo há uma chance em torno de 85% de que a falha tenha tido origem numa inadequação na temperatura do fluido que tenha ocorrido simultaneamente a uma falha na válvula da LIC-102, OU quando a ação de controle do LIC-102 foi além dos limites da válvula, OU devido a um comprometimento do LIC-102. Portanto as ações mais efetivas para impedir que o nível na destiladora se encontre fora de controle e especificação serão aquelas capazes de proteger estes componentes.

5ª etapa: Análise quantitativa da árvore - Concluída!

Ainda podemos observar a dinâmica temporal das probabilidades de cada modo de falha, corte mínimo e do evento-topo. Para tal, simplesmente precisamos transformar a variável tempo em um vetor de instantes para cada um dos quais serão feitas árvores.

points <- 50 # Nº de pontos no estudo
info <- data.frame(
  E1 = rep(NA, points),
  E2 = rep(NA, points),
  E3 = rep(NA, points),
  E4 = rep(NA, points),
  E5 = rep(NA, points),
  E6 = rep(NA, points),
  E7 = rep(NA, points),
  E8 = rep(NA, points),
  E9 = rep(NA, points),
  Etopo = rep(NA, points),
  CM01 = rep(NA, points),
  CM02 = rep(NA, points),
  CM03 = rep(NA, points),
  CM04 = rep(NA, points),
  CM05 = rep(NA, points),
  CM06 = rep(NA, points),
  CM07 = rep(NA, points),
  CM08 = rep(NA, points),
  CM09 = rep(NA, points),
  CM10 = rep(NA, points),
  CM11 = rep(NA, points),
  CM12 = rep(NA, points),
  CM13 = rep(NA, points),
  CM14 = rep(NA, points),
  CM15 = rep(NA, points),
  ECM = rep(NA, points),
  Tempo = seq(10, by = 50, length.out = points) # Instantes representados no estudo
)

Par1 <- c(1, 1, 2000, 1000, 1, 1, 8, 2000, 1000)
Par2 <- c(1/1000, 0.002, 0.8, 0.8, 0.004, 0.004, 0.7, 0.8, 0.8)

for (i in 1:points) {
  # Prob. de cada modo de falha
  info[i,c(1:2,5:6)] <- 1-exp(-Par2[c(1:2,5:6)]*info$Tempo[i]) # Prob. de falha (dist. Exponencial)
  info[i,c(3:4,8:9)] <- 1-exp(-(info$Tempo[i]/Par1[c(3:4,8:9)])^(Par2[c(3:4,8:9)])) # Prob. de falha (dist. Weibull)
  info[i,7] <- 1-pnorm((-log(info$Tempo[i]) + Par1[7])/Par2[7]) # Prob. de falha (dist. Lognormal)
  
  # Árvore de falhas
  ex_new <- ftree.make(type="and", name="Nivel fora de", name2="especificacao e controle") %>%
    addLogic(at=1, type="or", name="Nivel fora de", name2="especificacao") %>%
    addLogic(at=2, type="or", name="Inadequacao termica", name2="ou mecanica") %>%
    addProbability(at=3, prob=info[i,7], name="Refervedor", name2="comprometido") %>%
    addProbability(at=3, prob=info[i,1], name="Temperatura do fluido", name2="inadequada") %>%
    addLogic(at=2, type="and", name="Problemas com", name2="a vazao") %>%
    addProbability(at=6, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addLogic(at=6, type="or", name="Malha de controle", name2="de vazao inefetiva") %>%
    addProbability(at=8, prob=info[i,4], name="Acao de controle alem", name2="do limite fisico (FRC-104)") %>%
    addProbability(at=8, prob=info[i,3], name="Controlador FRC-104", name2="comprometido") %>%
    addProbability(at=8, prob=info[i,5], name="Falha na", name2="valvula (FRC-104)") %>%
    addLogic(at=1, type="or", name="Nivel fora de", name2="controle") %>%
    addProbability(at=12, prob=info[i,9], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
    addProbability(at=12, prob=info[i,8], name="Controlador LIC-102", name2="comprometido") %>%
    addProbability(at=12, prob=info[i,6], name="Falha na", name2="valvula (LIC-102)") %>%
    ftree.calc()
  
  # Prob. evento-topo
  info$Etopo[i] <- ex_new$PBF[1]
  
  # Árvore de falhas (c/ cortes mínimos)
  exCM <- ftree.make(type="or", name="Nivel fora de", name2="especificacao e controle") %>%
    addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 01") %>%
    addProbability(at=2, prob=info[i,7], name="Refervedor", name2="comprometido") %>%
    addProbability(at=2, prob=info[i,9], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 02") %>%
    addProbability(at=5, prob=info[i,7], name="Refervedor", name2="comprometido") %>%
    addProbability(at=5, prob=info[i,8], name="Controlador LIC-102", name2="comprometido") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 03") %>%
    addProbability(at=8, prob=info[i,7], name="Refervedor", name2="comprometido") %>%
    addProbability(at=8, prob=info[i,6], name="Falha na", name2="valvula (LIC-102)") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 04") %>%
    addProbability(at=11, prob=info[i,1], name="Temperatura do fluido", name2="inadequada") %>%
    addProbability(at=11, prob=info[i,9], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 05") %>%
    addProbability(at=14, prob=info[i,1], name="Temperatura do fluido", name2="inadequada") %>%
    addProbability(at=14, prob=info[i,8], name="Controlador LIC-102", name2="comprometido") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="2a ordem 06") %>%
    addProbability(at=17, prob=info[i,1], name="Temperatura do fluido", name2="inadequada") %>%
    addProbability(at=17, prob=info[i,6], name="Falha na", name2="valvula (LIC-102)") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 01") %>%
    addProbability(at=20, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addProbability(at=20, prob=info[i,4], name="Acao de controle alem", name2="do limite fisico (FRC-104)") %>%
    addProbability(at=20, prob=info[i,9], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 02") %>%
    addProbability(at=24, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addProbability(at=24, prob=info[i,4], name="Acao de controle alem", name2="do limite fisico (FRC-104)") %>%
    addProbability(at=24, prob=info[i,8], name="Controlador LIC-102", name2="comprometido") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 03") %>%
    addProbability(at=28, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addProbability(at=28, prob=info[i,4], name="Acao de controle alem", name2="do limite fisico (FRC-104)") %>%
    addProbability(at=28, prob=info[i,6], name="Falha na", name2="valvula (LIC-102)") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 04") %>%
    addProbability(at=32, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addProbability(at=32, prob=info[i,3], name="Controlador FRC-104", name2="comprometido") %>%
    addProbability(at=32, prob=info[i,9], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 05") %>%
    addProbability(at=36, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addProbability(at=36, prob=info[i,3], name="Controlador FRC-104", name2="comprometido") %>%
    addProbability(at=36, prob=info[i,8], name="Controlador LIC-102", name2="comprometido") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 06") %>%
    addProbability(at=40, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addProbability(at=40, prob=info[i,3], name="Controlador FRC-104", name2="comprometido") %>%
    addProbability(at=40, prob=info[i,6], name="Falha na", name2="valvula (LIC-102)") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 07") %>%
    addProbability(at=44, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addProbability(at=44, prob=info[i,5], name="Falha na", name2="valvula (FRC-104)") %>%
    addProbability(at=44, prob=info[i,9], name="Acao de controle alem", name2="do limite fisico (LIC-102)") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 08") %>%
    addProbability(at=48, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addProbability(at=48, prob=info[i,5], name="Falha na", name2="valvula (FRC-104)") %>%
    addProbability(at=48, prob=info[i,8], name="Controlador LIC-102", name2="comprometido") %>%
    
    addLogic(at=1, type="and", name="Corte minimo de", name2="3a ordem 09") %>%
    addProbability(at=52, prob=info[i,2], name="Vazao do fluido", name2="inadequada") %>%
    addProbability(at=52, prob=info[i,5], name="Falha na", name2="valvula (FRC-104)") %>%
    addProbability(at=52, prob=info[i,6], name="Falha na", name2="valvula (LIC-102)") %>%
    ftree.calc()

  # Prob. evento-topo
  info$ECM[i] <- exCM$PBF[1]
    
  # Medidas de importância (Porcentagem)
  info[i,c(11:25)] <- exCM$PBF[c(2,5,8,11,14,17,20,24,28,32,36,40,44,48,52)]
}

# Perfil temporal das prob. dos eventos-base e do evento-topo
png("plot1.png", width=960, height=700)
par(mai=c(0.90,0.90,0.45,0.45))

aux <- c(10,1:5,7)
color <- rainbow(7)
plot(info[,c(27,aux[1])], col = color[1], type = "b", ylab = "Probabilidade", ylim = c(0, 1.05), pch = 1)
lines(info[,27], rep(1,points), xaxt = "n", yaxt = "n", col = "black", lwd = 2, lty = "dashed")
for (i in 2:7) {
  lines(info[,c(27,aux[i])], xaxt = "n", yaxt = "n", col = color[i], type = "b", pch = i)
}

names <- c("Evento-topo", "Temperatura do fluido é inadequada", "Vazão do fluido é inadequada", "Controlador comprometido", "Ação de controle além do limite físico", "Falha na válvula", "Refervedor comprometido")
legend("bottomright", names, col = color, pch = 1:7)
dev.off()

# Perfil temporal das prob. das medidas de importância
png("plot2.png", width=960, height=700)
par(mai=c(0.90,0.90,0.45,0.45))

aux <- c(26,11:19,21:22,25)
color <- rainbow(13)
plot(info[,c(27,aux[1])], col = color[1], type = "b", ylab = "Probabilidade", ylim = c(0, 1.05), pch = 1)
lines(info[,27], rep(1,points), xaxt = "n", yaxt = "n", col = "black", lwd = 2, lty = "dashed")
for (i in 2:13) {
  lines(info[,c(27,aux[i])], xaxt = "n", yaxt = "n", col = color[i], type = "b", pch = i)
}

names <- c("Evento-topo CM", "Corte mínimo 01", "Corte mínimo 02", "Corte mínimo 03", "Corte mínimo 04", "Corte mínimo 05", "Corte mínimo 06", "Corte mínimo 07", "Corte mínimo 08/10", "Corte mínimo 09/13", "Corte mínimo 11", "Corte mínimo 12/14", "Corte mínimo 15")
legend("bottomright", names, col = color, pch = 1:13)
dev.off()
plot1.png
Fig. 38.1: Perfil temporal das probabilidades dos eventos-base e do evento-topo
plot2.png
Fig. 38.2: Perfil temporal das probabilidades dos cortes-mínimos e do evento-topo composto pelos CM

Leituras recomendadas

  • Exemplo simples de aplicação da análise de árvore de falhas: Anthony D. Slonim, Ebru K. Bish, Ryan S. Xie. Red Blood Cell Transfusion Safety: Probabilistic Risk Assessment and Cost/ Benefits of Risk Reduction Strategies. Annals of Operations Research;
  • Fundamentos da análise de árvore de falhas: Aven T. Reliability and risk analysis. Elsevier applied science;
  • Guia para o uso do pacote FaultTree: FaultTree User’s Tutorial. Open Reliability. http://www.openreliability.org/faulttree-users-tutorial/;
  • Guia compreensivo para a análise de árvore de falhas: Fault tree handbook. U.S. Nuclear Regulatory Commission. https://www.nrc.gov/docs/ML1007/ML100780465.pdf;
  • Guia compreensivo para a análise de árvore de falhas: Fault tree handbook with Aerospace applications. NASA Office of Safety and Mission Assurance. http://www.mwftr.com/CS2/Fault%20Tree%20Handbook_NASA.pdf.