Aula 5 Como gerar amostras de uma distribuição qualquer a partir de sua CDF e de um gerador de números aleatórios? Processo de chegada: o Chegadas em grupo ocorrem segundo um processo Poisson com taxa . O tamanho do grupo é uma variável aleatória discreta Assuma que possa ser estimada para . o Se uma simulação se inicia no instante ZERO e queremos programar a próxima chegada do grupo, qual o tamanho do grupo neste instante? o Quando uma determinada pessoa da fila é colocada em serviço, sabendo que o serviço é dado por uma variável aleatória com conhecida (gráfica ou analiticamente), qual o serviço a ser alocado a essa pessoa? Veremos que amostra de uma variável aleatória poderá sempre ser gerada com uso de um gerador de números pseudoaleatórios e com a inversa da função . Precisaremos, para isso, de estudar as funções de variáveis aleatórias. 1 Funções de Variáveis Aleatórias Assuma que é uma variável aleatória com e Queremos obter a pdf e a CDF de , tal que função qualquer. conhecidos. , onde é uma O que isso quer dizer? Se é uma amostra de X, então é uma amostra de . Além disso, e também Como obter ? . Resposta: 3 passos. I II ( III ) ( ) Observe que [ ] ∫ [ ∫ ] que é o Teorema Fundamental da Esperança. ⇒ Os 3 passos permitem relacionar as pdf’s de e . Exemplos (outros existem na apostila): a) ⇒ { { (√ ) √ } (√ ) ( √ } (√ ) ⁄ ) √ (√ ) 2 b) Lembrar que é uma função não decrescente e que tende a 1. Então, . ( ) Ou seja, Y é uma variável aleatória com Distribuição Uniforme entre 0 e 1. Y é a uniforme unitária, representada por . Sabemos que e que e . No caso acima, e e . Como pode ser obtido com um gerador de números aleatórios entre 0 e 1, , então, dado , . 3 Graficamente, Como obter uma amostra de X qualquer? Obtenha amostra da uniforme unitária U(0,1) com uso de um gerador pseudo-aleatório [qualquer linguagem de programação fornece uma chamada de função – RAND() ou RANDOM() – que retorna um valor aleatório entre 0 e 1 (pseudo-aleatório, como veremos mais adiante)]. Faça a inversa, calculando graficamente ou algoritmicamente. , analiticamente, 4 Exemplo: Amostra da exponencial Então, dado amostra de U(0,1): Observação: Na prática, é também um valor aleatório, de modo que podemos calcular a amostra de X com Distribuição Exponencial com taxa como: economizando uma operação de subtração. 5 Exemplo: Amostra de uma geométrica Observação: ∑ ∑ ∑ ∑ ⏟ Recordando Progressão Geométrica… 6 Obtenha Para amostra de U(0,1) = RAND() , determine inteiro, tal que ( ⌈ ) ⌉ Atenção: O valor de q varia entre 0 e 1, de forma que Dividir por força a inversão do sinal da inequação! ⌈ ⌉ é negativo. é também uma uniforme! Retorne 7 Os procedimentos vistos se aplicam a qualquer variável aleatória, seja ela discreta, contínua ou mista. Exemplo: Exponencial Truncada Muito simples gerar a amostra de uma v.a. qualquer! Fazer a inversa é a única dificuldade! 8 Exponencial truncada Algoritmo U = RAND(); Se U , retorna x=a; Se U , retorna x=b; Caso contrário, retorna x = -(ln(1-U))/ . (neste caso não pode eliminar a subtração!) 9 Interessante uso da CDF: 1 1 ∫ ( 2 2 ∫ [ ] ) ∫ ( ) ∫ Ver prova na página 49 da apostila, seção 13.1. _________ 10 Geração de números pseudo-aleatórios Referência: ver apostila (capítulo 16), capítulo 3 Knuth (69), etc. Como gerar uma seqüência de números que se repetem num determinado ciclo – daí a denominação de pseudo – e que seguem uma aparente aleatoriedade? Método Básico: Exemplo: Período de oito! Gerador Congruencial c=0, b=9, Z0 = 1 1 2 3 4 5 6 7 8 9 1 9 17 25 33 41 49 57 1 9 81 153 225 297 369 441 513 9 9 17 25 33 41 49 57 1 9 Você acha que estes números parecem ser aleatórios? Sempre crescentes. Não parece. O gerador depende da escolha dos parâmetros. Para m primo e escolha adequada de b produz período de (m-1). IBM 1360 palavra de 32 bits, 1 bit de sinal (maior inteiro primo) Pacote SIMSCRIPTH II (pacote estatístico) Trabalho dos estatísticos e não nosso! Para gerar um número aleatório entre 0 e 1 faz-se o período de m-1. , se temos 11 Lembrar que a seqüência pseudo-aleatória é totalmente determinística. Com precisão estendida em máquinas de 32 ou 64 bits o período é enorme. S0 semente inicial S0 repete no final do período SRAND(S0) função para fixar a semente inicial RAND() retorna próximo número (dependendo da linguagem pode ser no intervalo 0 e 1 ou não, sendo necessário dividir pelo módulo utilizado. Veja a definição da função geradora). Fixar a semente serve para garantir que estamos percorrendo uma parte determinada da seqüência pseudo-aleatória. Se quiser percorrer seqüências distintas uso sementes bastante afastadas, que garantem independência de comportamento estatístico. S0 S1 S0 12