Como migrar um modelo do @RISK, ModelRisk ou Analytic Solver
O xellstorm abre sem o suplemento uma planilha criada para @RISK, ModelRisk ou Analytic Solver, lê 164 funções de distribuição desses suplementos e transforma cada fórmula em uma entrada, com os parâmetros vinculados às células da planilha. Antes de rodar, mostra o que converteu e cada fórmula que deixou de fora, com o motivo.
Das 164 funções, 53 são do @RISK, 62 do ModelRisk e 49 do Analytic Solver. O xellstorm lê também 65 formas que definem a distribuição por percentis, além de truncamento, marcadores de saída, matrizes de correlação e tabelas de várias simulações.
O que a importação encontra em uma planilha feita para @RISK
O exemplo é a estimativa de obra do exemplo de contingência de projeto, escrita como seria um modelo feito para @RISK: cada item de custo é =RiskPert(min, most likely, max, RiskName(label)) nas células da linha, cada evento de risco é um RiskBernoulli com a probabilidade do evento, o custo total e o estouro levam RiskOutput, Estrutura e MEP são correlacionados com RiskCorrmat, três orçamentos ficam em um RiskSimtable e uma célula informa o RiskMean do total. Uma segunda aba, “Demonstrations”, traz cinco fórmulas avulsas: duas formas aritméticas que são convertidas e três fórmulas que não são. Geramos o arquivo com um script; o xellstorm não precisa do @RISK para lê-lo, e você também não.
No app, Import from workbook, na etapa Distributions, lista as fórmulas encontradas (o xellstorm import, na linha de comando, imprime a mesma lista). Nesta planilha, ele converte 12 entradas: os 6 itens de custo, os 4 eventos de risco e 2 demonstrações aritméticas. Os itens de custo e os eventos de risco mantêm os parâmetros vinculados às células: alterar um mínimo ou uma probabilidade na planilha muda a próxima simulação. RiskName(A3) dá a cada entrada o nome do texto da linha. As duas demonstrações convertidas são um sorteio Normal multiplicado por um fator e outro cuja média é calculada a partir de outra célula. Nenhuma das duas é usada pelas saídas da estimativa.
| Célula | Fórmula na planilha | Vira |
|---|---|---|
| E3 | =RiskPert(B3, | Site work: uma PERT com mín. B3 (100), mais provável C3 (120), máx. D3 (170) |
| E4 | =RiskPert(B4, | Foundation: uma PERT com mín. B4 (300), mais provável C4 (340), máx. D4 (460) |
| E5 | =RiskPert(B5, | Structure: uma PERT com mín. B5 (760), mais provável C5 (820), máx. D5 (1.010) |
| E6 | =RiskPert(B6, | MEP: uma PERT com mín. B6 (540), mais provável C6 (610), máx. D6 (780) |
| E7 | =RiskPert(B7, | Finishes: uma PERT com mín. B7 (400), mais provável C7 (450), máx. D7 (560) |
| E8 | =RiskPert(B8, | Equipment: uma PERT com mín. B8 (260), mais provável C8 (280), máx. D8 (330) |
| D11 | =RiskBernoulli(B11, | Ground conditions: uma Bernoulli com probabilidade B11 (0,25) |
| D12 | =RiskBernoulli(B12, | Design change: uma Bernoulli com probabilidade B12 (0,35) |
| D13 | =RiskBernoulli(B13, | Supplier delay: uma Bernoulli com probabilidade B13 (0,2) |
| D14 | =RiskBernoulli(B14, | Severe weather: uma Bernoulli com probabilidade B14 (0,3) |
| Demonstrations!B3 | =RiskNormal(100, | uma Normal com média 100 e desvio padrão 10, com o sorteio multiplicado por 1,1; apenas demonstração, não usada pela estimativa |
| Demonstrations!B4 | =RiskNormal(Estimate!C3*1.1, | uma Normal com média Estimate!C3*1.1 (132) e desvio padrão 10; apenas demonstração, não usada pela estimativa |
A mesma importação lê o resto do modelo:
- Saídas. As células marcadas com
RiskOutput("Total cost")eRiskOutput("Over budget")viram saídas com esses nomes. O marcador soma 0, como no @RISK, e as células calculam normalmente. - Correlação.
RiskCorrmat(Correlation,1)eRiskCorrmat(Correlation,2)colocam Structure (Estrutura) e MEP na matriz chamada Correlation, com correlação de postos de 0,6 (só o triângulo inferior está preenchido; uma célula em branco é lida pelo espelho dela na diagonal). O valor vem da matriz como a planilha a contém no momento da importação, e a importação informa isso. - Simulações. No @RISK,
RiskSimtable({2900,3000,3100})dá ao orçamento um valor por simulação. O xellstorm mantém o orçamento em 2.900 na execução-base e acrescenta os outros dois como cenários, que sorteiam os mesmos números aleatórios da execução-base e por isso diferem apenas no orçamento. - Estatísticas. Como as outras funções que devolvem resultados a uma célula,
RiskMeannão é uma distribuição e por isso não aparece entre as não convertidas. Fora do @RISK ela não tem valor (a verificação de compatibilidade indica a célula); a média aparece nos resultados do xellstorm.
As fórmulas que não são convertidas também aparecem na lista. Todas as 3 da segunda aba vêm com o motivo informado pela importação, e para cada uma há uma saída:
| Fórmula | Motivo informado | O que fazer |
|---|---|---|
=RiskBinomial(1, | várias distribuições em uma fórmula não são convertidas; dê a cada distribuição uma célula de entrada própria | Separe: uma célula =RiskBernoulli(0.3) para saber se o risco ocorre, uma =RiskTriang(20,40,80) para o impacto, e multiplique as duas em uma terceira, como fazem os eventos de risco da estimativa. |
=RISKCOMPOUND(RiskPoisson(3), | RISKCOMPOUND não tem equivalente exato no xellstorm | O xellstorm não tem distribuição composta. Modele a contagem e os valores em células próprias, ou deixe a célula fora do modelo. |
=RISKPERTALT(10%, | RISKPERTALT não tem equivalente exato no xellstorm | Informe o mínimo, o mais provável e o máximo da PERT (RiskPert), ou passe os percentis para RiskTrigen, que é convertida. |
Rodar o modelo convertido
Com a configuração importada e 5.000 iterações, o custo total médio é 2.784,7 (milhares de US$). A média exata das mesmas distribuições é 2.784,7: as médias PERT (mín. + 4 × mais provável + máx.) / 6 mais a probabilidade de cada risco vezes o impacto. O erro padrão da média simulada é 1,7. Estrutura e MEP chegam a uma correlação de postos de 0,60. Os três orçamentos do RiskSimtable, rodados como a base e dois cenários:
| Execução | Orçamento | Chance de ultrapassar |
|---|---|---|
| Execução-base (simulação 1) | 2.900 | 17,7% |
| Simulation 2 | 3.000 | 5,2% |
| Simulation 3 | 3.100 | 0,7% |
Quanto maior o orçamento, menos vezes ele estoura. E como os cenários sorteiam os mesmos números da execução-base, a diferença entre as linhas vem do orçamento, não da amostragem.
Os resultados serão iguais aos do suplemento?
O modelo é o mesmo; os números aleatórios, não. Cada regra da importação liga uma função à distribuição que ela descreve, com os parâmetros convertidos como o fornecedor documenta, e é testada contra a distribuição equivalente do scipy. O script que gera os dados de teste também confere a média de cada mapeamento com a fórmula documentada pelo fornecedor. Por isso, quando todas as distribuições de uma planilha são convertidas, as médias e os percentis diferem dos do suplemento por ruído amostral, que diminui conforme você roda mais iterações: o erro padrão acima dá a ordem de grandeza esperada para a média.
As correlações são de postos, como o @RISK e o Analytic Solver as definem, e o xellstorm chega à correlação de postos pedida. Cada ferramenta tem o seu jeito de parear os sorteios para chegar lá, então um modelo correlacionado pode diferir um pouco mais nas caudas do que só o ruído amostral explica. A planilha não é alterada: o xellstorm lê o arquivo, e o modelo continua abrindo no suplemento.
O que é convertido
- Distribuições e argumentos aritméticos. Uma distribuição pode aparecer sozinha ou com um multiplicador positivo seguido de, no máximo, um deslocamento somado ou subtraído:
RiskNormal(B1*1.1,B2)*C1+5e5+C1*RiskNormal(B1,B2)são convertidas. Argumentos, multiplicadores e deslocamentos aceitam números, referências a uma única célula, parênteses e+,−,*,/. Nomes definidos que apontam para uma célula viram o endereço dela. Essas expressões continuam vinculadas e são avaliadas depois de aplicadas as células fixas de cada cenário; toda referência precisa ser determinística. As funções marcadas com † na tabela também convertem, mas só com números. - Formas por percentis. As funções
…Alte…AltDdo @RISK e as funções…Altdo Analytic Solver (as da tabela abaixo) definem a distribuição por percentis; o xellstorm resolve a distribuição de forma exata ao rodar e informa um erro quando nenhuma distribuição, ou mais de uma, se ajusta a eles. - Truncamento e deslocamento.
RiskTruncate,RiskTruncate2,RiskTruncateP,RiskShift,VoseXBounds,VosePBounds,VoseShift,PsiTruncate,PsiTruncatePePsiShift, aplicados na ordem documentada por cada suplemento. Multiplicadores e deslocamentos de fora da distribuição entram depois e aparecem separados nas configurações da entrada. - Nomes e travas.
RiskName,PsiNameeVoseInputdão nome à entrada;RiskLocka trava em um único valor. O catálogo também lista propriedades ignoradas (Static, Units, Category, Collect, Base, Seed, IsDiscrete, IsDate, Fit, FitInfo, Certify, BaseCase, Library e SixSigma, com o prefixo do fornecedor).RiskSeedgera um aviso: as configurações de fluxo aleatório dela não são preservadas, e quem controla os sorteios são a semente da simulação e a ordem das entradas do xellstorm. - Saídas.
RiskOutput,VoseOutput,PsiOutputePsiSimOutputmarcam saídas. No Analytic Solver, uma estatística comoPsiMean(B1)também faz de B1 uma saída, e no xellstorm acontece o mesmo. - Correlações e simulações.
RiskCorrmat,RiskDepCcomRiskIndepC,PsiCorrMatrix,PsiCorrDepencomPsiCorrIndep;RiskSimtable,VoseSimTableePsiSimParam. - Fórmulas do próprio Excel.
NORM.INV(RAND(), mean, sd),RANDBETWEEN,IF(RAND() < p, 1, 0)e outras: 18 formas desse tipo no total, listadas abaixo.
O que não é convertido
Várias distribuições em uma célula, uma distribuição dentro de outra função ou em um denominador, divisão direta de uma distribuição e cadeias que exigem mudar a ordem das operações não são convertidas. Por exemplo, (RiskNormal(0,1)+5)*2 e RiskNormal(0,1)*2*3 ficam de fora, com o motivo. RiskNormal(0,1)*(1/C1) é convertida quando C1 resulta em um multiplicador positivo e finito, porque a fórmula calcula o inverso explicitamente antes de multiplicar. Também ficam sem conversão multiplicadores que dão zero ou menos, argumentos que chamam funções ou dependem de células aleatórias, funções sem equivalente exato (distribuições compostas, funções de série temporal, RiskPertAlt e as outras formas por percentis com dois parâmetros de forma), o argumento U e as cópulas do ModelRisk e propriedades que não estão na tabela. O motor de cálculo não consegue calcular uma fórmula de suplemento não convertida; a verificação de compatibilidade indica qual é.
Funções compatíveis
As tabelas vêm da própria lista de regras do importador, então mostram exatamente o que ele converte. “Percentis” marca as formas que definem a distribuição por percentis; † marca as funções que só convertem com números. Abaixo de cada distribuição está o nome dela nas especificações do xellstorm.
| Distribuição (nome no xellstorm) | @RISK | ModelRisk | Analytic Solver |
|---|---|---|---|
Bernoullibern | RiskBernoulli | VoseBernoulli | PsiBernoulli |
Betabeta | RiskBetaRiskBetaGeneralRiskBetaSubj† | VoseBetaVoseBeta4VoseBetaSubj† | PsiBetaPsiBetaGenPsiBetaSubj† |
Binomialbinom | RiskBinomial | VoseBinomial | PsiBinomial |
Burr XIIburr12 | RiskBurr12 | — | — |
Cauchycauchy | RiskCauchyPercentis: RiskCauchyAltRiskCauchyAltD | VoseCauchy | — |
Qui-quadradochi2 | RiskChiSqPercentis: RiskChiSqAltRiskChiSqAltD | VoseChiSq | PsiChiSquarePercentis: PsiChiSquareAlt |
Qui, Maxwellchi | — | VoseChiVoseMaxwell | — |
Cumulativacumul | RiskCumulRiskCumulD† | VoseCumulAVoseCumulD†VoseOgive† | PsiCumul |
Dagum (Burr III)burr | RiskDagum | VoseDagum | PsiDagum |
Discretacustom | RiskDiscreteRiskDUniform | VoseDiscreteVoseDUniform | PsiDiscretePsiDisUniform |
Exponencialexpon | RiskExponPercentis: RiskExponAltRiskExponAltD | VoseExponVoseExponential | PsiExponentialPercentis: PsiExponentialAlt |
Valor extremo (máx., Gumbel)gumbel_r | RiskExtValuePercentis: RiskExtValueAltRiskExtValueAltD | VoseExtValueMax | PsiMaxExtremePercentis: PsiMaxExtremeAlt |
Valor extremo (mín.)gumbel_l | RiskExtValueMinPercentis: RiskExtValueMinAltRiskExtValueMinAltD | — | PsiMinExtremePercentis: PsiMinExtremeAlt |
Ff | RiskF | VoseF | PsiFDist |
Vida em fadiga (Birnbaum–Saunders)fatiguelife | RiskFatigueLifePercentis: RiskFatigueLifeAltRiskFatigueLifeAltD | VoseFatigue | PsiFatigueLifePercentis: PsiFatigueLifeAlt |
Fréchetinvweibull | RiskFrechetPercentis: RiskFrechetAltRiskFrechetAltD | — | PsiFrechetPercentis: PsiFrechetAlt |
Gama, Erlanggamma | RiskGammaRiskErlangPercentis: RiskGammaAltRiskGammaAltD | VoseGammaVoseErlang | PsiGammaPsiErlangPercentis: PsiGammaAlt |
Geral (pesos relativos)general | RiskGeneral | VoseRelative | — |
Pareto generalizadagenpareto | — | VoseGPD | — |
Histogramahistogram | RiskHistogrm | VoseHistogram | PsiHistogram |
Secante hiperbólicahypsecant | RiskHypSecantPercentis: RiskHypSecantAltRiskHypSecantAltD | VoseHS | PsiHypSecant |
Hipergeométricahypergeom | RiskHypergeo | VoseHypergeo | PsiHyperGeo |
Uniforme inteirarandint | RiskIntUniform | VoseIntUniformVoseStepUniform† | PsiIntUniform |
Gaussiana inversainvgauss | RiskInvgaussPercentis: RiskInvgaussAltRiskInvgaussAltD | VoseInvGauss | PsiInvNormal |
Johnson SBjohnsonsb | RiskJohnsonSB | VoseJohnsonB | PsiJohnsonSB |
Johnson SUjohnsonsu | RiskJohnsonSU | VoseJohnsonU | PsiJohnsonSU |
Kumaraswamykumaraswamy | RiskKumaraswamy | VoseKumaraswamyVoseKumaraswamy4 | PsiKumaraswamy |
Laplacelaplace | RiskLaplacePercentis: RiskLaplaceAltRiskLaplaceAltD | VoseLaplace | — |
Lévylevy | RiskLevyPercentis: RiskLevyAltRiskLevyAltD | VoseLevy | PsiLevyPercentis: PsiLevyAlt |
Log-logísticafisk | RiskLogLogisticPercentis: RiskLogLogisticAltRiskLogLogisticAltD | VoseLogLogistic | PsiLogLogisticPercentis: PsiLogLogisticAlt |
Logísticalogistic | RiskLogisticPercentis: RiskLogisticAltRiskLogisticAltD | VoseLogistic | PsiLogisticPercentis: PsiLogisticAlt |
Lognormallognorm | RiskLognormRiskLognorm2Percentis: RiskLognormAltRiskLognormAltD | VoseLognormalVoseLognormalE | PsiLogNormalPsiLognormPsiLognorm2Percentis: PsiLogNormalAlt |
Binomial negativa, geométricanbinom | RiskGeometRiskNegbin | VoseGeometricVoseNegBinVoseNegBinomVosePolya† | PsiGeometricPsiNegBinomial |
Normalnorm | RiskNormalRiskErf†Percentis: RiskNormalAltRiskNormalAltD | VoseNormalVoseErf† | PsiNormalPsiErf†Percentis: PsiNormalAlt |
Paretopareto | RiskParetoPercentis: RiskParetoAltRiskParetoAltD | VosePareto | PsiParetoPercentis: PsiParetoAlt |
Pareto II (Lomax)lomax | RiskPareto2Percentis: RiskPareto2AltRiskPareto2AltD | VosePareto2 | PsiPareto2Percentis: PsiPareto2Alt |
Pearson V (gama inversa)invgamma | RiskPearson5Percentis: RiskPearson5AltRiskPearson5AltD | VosePearson5 | PsiPearson5Percentis: PsiPearson5Alt |
Pearson VI (beta prima)betaprime | RiskPearson6 | VosePearson6 | PsiPearson6 |
PERTpert | RiskPert | VosePERTVoseModPERT | PsiPert |
Poissonpoiss | RiskPoisson | VosePoisson | PsiPoisson |
Rayleighrayleigh | RiskRayleighPercentis: RiskRayleighAltRiskRayleighAltD | VoseRayleigh | PsiRayleighPercentis: PsiRayleighAlt |
Recíproca (log-uniforme)loguniform | RiskReciprocal | VoseReciprocal | PsiReciprocal |
t de Studentt | RiskStudentPercentis: RiskStudentAltRiskStudentAltD | VoseStudentVoseStudent3† | PsiStudentPercentis: PsiStudentAlt |
Triangulartriang | RiskTriang | VoseTriangle | PsiTriangular |
Triangular a partir de percentis (Trigen)trigen | RiskTrigenPercentis: RiskTriangAlt | VoseTriangleAlt | PsiTriangGen |
Uniformeunif | RiskUniformPercentis: RiskUniformAltRiskUniformAltD | VoseUniform | PsiUniform |
Weibullweibull_min | RiskWeibullPercentis: RiskWeibullAltRiskWeibullAltD | VoseWeibullVoseWeibull3 | PsiWeibullPercentis: PsiWeibullAlt |
| Fórmula | xellstorm |
|---|---|
=NORM.INV(RAND(), | norm (loc, scale) |
=NORMINV(RAND(), | norm (loc, scale) |
=mean + sd*NORM.S.INV(RAND()) | norm (loc, scale) |
=LOGNORM.INV(RAND(), | lognorm (mu, sigma) |
=LOGINV(RAND(), | lognorm (mu, sigma) |
=GAMMA.INV(RAND(), | gamma (a, scale) |
=GAMMAINV(RAND(), | gamma (a, scale) |
=BETA.INV(RAND(), | beta (a, b) |
=BETA.INV(RAND(), | beta (a, b, min, max) |
=BETAINV(RAND(), | beta (a, b, min, max) |
=BINOM.INV(n, | binom (n, p) |
=CRITBINOM(n, | binom (n, p) |
=RANDBETWEEN(a, | randint (min, max) |
=a + (b - a)*RAND() | unif (min, max) |
=a + s*RAND() | unif (loc, scale) |
=RAND() | unif |
=IF(RAND() < p, | bern (p) |
=IF(RAND() < p,† | custom (x, prob) |
| Função | Suplemento | Vira no xellstorm |
|---|---|---|
RiskTruncate | @RISK | Truncamento: truncate_min, truncate_max (antes de qualquer deslocamento) |
RiskTruncate2 | @RISK | Truncamento: truncate_min, truncate_max dos valores deslocados (movidos de volta pelo deslocamento) |
RiskTruncateP | @RISK | Truncamento: truncate_pmin, truncate_pmax (percentis da distribuição) |
RiskShift | @RISK | Deslocamento: shift |
RiskName | @RISK | Nome: o nome da entrada |
RiskLock | @RISK | Trava: um valor fixo (RiskLock(v), ou o valor de RiskStatic) |
RiskCorrmat | @RISK | Correlação: correlações de postos entre as entradas de uma matriz |
RiskDepC | @RISK | Correlação: correlação de postos com a entrada de mesmo nome do par |
RiskIndepC | @RISK | Correlação: correlação de postos com a entrada de mesmo nome do par |
RiskSimtable | @RISK | Um valor por simulação: uma célula fixa na execução-base, um cenário por simulação adicional |
RiskOutput | @RISK | Saída: uma saída, com o nome informado |
VoseXBounds | ModelRisk | Truncamento: truncate_min, truncate_max (antes de qualquer deslocamento) |
VosePBounds | ModelRisk | Truncamento: truncate_pmin, truncate_pmax (percentis da distribuição) |
VoseShift | ModelRisk | Deslocamento: shift |
VoseInput | ModelRisk | Nome: o nome da entrada |
VoseSimTable | ModelRisk | Um valor por simulação: uma célula fixa na execução-base, um cenário por simulação adicional |
VoseOutput | ModelRisk | Saída: uma saída, com o nome informado |
PsiTruncate | Analytic Solver | Truncamento: tipo 1 (o padrão): truncate_min, truncate_max antes de qualquer deslocamento; -1: dos valores deslocados; 3: truncate_pmin, truncate_pmax |
PsiTruncateP | Analytic Solver | Truncamento: truncate_pmin, truncate_pmax (percentis da distribuição) |
PsiShift | Analytic Solver | Deslocamento: shift |
PsiName | Analytic Solver | Nome: o nome da entrada |
PsiCorrMatrix | Analytic Solver | Correlação: correlações de postos entre as entradas de uma matriz |
PsiCorrDepen | Analytic Solver | Correlação: correlação de postos com a entrada de mesmo nome do par |
PsiCorrIndep | Analytic Solver | Correlação: correlação de postos com a entrada de mesmo nome do par |
PsiSimParam | Analytic Solver | Um valor por simulação: uma célula fixa na execução-base, um cenário por simulação adicional |
PsiOutput | Analytic Solver | Saída: uma saída, que é a própria célula ou as células a que ela se refere |
PsiSimOutput | Analytic Solver | Saída: uma saída, que é a própria célula ou as células a que ela se refere |
PsiMean | Analytic Solver | Estatística: a célula do primeiro argumento vira uma saída (como em toda estatística Psi de uma saída) |
Perguntas
Preciso ter @RISK, ModelRisk ou Analytic Solver instalado?
Não. O xellstorm lê as fórmulas direto do arquivo .xlsx e calcula o modelo no navegador, com o motor de cálculo próprio, sem Excel nem suplemento. Salve antes os arquivos .xls e .xlsb como .xlsx.
O xellstorm altera a minha planilha?
Não. A importação transforma as fórmulas em entradas da configuração do xellstorm e não grava nada no arquivo do seu computador, então o modelo continua abrindo e rodando no suplemento.
O que acontece com uma matriz de correlação?
Entradas que compartilham um intervalo RiskCorrmat ou PsiCorrMatrix recebem as correlações de postos da matriz, lidas das células dela na importação; RiskDepC e PsiCorrDepen emparelham uma entrada com a de mesmo nome. Pares ilegíveis (uma matriz que não é quadrada, uma posição fora dela, uma célula sem número) aparecem nas notas da importação, e uma entrada não convertida é listada com o motivo e fica de fora dos pares dela. Se a matriz não for uma matriz de correlação válida, o xellstorm aplica a mais próxima que seja válida, e o app mostra essa matriz antes de rodar.
O que um RiskSimtable vira?
O primeiro valor fica na célula na execução-base, e cada valor seguinte vira um cenário, com o nome Simulation 2, Simulation 3 e assim por diante. Os cenários sorteiam os mesmos números aleatórios da execução-base, então a diferença entre eles vem apenas dos valores da tabela.
@RISK, ModelRisk e Analytic Solver são marcas de seus respectivos titulares. O xellstorm não tem afiliação com eles; os nomes das funções aparecem aqui apenas para dizer o que o xellstorm lê.
Veja também
- Custo e cronograma de projetos
Quanta contingência um projeto de construção precisa?
Exemplo prático: os custos mais prováveis da estimativa de uma obra são superados em 94,2% dos resultados simulados. Dimensione a contingência de custos de construção com Monte Carlo. - Guia
Simulação de Monte Carlo no Excel, com ou sem suplemento
Três formas de rodar uma simulação de Monte Carlo em um modelo do Excel: RAND() e uma tabela de dados, um suplemento ou uma ferramenta no navegador, sem suplemento. Fórmula PERT incluída. - Guia
Distribuição PERT no Excel: fórmula, média e quando usar
Uma PERT é uma distribuição beta do mínimo ao máximo, com média (mín. + 4 × mais provável + máx.)/6. A fórmula BETA.INV do Excel e PERT x triangular.
O xellstorm é uma ferramenta de simulação de Monte Carlo para modelos do Excel, que roda no navegador: sem suplemento, e o arquivo nunca sai do seu computador.