61
Uso de linguagens de programação. Dr. Héliton R. Tavares Assistentes: Paulo Germano Sousa, Robinson Ortega Meza

Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Uso de linguagens de programação.

Dr. Héliton R. Tavares

Assistentes: Paulo Germano Sousa, Robinson Ortega Meza

Page 2: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Programação no Excel (VBA)O ambiente VBAAlguns códigos simples com InputBox, MsgBox e CondicionalUso do CELLSStringsSomas e LoopsAlgumas funções no VBAGeração de números aleatóriosCategorizando ou discretizando variáveisMontando uma distribuição de frequênciasOrganizando macros em sub-macros ou funçõesÁreas e Probabilidades

Programação no R

Programação no Python

Page 3: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Programação no Excel (VBA): Orientações gerais

1. Já vimos que podemos fazer simulações usando geração denúmeros aleatórios no Suplementos Análise de Dados e comFórmulas, tal como ALEATORIO() e ALEATORIOENTRE().

2. Em muitas situações é mais conveniente elaborar macros(códigos) no ambiente do Visual Basic for Applications (VBA),dentro do Excel.

3. Para abrir o ambiente deve-se inicialmente pressionarsimultaneamente as teclas ALT e F11 (esta ação é geralmenterepresentada por ALT+F11).

4. Com o ambiente aberto, simplesmente aperte F7 para iniciar oambiente de digitação, ou clique sobre umas das planilhas(Plan1, por exemplo) e escolha a opção “exibir código".

5. As células do Excel são olhadas como uma matriz M(i , j)

6. A Figura a seguir apresenta o layout do editor em que vocêdigitará sua macro.

Page 4: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Editor Excel-VBA

Figura: Editor de VBA

Page 5: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

ObservaçõesAlgumas sugestões ou cuidados na elaboração de uma macro são:(a) Quando quisermos colocar observações na macro, devemos

usar aspas simples (’) no início da observação.(b) Normalmente devemos definir o tipo de variável antes de

iniciar, mas vamos deixar esta etapa para quando necessário.(c) É frequente em probabilidade a repetição de um experimento n

vezes, por isso o uso de Loops é corriqueiro, particularmentedo For ... Next.

(d) Estruturas alternativas de loops são While ... Wend e Do... Loop.

(e) Também é frequente a verificação de uma condição, com o usode IF ... Then. A estrutura IF ... Then ... Else é um poucomais complexa, necessitando ser concluída com um End If

(f) Toda vez que formos acumular ou contar valores em umavariável, esta deve ser zerada antes de iniciar a operação. Porexemplo, com o comando Soma = 0 ou Cont = 0.

Page 6: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Observações

(g) Para solicitar a digitação de uma informação, use C=InputBox("Digite um caracter"), onde C é a variável quereceberá o conteúdo digitado.

(h) Para apresentarmos na tela várias parcelas, o símbolo & devesepará-los.

(i) Podemos gerar valores dentro das células da planilha Excel.Para isso, podemos usar a referência [A1]=2, por exemplo, ouusamos o comando =cells(i,j), onde i e j são, respectivamentea linha e a coluna da planilha. Por exemplo, B3 equivale acells(3,2) (ver Figura).

(j) Se quisermos obter ou colocar um conteúdo em uma célula daplanilha Plan1, basta usarmos Sheets("Plan1").Cells(i,j)

(k) Se desejar colocar vários comandos na mesma linha, bastasepará-los por dois pontos (:). Por exemplo, a = 1 : b = 5: c = 10

Page 7: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Planilha-Matriz

Figura: Visual matricial da planilha do Excel

Page 8: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Exemplos de códigos

A seguir serão apresentados alguns exemplos de macros. Evitaremoscolocar acentos nas palavras, pois ao copiarmos uma macro de umarquivo pdf, os caracteres acentuados (ou o ç) podem dar origem aoutros caracteres. No entanto, todas estarão disponíveis emwww.helitontavares.com/computacional/MacrosVBA.txt

Exemplo (Solicitando uma informação)Elabore uma macro para solicitar um número e imprimir na telauma mensagem.

1 Sub Informacao()2 C = InputBox("Digite um caracter")3 MsgBox "Voce digitou o caracter " & C4 End Sub

Page 9: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Uso do If

ExemploElabore uma macro para solicitar um número e verificar se ele éigual a 1, imprimindo na tela uma mensagem.

1 Sub Teste1()2 C = InputBox("Digite um numero")3 If C = 1 Then MsgBox "Voce digitou o caracter 1!!!"4 End Sub

Page 10: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Uso do If

Na macro anterior nenhuma mensagem será apresentada se fordigitado um número diferente de 1. Podemos alterá-la paraapresentar uma mensagem em qualquer caso.

1 Sub Teste2()2 C = InputBox("Digite um numero")3 If C = 1 Then4 MsgBox "Voce digitou o caracter 1!!!"5 Else6 MsgBox "Voce nao digitou o caracter 1!!!" & " Voce digitou o " & C7 End If8 End Sub

Page 11: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Menor de 2 números

ExemploElabore uma macro para solicitar dois números e indicar qual é omenor deles.

1 Sub Menor1()2 Dim x, y As Integer3 x = InputBox("Digite o primeiro numero")4 y = InputBox("Digite o segundo numero")5 If x < y Then6 MsgBox "O menor numero e' o " & x7 Else8 MsgBox "O menor numero e' o " & y9 End If

10 End Sub

Observação: Vale ressaltar que em alguns casos é importante declarar o tipo devariável (Dim x, y As Integer), pois se o VBA identificar como texto (string), oresultado da condição x < y pode se inverter.

Page 12: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

O menor de 3 números

1 Sub Menor4()2 Dim x, y, z As Integer3 x = InputBox("Digite o primeiro numero")4 y = InputBox("Digite o segundo numero")5 z = InputBox("Digite o terceiro numero")6

7 Menor = x ' Passo 18 If y < Menor Then Menor = y ' Passo 29 If z < Menor Then Menor = z ' Passo 3

10

11 MsgBox "O menor número é o " & Menor12 End Sub

Page 13: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Uso do CELLS

Em muitas situações temos que ler não apenas três, mas um conjunto bem maior devalores. O Excel funciona como uma matriz denominada CELLS (células), em quepodemos obter seus valores sabendo-se a linha e coluna. Para uso do CELLS (oucells), as colunas de referência (A,B,C , · · · ) terão suas letras substituídas pornúmeros (A ≡ 1,B ≡ 2, · · · ). Por exemplo, o elemento B3 equivale a cells(3, 2). Parapoucas células, podemos usar diretamente a referência usual, tipo [B3]=10.

ExemploElabore uma macro para ler as células A1 : A10 e indicar qual é o menor deles.

1 Sub Menor5()2 Menor = Cells(1, 1) ' leu o elemento A13 For i = 2 To 104 If Cells(i, 1) < Menor Then Menor = Cells(i, 1) ' lê mais um elemento5 Next6 [A12]="Menor" : [B12]=Menor ' Colocar o menor na célula B12.7 MsgBox "O menor numero e' o " & Menor8 End Sub

Page 14: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Uso do CELLS

Naturalmente o código anterior pode ser facilmente adaptado paraindicar qual é o máximo de um conjunto de dados.

ExemploElabore uma macro para ler as células A1 : A10 e indicar qual é omaior deles.

ObservaçãoAntes, crie valores no intervalo [A1:A10] usando o ALEATORIOENTRE(1,100).

1 Sub Maior1()2 Maior = Cells(1, 1) ' leu o elemento A13 For i = 2 To 104 If Cells(i, 1) > Maior Then Maior = Cells(i, 1) ' lê mais um elemento5 Next6 MsgBox "O maior numero e' o " & Maior7 End Sub

Page 15: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Inserindo informações nas Células

Ao invés de ler o elemento da célula, você pode colocar o elementona célula. Vejamos um exemplo:

ExemploElabore uma macro para colocar os números 1 a 10 nas células A1a A10 da planilha.

1 Sub Gera10()2 For i = 1 To 103 Cells(i, 1) = i4 Next5 End Sub

Page 16: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Mesclando Strings

Também podemos mesclar números e string (texto), usando ooperador & para juntá-los. Vejamos um exemplo:

1 Sub Gera10()2 For i = 1 To 103 Cells(i, 1) = "Eu sou nota " & i4 Next5 End Sub

Page 17: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Substrings: Left, Right, Mid e Len

Também podemos retirar, substituir etc., partes de um string:

1 Sub Parte()2 Nome = InputBox("Digite o seu nome completo")3 MsgBox "Numero total de caraceres: " & Len(Nome)4 MsgBox "Os 10 caracteres da esquerda sao: " & Left(Nome, 10)5 MsgBox "Os 10 caracteres da direita sao: " & Right(Nome, 10)6 MsgBox "Os 10 caracteres do meio, comecando no terceiro sao: " & Mid(Nome, 3, 10)7 MsgBox "O t está na posicao " & InStr(Nome, "t")8 MsgBox "Duplicando o t: " & Replace(Nome, "t", "tt")9 End Sub

Page 18: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Somas e Loops

Uma outra situação extremamente frequente é a obtenção de somas de variáveis, emgeral através de loops. Vale ressaltar que a variável que será usada para acumular talsoma sempre deve ser zerada antes do início do loop. Vejamos um exemplo.

1 Sub SomaPA()2 n=10 : Soma = 03 For i = 1 To n4 Cells(i, 1) = Soma + i5 Next6 End Sub

Page 19: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Reordenando

É frequente a situação em que temos que pegar parte de um conjunto de números ereorganizá-los de outra forma. Por exemplo, na região [A1:J10] temos uma matriz10×10 e desejamos ler os elementos da diagonal principal e colocar na coluna L.

ExemploElabore uma macro para ler os elementos da matriz em [A1:J10] e colocar na coluna L.

1 Sub Diagonal()2 n = 103 For i = 1 To n4 Cells(i,12) = Cells(i, i)5 Next6 End Sub

ObservaçãoCrie valores no intervalo [A1:J10] usando o ALEATORIOENTRE(1,10).

Page 20: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Exemplos de funções no Excel

A Tabela abaixo apresenta algumas exemplos de funçõesmatemáticas usadas no VBA.

Função Descriçãox^y Retorna o número x elevado a ySQR(x) Retorna a raiz quadrada de xx MOD y Retorna o resto da divisão e x por yLOG10(x) Retorna o log neperiano de x na base 10LOG(x) Retorna o log neperiano de x em uma base especificadaABS(x) Retorna o valor absoluto de xCOS(x) Retorna o cosseno de x em radianosSIN(x) Retorna o seno de x em radianosCOS(x*Application.Pi()/180) Retorna o cosseno de x em grausSIN(x*Application.Pi()/180) Retorna o seno de x em grausINT(x) Retorna a parte inteira de xFACT(x) Retorna o fatorial de xSGN(x) Retorna o sinal de x (-1 ou +1)

Page 21: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Exercícios

ExercícioElabore uma macro para solicitar um número n e construir as seguintes quantidades:

S1 =n∑

k=1

k, S2 =n∑

k=1

k2, S3 =n∑

k=1

k3 S4 =n∑

k=1

k4,

lembrando que o "^" serve para exponenciação no VBA, e apresentando as respectivasmensagens. Verifique se as fórmulas I e II de PA e PG estão corretas.

ExercícioElabore uma macro para colocar nas células:i) A1:A10: números 1 a 10ii) B1:B10: o dobro dos números na coluna Aiii) C1:C10: o quadrado dos números na coluna Aiv) D1:D10: valores da coluna A acumuladosv) E1:E10: valores da coluna C acumuladosvi) F1: soma dos valores da coluna A (

∑ni=1 Xi , n = 10)

vii) F2: soma dos valores da coluna C (∑n

i=1 X2i )

viii) F3: média dos valores da coluna A, por X = 1n

∑ni=1 Xi

ix) F4: variância dos valores da coluna A, por Var(X ) = 1n

∑ni=1 X

2i − X

2

x) F5: desvio-padrão dos valores da coluna A, por DP(X ) =√

Var(X )

Page 22: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Exercícios

ObservaçãoÉ frequente usarmos o conceito de Momentos Amostrais de Ordem k da variávelX , definidos por

MX ,k =1n

n∑i=1

X k .

Neste caso temos que E(X ) = MX ,1 e Var(X ) = MX ,2 −M2X ,1. Algumas vezes usa-se

o Momentos Amostrais de Ordem k em torno de X , definido porM′

X ,k = 1n

∑ni=1(X − X )k e neste caso temos que Var(X ) = M′

X ,2. Se não houverrisco de confusão, a denominação da variável será retirada da notação, ficando Mk eM′

k respectivamente.

ExercícioElabore uma macro para, com os valores quaisquer de A1:A10:i) Obter o mínimo, colocar em D1ii) Obter o máximo, colocar em D2iii) Ordenar a coluna A em ordem crescente, colocar em B1:B10.iv) Ordenar a coluna A em ordem decrescente, colocar em C1:C10.

Page 23: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Exercícios

ExercícioElabore uma macro para, com os valores quaisquer de A1:A1000:i) Construir a Amplitude Total: Xmax − Xmin.ii) Construir o Desvio Médio: DM = 1

n

∑ni=1 |Xi − X |.

iii) Construir o Desvio Médio Absoluto: DM = 1X

∑ni=1 |Xi − X |.

iv) Construir o Primeiro Quartil (Q1), ou seja, 25% estão abaixo dele.v) Construir o Segundo Quartil (Q2), que é a Mediana (Md), com 50% abaixo dela.vi) Construir o Terceiro Quartil (Q3), ou seja, 75% estão abaixo dele.vii) Construir a Amplitude Semi-Interquartílica (ou Desvio-Quartílico):

DQ =Q3 − Q1

2.

viii) Construir o Percentil de Ordem k = 10, 25, 50, 75, 90 (Obs.:P25 = Q1, P50 = Q2, P75 = Q3)ix) Construir a Moda (valor mais frequente, se houver).x) Construir o Coeficiente de Assimetria de Pearson: CAP = (X −Md)/Sxi) Construir o Coeficiente de Assimetria de Bowley: CAB = (Q1 + Q3 − 2Md)/S

xii) Construir o Coeficiente de Curtose: K =Q3 − Q1

2(P90 − P10).

xiii) Construir o Coeficiente de Variação (ou Dispersão Relativa): CV = S/X

Page 24: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Exercícios

ExercícioElabore uma macro para, com n = 10 valores quaisquer em A1:A10 e B1:B10,representando duas variáveis X e Y , obter:

i) os primeiros Momentos Amostrais de X e Y , dados por MX ,1 e MY ,1(simplificando, MX e MY ), e os desvios-padrão de X e Y .

ii) a soma dos produtos cruzados: SXY =∑n

i=1 xiyi

iii) a média dos produtos: MXY = SXY /n

iv) o Coeficiente de Covariância, dado por Cov(X ,Y ) = MXY −MXMY

v) o Coeficiente de Correlação, dado por Corr(X ,Y ) =Cov(X ,Y )

DP(X )DP(Y )

Page 25: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Geração de números aleatórios

I No VBA a função RND(), ou simplesmente RND, simula uma observação deuma U(0, 1), com resultado restrito a [0,1), ou seja, ele pode até ser nulo, masnunca será igual a 1.

I Na planilha do Excel a fórmula equivalente ao RND() é o =ALEATORIO().

Função Notação

1 =ALEATÓRIO() U(0, 1)2 =ALEATÓRIO()*5+10 U(5, 10)3 =INV.NORMP(ALEATÓRIO()) N(0, 1)4 =INV.NORM(ALEATÓRIO();10;5) N(10, 52)5 =INV.QUI(ALEATÓRIO();5) χ(5)6 =INVT(ALEATÓRIO();5) t(5)7 =INVF(ALEATÓRIO();3;5) F (3, 5)8 =INVGAMA(ALEATÓRIO();1;1) Exp(1)9 =INVGAMA(ALEATÓRIO();5;1) Gama(5, 1)

10 =INVLOG(ALEATÓRIO();0;1) LN(0, 1)

Tabela: Exemplos das principais funções de geração de dados no Excel

Page 26: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Média de uma U(0,1)

ExemploElabore uma macro para acumular (somar) n observações de uma X ∼ U(0, 1) edepois apresentar na tela o valor médio. Use n = 10000.

1 Sub MacroMedia()2 n = 100003 Soma = 04 For i = 1 To n5 x = Rnd()6 Soma = Soma + x7 Next8 MsgBox "Media = " & Soma / n9 End Sub

Na teoria, a média (também chamado de Valor Esperado) de uma v.a. X ∼ U(a, b) é

o ponto médio do intervalo, ou seja, (a+ b)/2, neste caso igual a 1/2, pois a = 0 e

b = 1.

Page 27: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Variância de uma UniformeExemploComplemente a macro anterior para calcular a Variância dos valores gerados, usando afórmula já apresentada: Var(X ) = 1

n

∑ni=1 X

2i − X

2= M2 −M2

1 . (Obs:Var(X ) = E(X 2)− [E(X )]2.)

1 Sub MacroMediaVar()2 n = 10000003 Soma1 = 0 : Soma2 = 04 For i = 1 To n5 x = Rnd()6 Soma1 = Soma1 + x7 Soma2 = Soma2 + x ^ 28 Next9

10 Media = Soma1 / n11 Variancia = Soma2/n - Media ^ 212

13 MsgBox "Media = " & Media14 MsgBox "Variancia = " & Variancia15

16 End Sub

A variância teórica é Var(X ) = (b − a)2/12, que neste caso dá 1/12 ' 0, 0833.

Page 28: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Dicotomizando

ExemploElabore uma macro para gerar observações de uma X ∼ U(0, 1) e transformá-las emBernoullis Y de parâmetro p = 0.3, apresentando ao final o valor médio destasBernoullis. Use n = 10000.

Este procedimento consiste simplesmente em gerar variáveis X ∈ [0, 1] e usar a regra:se X ≤ p, então Y = 1; se X > p, adotamos Y = 0. Dessa forma os eventos {Y = 1}e {X ≤ p} são equivalentes, e daí P(Y = 1) = P(X ≤ p) = p.

1 Sub Macrobernoulli()2 n = 10000 : p = 0.33 Soma = 04 For i = 1 To n5 If Rnd() < p Then6 x = 17 Else8 x = 09 End If

10 Soma = Soma + x11 Next12 MsgBox "Media = " & Soma / n13 End Sub

Page 29: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Gerando Bernoullis(p)

ObservaçãoO comando IF foi usando para gerar observações da Bernoulli de parâmetro p.Alternativamente, poderíamos usar M1 = (Rnd() > p) + 1 ou -(Rnd() < p) ouainda abs((Rnd() < p)). A expressão (Rnd() < p) gera um Falso (0) ouVerdadeiro (-1), por isso devemos transformá-lo, bastando colocar o sinal negativo ouAbs à frente de (Rnd() < p). A macro anterior seria reescrita da seguinte forma:

1 Sub Macrobernoulli2()2 n = 10000 : p = 0.33 Soma = 04 For i = 1 To n5 x = Abs(Rnd() < p)6 Soma = Soma + x7 Next8 MsgBox "Media = " & Soma / n9 End Sub

ExercícioAdapte o código para obter a variância e compare o resultado com a teórica: p(1− p)

Page 30: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Média e Variância da U(a,b)

ExemploElabore uma macro para gerar observações de uma variável X ∼ U(0, 1),transformá-la em uma Y ∼ U(a, b), com a e b, através da fórmula Y = (b − a)X + ae depois apresentar na tela o valor médio e variância de Y . Use n = 1000, a = 10 eb = 30. [Obs: E(Y ) = (a+ b)/2 e Var(X ) = (b − a)2/12]

1 Sub MacroUab()2 n = 100003 a = 10 : b = 304 Soma = 05 For i = 1 To n6 x = Rnd()7 y = (b - a) * x + a8 Soma = Soma + y9 Next

10 MsgBox "Média = " & Soma / n11 End Sub

ExercícioAdapte o código para obter a variância e compare o resultado com a teórica.

Page 31: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Exponencial(λ)

ExemploElabore uma macro para gerar observações de uma variável X ∼ U(0, 1), transformá-laem uma Exponencial com parâmetro λ através da fórmula Y = − 1

λln(1−X ) e depois

apresentar na tela o valor médio de Y . Use n = 1000 e λ = 0.1.

1 Sub DistExp()2 n = 100003 lambda = 0.14 Soma = 05 For i = 1 To n6 x = Rnd()7 y = -1 / lambda * Log(1 - x)8 Soma = Soma + y9 Next

10 MsgBox "Media = " & Soma / n11 End Sub

ExercícioAdapte o código para obter a variância e compare o resultado com a teórica: 1/λ2.

Page 32: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

N(0,1)

ExemploElabore uma macro para gerar observações de X ∼ U(0, 1) e Y ∼ U(0, 1), etransformá-las em N(0, 1) através das fórmulas Z =

√−2 ln(X ) cos(2πY ) e

W =√−2 ln(X )sen(2πY ). Apresente na tela os valores médios de Z e W . Use

n = 10000.

1 Sub SomaNormais()2 n = 100003 Pi = 4 * Atn(1) ' Também gera o valor de Pi = 3,14159 26535 89793 ...4 SomaZ = 0: SomaW=05 For i = 1 To n6 x = Rnd() : y = Rnd()7 Z = Sqr(-2 * Log(x)) * Cos(2 * Pi * y)8 w = Sqr(-2 * Log(x)) * Sin(2 * Pi * y)9 SomaZ = SomaZ + Z

10 SomaW = SomaW + W11 Next12 MsgBox "Média de Z = " & SomaZ / n & "; Média de W = " & SomaW / n13 End Sub

ExercícioAdapte o código para obter a variância e compare o resultado com a teórica: 1

Page 33: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Categorizando ou discretizando variáveis

Um procedimento muito frequente é pegar um número e associar a uma determinadacategoria ou intervalo. Na prática estamos discretizando essa variável. Vejamosabaixo.

ExemploElabore uma macro para gerar uma observação de uma X ∼ U(0, 1) e transformá-lasem um Uniforme discreta em {1, 2, · · · , 10}. Em suma, estamos discretizando umavariável.

A função int(x) trunca (arredonda pra baixo) o valor x . Com isso, 10 ∗ x transformaráinicialmente os valores da U(0, 1) em U(0, 10), e a função int(10 ∗ x) transformará em0, 1, · · · , 9, de forma que precisamos somar 1 a estes números para obter 1, 2, · · · , 10.

1 Sub Discretiza()2 x = Rnd()3 y = Int(10 * x) + 14 MsgBox "Valores gerados e transformados: " & x & " " & y5 End Sub

Page 34: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Categorizando ou discretizando variáveis

Na Estatística é muito frequente categorizar uma variável X que observamos, tal comoo peso, criando uma outra variável Y que representa o início, centro ou final dosintervalos desejados, ou simplesmente adotando os valores inteiros 1,2,· · · .

ExemploCrie 20 observações de uma N(250, 502) no Excel com o comando=INV.NORM(ALEATÓRIO();250;50); na célula ao lado coloque a função=INT(C1/10)*10, expanda para as outras 19 células e você verá que os valores dãopulos de 10 em 10, e são o limite inferior do intervalo. Se você adotar=INT(C1/10)*10+10/2, você terá novos valores, que são os centros dos intervalos.Troque o 10 por 20 e veja que os intervalos agora são de 20 em 20.

ExercícioElabore uma macro para gerar uma observações de uma X ∼ U(0, 1000) etransformá-las em um Uniforme discreta em {10, 11, 12, · · · , 30}.

ExercícioElabore uma macro para gerar observações de uma X ∼ U(50, 100) e transformá-lasem um Uniforme discreta em {10, 13, 16, · · · , 31}.

Page 35: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

O problema dos AniversáriosExercícioElabore uma macro para responder à seguinte pergunta: se selecionarmos r = 23pessoas ao acaso, qual a probabilidade de pelo menos duas fazerem aniversário nomesmo dia do ano? Considere que há 365 dias. Use n = 10000.Esta situação consiste apenas em gerar o nascimento de r = 23 indivíduo no intervalo1, 2, · · · , 365. Agora verifique se algum número se repetiu (coincidência). Para estimara probabilidade, esse processo deve ser repetido um número grande de vezes (n), everificando a proporção de ocorrências de coincidências.

1 Sub Aniversarios()2 Dim F(365) As Integer3 n = 10000: dias = 365: r = 234 C = 05 For i = 1 to n6 Coincidiu = 07 For k = 1 to r8 x = Rnd()9 y = Int(dias * x) + 1 'Gera um número inteiro entre 1 e 365 (dias)

10 F(y) = F(y) + 1 'Gera a frequência ao dia11 Next1213 For y = 1 to dias14 If F(y) >= 2 Then Coincidiu = 115 F(y) = 016 Next1718 If Coincidiu = 1 Then C = C + 119 Next20 MsgBox "Probabilidade aproximada: " & C / n21 End Sub

Page 36: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

O problema dos Aniversários

ExercícioComplemente o exercício anterior (Aniversários) de forma a termos o resultado paravalores de r = 10, 11, · · · , 60. Insira os resultados em células do Excel. Plot umgráfico da probabilidade (y) como função de r (x).

ExercícioImagine uma cidade com muitos gêmeos, tipo Cândido Godói (RS), em que 10% dosparto são de gêmeos (2 bebês), 5% são de trigêmeos, 2,5% são de quadrigêmeos.Qual a probabilidade de coincidência em uma turma escolar com r crianças (23, 30,40, 50, 60)?

Page 37: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

O bandido e as 3 portasExemploUm bandido é preso em uma cela que contém 3 portas. A primeira porta o leva a umtúnel que o conduz à própria cela depois de 2 dias de viagem. A segunda porta leva-oa um túnel que o conduz à própria cela depois de 4 dias de viagem. A terceira porta oconduz à liberdade depois de um dia de viagem. Se assumimos que o bandidoseleciona as portas 1, 2 e 3 com probabilidades 0.5, 0.3 e 0.2 respectivamente, qual onúmero esperado de dias para que alcance a liberdade?

1 Sub Prisioneiro()2 n = 100000: p1 = 0.5: p2 = 0.3: dias = 03 For i = 1 To n4 saida = 0: 'Inicio do jogo5 While saida = 06 x = Rnd()7 If x < p1 Then dias = dias + 2 'porta = 18 If x > p1 And x < p1 + p2 Then dias = dias + 4 'porta = 29 If x > p1 + p2 Then dias = dias + 1: saida = 1 'porta = 3

10 Wend11 Next MsgBox "Estimativa do tempo médio para saída: " & dias / n12 End Sub

ExercícioQual a distribuição aproximada de T , o número dias até a liberdade?

Page 38: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

João, José e a moeda equilibradaExemploJoão e José disputam um jogo com uma moeda equilibrada. Cada jogador lança amoeda duas vezes e vence o jogo aquele que obtiver dois resultados iguais. Joãocomeça jogando e, se não vencer, passa a moeda para José e, continuam assim,alternando as jogadas, até alguém vencer. A namorada de José desconfia dahonestidade do jogo e reclama que João tem mais probabilidade de vitória por iniciar ojogo. Por outro lado, a namorada de João diz que isso é besteira pois, como o númerode jogadas pode ser infinito, tanto faz quem começa jogando. Quem tem razão?

1 Sub JoaoJose()2 n = 1000000: p = 0.5: Joao = 03 For i = 1 To n4 pare = 0: conta = 0 'Inicio do jogo5 While pare = 06 conta = conta + 17 M1 = Abs(Rnd() < p) 'Moeda 18 M2 = Abs(Rnd() < p) 'Moeda 29 If (M1 + M2 <> 1) Then pare = 1 'Pára se der 0 ou 2

10 Wend11 If conta Mod 2 = 1 Then Joao = Joao + 1 'Verifica se é impar12 Next13 MsgBox "Estimativa da Probabilidade: " & Joao / n14 End Sub

Qual a distribuição aproximada de T , o número jogadas realizadas?

Page 39: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Circuitos

ExercícioNo circuito abaixo a probabilidade de que cada um dos quatro relés esteja fechado ép. Se todos funcionares independentemente, qual será a probabilidade θ(p) de que aenergia passe da esquerda (L) para a direita (R)? [θ(p) = 2p2 − p4]

L R1 2

3 4

Vamos criar Bernoullis(p) para cada relé indicando se está aberto ou fechado. Paraque haja energia entre L e R devemos ter {R1 = 1}

⋂{R2 = 1}, que equivale a

{R1 ∗ R2 = 1}. Da mesma forma, podemos ter {R3 ∗ R4 = 1}, ou ambas. Podemossintetizar dizendo que que L↔ R se {R1 ∗ R2+ R3 ∗ R4 ≥ 1} (Cond. Sucesso)

1 Sub circuito()2 n = 1000000 : p = 0.2 : conta = 03 For i = 1 To n4 R1 = Abs(Rnd() < p)5 R2 = Abs(Rnd() < p)6 R3 = Abs(Rnd() < p)7 R4 = Abs(Rnd() < p)8 If (R1 * R2 + R3 * R4 >= 1) Then conta = conta + 19 Next

10 MsgBox "Estimativa da Probabilidade: " & conta / n11 End Sub

Page 40: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Outros Circuitos

ExercícioComplemente o exercício anterior de forma a termos o resultado para valores dep ∈ (0, 1) com incremento (step) p = 0.01. Faça um gráfico da probabilidade (y)como função de p (x).

ExercícioNos circuitos abaixo a probabilidade de que cada um dos relés esteja fechado é p.Considerando que todos funcionam independentemente, obtenha a probabilidade deque a energia passe da esquerda (L) para a direita (R). Construa um programa paraestimar essas funções de probabilidade.

Page 41: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Gerando Multinomial(p1, ..., pn)ExemploElabore uma sintaxe para gerar uma observação de uma Multinomial, assumindo ovalor 1 com prob. 0,5, o valor 2 com prob. 0,3 e o valor 3 com prob. 0.2.

1 Sub MacroMult()2 n = 100003 p1 = 0.5: p2 = 0.3: p3 = 0.24 Cont1 = 0: Cont2 = 0: Cont3 = 05 For i = 1 To n6 p = Rnd()7 If p < p1 Then8 x = 19 Cont1 = Cont1 + 1

10 ElseIf p < p1 + p2 Then11 x = 212 Cont2 = Cont2 + 113 Else14 x = 315 Cont3 = Cont3 + 116 End If17 Next18 MsgBox "Media1 = " & Cont1 / n & ", Media2 = " & Cont2 / n19 End Sub

Page 42: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Simplificando a sintaxe

Alternativamente, podemos estender a técnica de indicadores e usar funções do tipoAbs(RND < p) ou Abs(RND > p) ou Abs(RND > p And RND < q) para construir umaúnica função que substitua os If-Then-Else usados na macro anteriores. Vejamos oexemplo a seguir.

ExemploElabore uma macro para gerar observações Y ∼ Multinomial(p1, p2, p3), comp1 = 0, 5, p2 = 0, 3 e p3 = 0, 2, colocando-as na coluna A da planilha.

1 Sub MacroMult2()2 Dim F(3) As Integer3 n = 100004 p1 = 0.5: p2 = 0.3: p3 = 0.25 For i = 1 To n6 p = Rnd()7 x = 1 * Abs(p < p1) + 2 * Abs(p > p1 And p < p1 + p2) + 3 * Abs(p > p1 + p2)8 F(x) = F(x) + 19 Cells(i , 1) = x

10 Next11 MsgBox "Media1 = " & F(1) / n & ", Media2 = " & F(2) / n12 End Sub

Page 43: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Montando uma distribuição de frequências

ExemploElabore uma macro para gerar n observações de uma X ∼ U(0, 1), definir K = 10intervalos (por exemplo [0;0,1], (0,1; 0,2], ..., (0,9;1]) e contar quantas observaçõescaem em cada intervalo. Em suma, elaborar uma Tabela de Frequência de X . Usen = 1000.

Uma forma de elaborar esta macro é discretizando as observações no intervalo{1, 2, · · · , 10}, que são índices do vetor F.

1 Sub Freq()2 Dim F(10) As Integer3 n = 10004 For i = 1 To n5 x = Rnd()6 y = Int(10 * x) + 17 F(y) = F(y) + 18 Next9 For i = 1 To 10

10 MsgBox "Frequencia na classe " & i & ": " & F(i)11 Next12 End Sub

Page 44: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Distribuição de frequênciaExemploElaborar uma macro para construir uma distribuição de frequência criando uma matrizque conterá os limites superiores dos intervalos, e use X ∼ U(−2, 2). Leia os limitesde uma planilha (B2:BK, onde K é o número de classes) e coloque as frequênciasrelativas obtidas na mesma planilha com o comando cells(linha,coluna).

1 Sub FreqInt()2 Dim F(10, 2) As Single3 K = InputBox("Introduza o Número de classes:")4 n = 100005 For j = 1 To K6 F(j, 1) = Cells(j + 1, 2)7 Next8 For i = 1 To n9 y = Rnd() * 4 - 2

10 For j = 1 To K11 If (y < F(j, 1)) Then F(j, 2) = F(j, 2) + 112 Next13 Next14 For j = 1 To K15 Cells(j + 1, 3) = F(j, 2) / n16 Next17 MsgBox "Concluído!"18 End Sub

Page 45: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Organizando macros em sub-macros ou funçõesA subdivisão de uma macro em várias menores pode facilitar a compreensão damesma, embora exija maiores cuidados. Se o resultado da submacro for um valor,podemos chamá-la de função, com algumas particularidades. Uma função recebe umou mais argumentos e calcula um valor. Vamos refazer a macro anterior usando umasub-macro que será repetida para cada réplica dentro da macro mãe.

1 Sub Amostra(k)2 n = 5:3 Soma1 = 0: Soma2 = 04 For i = 1 To n5 x = Rnd()6 Soma1 = Soma1 + x7 Soma2 = Soma2 + x ^ 28 Next9 M1 = Soma1 / n ' Momento Amostral de ordem 1

10 M2 = Soma2 / n ' Momento Amostral de ordem 211 Cells(k, 1) = M1: Cells(k, 2) = M2 - M1 ^ 212 End Sub

1 Sub EstimativasU01()2 r = 100003 For k = 1 To r4 Amostra(k)5 Next6 End Sub

Page 46: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Observação: Estimador Viesado (Viciado)

Note que a estimativa média deve estar bem próxima do verdadeiro valor (teórico)E(X ) = 1

2 . No entanto, a estimativa média para a variância deve estar um tantoabaixo do valor teórico Var(X ) = 1

12 . Multiplique o valor obtido por n/(n − 1) e vocêterá uma proximidade bem melhor, sem viés. Isso ocorreu porque na fórmula davariância adotada dividimos por n, e para construir um estimador melhor devemosdividir por n − 1. Neste caso dizemos que o estimador é não viesado (ou não viciado).Naturalmente, para valores grandes de n não fará diferença relevante dividir por n oupor n − 1, por isso nesse caso a variância amostral viesada (dividindo-se por n) deveráser um bom estimador da verdadeira variância populacional.Agora faça a distribuição de frequência e veja o comportamento (distribuição) dos doisestimadores: média amostral e variância amostral não-viesada, dados pelas fórmuasabaixo:

X =1n

n∑i=1

Xi e S2 =1

n − 1

n∑i=1

(Xi − X )2.

Page 47: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Funções (Retornam números)

ExemploConstruir uma rotina com o uso de funções para calcular C(n, k) = n!/(k!(n − k)!)

1 Function Fatorial(k)2 Fatorial = 13 For i = 1 To k4 Fatorial = Fatorial * i5 Next6 End Function

1 Function combinacao(n1, k1)2 combinacao = Fatorial(n1) /(Fatorial(k1) * Fatorial(n1 - k1))3 End Function

1 Sub calculacomb()2 n = InputBox("Insira um número n")3 k = InputBox("Insira um número k")4 MsgBox "C(" & n & "," & k & ") = " & combinacao(n, k)5 End Sub

Page 48: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Função dos Aniversários

1 Function PAniversarios(r) 'Vai retornar uma probabilidade com r indivíduos2 Dim F(365) As Integer3 n = 1000: dias = 365: C = 04 For i = 1 To n5 Coincidiu = 06 For k = 1 To r7 x = Rnd()8 y = Int(dias * x) + 1 'Gera um número inteiro entre 1 e 365 (dias)9 F(y) = F(y) + 1 'Gera a frequência ao dia

10 Next11 For y = 1 To dias12 If F(y) >= 2 Then Coincidiu = 113 F(y) = 014 Next15 If Coincidiu = 1 Then C = C + 116 Next17 PAniversarios = C / n18 End Function

1 Sub FuncaoAniversario()2 For r = 1 To 603 Cells(r, 1) = r4 Cells(r, 2) = PAniversarios(r)5 Next6 End Sub

Page 49: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Função de Confiabilidade (Circuitos)

1 Function PCircuito(p)2 n = 1000000: conta = 03 For i = 1 To n4 R1 = Abs(Rnd() < p)5 R2 = Abs(Rnd() < p)6 R3 = Abs(Rnd() < p)7 R4 = Abs(Rnd() < p)8 If (R1 * R2 + R3 * R4 >= 1) Then conta = conta + 19 Next

10 PCircuito = conta / n11 End Function

1 Sub FuncaoCircuito()2 lin = 1 'Linha inicial3 For p = 0 To 1 Step 0.014 Cells(lin, 1) = p5 Cells(lin, 2) = PCircuito(p)6 lin = lin + 17 Next8 End Sub

Page 50: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Aleatorização (Shuffle)

Em diversas situações na Estatística há necessidade de aleatorizar um conjunto de nnúmeros, ou seja, obter uma permutação aleatória destes. Essa operação éfrequentemente denominada de shuffle. Um bom algoritmo pode ser obtido emhttp://en.wikipedia.org/wiki/Fisher-Yates_shuffle.

ExemploMonte um algoritmo para ler um conjunto de n números da coluna A e criar umapermutação aleatória, colocando-a na coluna B.

1 Sub Permuta()2 Dim Ordem() As Integer3 n = 54 ReDim Ordem(n)5 For i = 1 To n: Ordem(i) = Cells(i, 1): Next 'Faz a leitura dos números6 For i = 1 To n7 j = Int(i + (n - i + 1) * Rnd())8 temp = Ordem(i)9 Ordem(i) = Ordem(j)

10 Ordem(j) = temp11 Cells(i, 2) = Ordem(i)12 Next13 End Sub

Page 51: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Áreas e Probabilidades

ExercícioConsidere um quadrado com x ∈ [0, 1] e y ∈ [0, 1]. Sorteando um ponto (x , y) aoacaso, qual a probabilidade deste ponto cair no triângulo inferior do quadrado (áreahachurada)?

1 Sub Triangulo()2 n = 100000: Conta = 03

4 For i = 1 To n5 x = Rnd()6 y = Rnd()7 If x > y Then Conta = Conta + 18 Next9 MsgBox "Probabilidade = " & Conta / n

10

11 End Sub

Page 52: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Saindo do Quadrado [0,1]2

ObservaçãoQuando necessário, usaremos a seguinte notação de região: x ∈ [a, b] e y ∈ [c, d ],então teremos o retângulo = [a, b]× [c, d ]. Ainda, quando a região for quadrada, talcomo = [a, b]× [a, b], usaremos = [a, b]2.

ObservaçãoComo já visto em diversas situações, se gerarmos um valor x no intervalo (0,1), entãoa transformação (b − a)x + a passará a ter valores no intervalo (a, b).

ExercícioConsidere um retângulo = [0, 1]× [0, 2]. Sorteando um ponto (x , y) ao acaso, qual aprobabilidade deste ponto cair na área em que x < y?

Page 53: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Probabilidade de cair no círculo

ExercícioConsidere um quadrado = [−1, 1]2. Sorteando um ponto (x , y) ao acaso em , qual aprobabilidade deste ponto cair dentro do círculo unitário?

Esta probabilidade pode ser calculada diretamente pela relação entre as áreas docírculo de raio 1, que é π, e a do quadrado [−1, 1]2, que é 4. Portanto, aprobabilidade desejada será π/4 = 0, 785, aproximadamente. Para a simulação, vamosgerar pontos bidimensionais (x , y) ∈ R2, com Condição de Sucesso (CS): x2 + y2 < 1

1 Sub Circulo()2 n = 100000: Conta = 03 For i = 1 To n4 x = Rnd(): x = 2 * x - 15 y = Rnd(): y = 2 * y - 16 r = Sqr(x ^ 2 + y ^ 2)7 If (r < 1) Then Conta = Conta + 1 ' Condição de Sucesso8 Next9 MsgBox "Probabilidade = " & Conta / n

10

11 End Sub

Page 54: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Probabilidade de cair na Esfera

ExemploRepita o exemplo anterior considerando uma esfera de raio 1 dentro de um cubo delado 2, e conte a proporção de pontos que cairá na esfera.

Este cálculo também pode ser feito exatamente pela relação entre o volume da esfera( 43π) e o volume do cubo de lado 2 (23 = 8), resultando em π/6 ≡ 0, 5236,

aproximadamente. Note que no espaço R3 temos que gerar pontos tridimensionais(x , y , z).

1 Sub Esfera()2 n = 10 ^ 7: Conta = 03 For i = 1 To n4 x = Rnd(): x = 2 * x - 15 y = Rnd(): y = 2 * y - 16 Z = Rnd(): Z = 2 * Z - 17

8 r = Sqr(x ^ 2 + y ^ 2 + Z ^ 2)9 If (r < 1) Then Conta = Conta + 1

10 Next11 MsgBox "Probabilidade = " & Conta / n12 End Sub

Page 55: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Aproximando uma integral

ExercícioElabore uma macro para gerar n observações de uma X ∼ U(0, 1) e Y ∼ U(0, 1).Verifique se elas estão dentro da região A definida pelas funções f (x) = 0 ef (x) = x2, x ∈ (0, 1), contando qual a proporção de pontos que caem em A.

1 Sub Integral()2 n = 1000003 Conta = 04 For i = 1 To n5 x = Rnd()6 y = Rnd()7 f = x ^ 28 If y < f Then Conta = Conta + 1 ' Está abaixo da função9 Next

10 MsgBox "Probabilidade = " & Conta / n11 End Sub

Page 56: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Função Quadrática em [0;2]

ExemploElabore uma macro para obter uma aproximação para a integral def (x) = x2, x ∈ (0, 2).

Claramente essa integral resulta em 8/3. Notemos que x ∈ (0, 2) e f (x) ∈ (0, 4), deforma que devemos considerar a área do retângulo que engloba a função f no intervalodesejado, isto é, [0, 2]× [0, 4], que tem área Q = 8.

1 Sub Integral()2 n = 1000003 Q = 8 ' área do quadrado [0,2]x[0,4]4 Conta = 05 For i = 1 To n6 x = Rnd() * 2 'Intervalo [0,2]7 y = Rnd() * 4 'Intervalo [0,4]8 f = x ^ 29 If y < f Then Conta = Conta + 1 '(Condição de Sucesso)

10 Next11 P = Conta / n ' Proporção da área do retângulo [0,2]x[0,4] ocupada pela f.12 MsgBox "Integral = " & P * Q13 End Sub

Page 57: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Função Normal unidimensional

ExemploElabore uma macro para obter uma aproximação para a integral def (x) = exp{−x2}, x ∈ (−4, 4).Essa integral não tem solução analítica, mas quando integramos em toda reta (usandocoordenadas polares), pode-se mostrar que dá

√2π ' 2, 507. O máximo ocorre em

x = 0, com f (0) = 1.

1 Sub Integral()2 n = 1000003 Q = 8 ' área do quadrado [-4,4]x[0,1]4 Conta = 05 For i = 1 To n6 x = Rnd() * 8 - 4 'Intervalo [-4,4]7 y = Rnd() 'Intervalo [0,1] (poderia ser 0.4)8 f = Exp(-(x ^ 2) / 2)9 If y < f Then Conta = Conta + 1 '(Condição de Sucesso)

10 Next11 P = Conta / n ' Proporção da área do retângulo [-4,4]x[0,1] ocupada pela f.12 MsgBox "Integral = " & P * Q13 End Sub

Page 58: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Área Normal (Probabilidade)

ExemploElabore uma macro para obter uma aproximação para a integral def (x) = 1√

2πexp{− 1

2 x2}, x ∈ (0, 1). Normalmente essa probabilidade é representada

por P(0 < Z < 1).

Obs: O resultado numérico dessa integral é aproximadamente 0,3413.

1 Sub IntegralZ01()2 n = 10000003 Q = 1 ' área do quadrado [0,1]x[0,1]4 Conta = 05 Pi = Application.Pi()6 For i = 1 To n7 x = Rnd() 'Intervalo [0,1]8 y = Rnd() 'Intervalo [0,1]9 F = 1 / Sqr(2 * Pi) * Exp(-(x ^ 2) / 2)

10 If y < F Then Conta = Conta + 1 '(Condição de Sucesso)11 Next12 p = Conta / n ' Proporção da área do retângulo [-4,4]x[0,1] ocupada pela f.13 MsgBox "Integral = " & p * Q14 End Sub

Page 59: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Função Normal Bidimensional (Gaussiana)

Vamos considerar agora o caso bidimensional. Sejaf (x , y) = exp{−(x2 + y2)/2}, (x , y) ∈ R2. Esta função é simétrica em torno daorigem, com seu máximo no ponto (0, 0), igual a exp{0} = 1, com variaçãopredominante em [−4; 4]2. O resultado dessa integral é 2π ' 6, 283.

1 Sub Gaussiana2()2 n = 10 ^ 73 a = 4 ' intervalo [-a , a]4 Q = 1 * (2 * a) ^ 2 ' volume do paralelepípedo5 For i = 1 To n6 x = Rnd() * (2 * a) - a ' [-a , a]7 y = Rnd() * (2 * a) - a ' [-a , a]8 Z = Rnd() ' [ 0 , 1]9 f = Exp(-(x ^ 2 + y ^ 2) / 2)

10 If Z < f Then Conta = Conta + 1 '(Condição de Sucesso)11 Next12 p = Conta / n ' Proporção do volume ocupado pela f.13 MsgBox "Integral = " & p * Q14 End Sub

Page 60: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Programação no Excel (VBA)O ambiente VBAAlguns códigos simples com InputBox, MsgBox e CondicionalUso do CELLSStringsSomas e LoopsAlgumas funções no VBAGeração de números aleatóriosCategorizando ou discretizando variáveisMontando uma distribuição de frequênciasOrganizando macros em sub-macros ou funçõesÁreas e Probabilidades

Programação no R

Programação no Python

Page 61: Uso de linguagens de programação. · 2019-10-23 · Substrings: Left,Right,MideLen Tambémpodemosretirar,substituiretc.,partesdeumstring: 1 Sub Parte() 2 Nome = InputBox("Digite

Obrigado, e seja feliz escrevendo códigos em VBA, R ou Python!