O andar do bêbado

Modelos do tipo “Random walk” são amplamente utilizados para fenômenos probabilísticos.

A ideia básica é bem simples.

Imagine um bêbado, que está numa posição de coordenadas (0,0).

Como ele está chapado, ele pode dar um passo numa direção aleatória qualquer.

Traduzindo numa fórmula, seria Posição(t+1) = Posição(t) + aleatório(), ou seja, sua posição futura depende da posição atual, mais o passo aleatório.

Nota: a função aleatória do Excel varia de 0 a 1. Queremos que ela varie de -0,5 a 0,5 (para considerar que o bêbado pode andar para trás também). Portanto, a ideia é simplesmente utilizar (aleatório() – 0.5).

Colocando as fórmulas numa planilha, resulta num gráfico deste tipo:

Clicando F9, o Excel realiza um novo sorteio do passo aleatório:

Planilha para download.

Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/

Joguinho de luzes

Uma aplicação de vba para colorir shapes.

Download aqui.

Cada seta troca as cores das luzes nos círculos – se estiver apagada, acende, e vice-versa.

O joguinho é deixar todas as luzes verde com o menor número de cliques.

É necessário ativar macros.

O joguinho ficou fácil demais. Se alguém tiver alguma ideia interessante, favor indicar.

Ler arquivo e salvar

Segue um desafiozinho.

Criar um código (vba, python, etc), que leia a lista de números em Lista.xlsx, acrescente 1 a cada valor da lista, e salve um segundo arquivo, Lista2.xlsx com os novos valores.

Lista.xlsx

Segue uma solução possível.

wbAtual = ThisWorkbook.Name

ReDim vetor(1 To 59) ‘Vetor para conter a lista

‘Comando workbooks.open para abrir o arquivo

‘Fornecer o endereço (ou colocar na mesma pasta)

Set wkb = Workbooks.Open(“C:\Analytics\Lista.xlsx”)

‘Abre a planilha 1 do workbook Lista.xlsx

wkb.Worksheets(“Planilha1”).Activate

For i = 1 To 59

    vetor(i) = Range(“a” & i + 1) ‘Para ler cada linha

Next i

‘Fecha o workbook

wkb.Close SaveChanges:=True

‘===================

‘Volta ao workbook original

Workbooks(wbAtual).Activate

‘Adiciona um e cola na planilha

For i = 1 To 59

    Range(“a” & i + 1) = vetor(i) + 1

Next i

‘salva com o nome Lista2

ThisWorkbook.SaveAs “Lista2”

Se for executado mais de uma vez, vai aparecer um pop up, perguntando se quer sobrescrever o arquivo existente. Clique em Sim, e está concluído.

2) Código semelhante no python. Note que são apenas 4 linhas para fazer a mesma coisa.

import pandas as pd

#Le o arquivo utilizando o módulo pandas

df = pd.read_excel(io=’Lista.xlsx’, sheet_name=’Planilha1′, usecols = “A”)

#A manipulação de dataframes tem a sua própria lógica, mas o código a seguir funciona

df[‘Lista’] = df[‘Lista’].apply(lambda x: x+1)

df.to_excel(“Lista2.xlsx”, sheet_name=’Planilha1’)

2) Código semelhante no python. Note que são apenas 4 linhas para fazer a mesma coisa.

import pandas as pd

#Le o arquivo utilizando o módulo pandas

df = pd.read_excel(io=’Lista.xlsx’, sheet_name=’Planilha1′, usecols = “A”)

#A manipulação de dataframes tem a sua própria lógica, mas o código a seguir funciona

df.to_excel(“Lista2.xlsx”, sheet_name=’Planilha1’)

Pi de Leibniz

O número Pi (3,1415…), é um dos mais estudados da matemática.

A fórmula a seguir converge (lentamente) para Pi. É  conhecida como fórmula de Leibniz.

Exercício: escrever uma função (em Excel, Vba, Python, qualquer coisa), que calcule o valor da fórmula.

Seguem algumas respostas:

  1. Por fórmula.

Primeiro, gero a sequência 1,3,5, 7, etc. Multiplico alternadamente por -1 e 1, via fórmula, se n é ímpar, multiplico por 1, se par, por 1.

Somando tudo, vai (lentamente) convergindo para Pi (3.1415…)

  1. VBA: essencialmente, a mesma coisa. Recebo um número (o número de termos a somar), e aplico a fórmula do somatório (    soma = soma + (-1) ^ (i + 1) * (1 / (2 * (i – 1) + 1))

Function leibnizPi(N)

Dim i As Integer

Dim soma As Double

For i = 1 To N

    soma = soma + (-1) ^ (i + 1) * (1 / (2 * (i – 1) + 1))

Next i

leibnizPi = 4 * soma

End Function

  1. O mesmo código, em Python:

N = 5 #Definir o número de termos

soma =0

for i in range(1,N+1):

    soma += (-1) ** (i + 1) * (1 / (2 * (i – 1) + 1))   

print(4*soma)

  1. Há uma forma completamente diferente de fazer o cálculo de Pi, via método de Monte Carlo.

Imagine um círculo de raio 1, que tem raio pi*r^2. Este círculo, inscrito num quadrado de lado 2 (área 4).

A razão entre a área do círculo e a área do quadrado é de pi/4 = 0.78539…

Se eu “disparar” um número de tiros aleatórios neste alvo, e contar quantos pontos ficaram dentro do círculo x total de pontos, a proporção tem que ir convergindo para a proporção da fórmula. Assim, com um número infinito de tiros, consigo estimar o valor de Pi.

Computacionalmente é fácil fazer a conta. Basta um gerador de número aleatórios.

Na prática, esta técnica é usada ao contrário. Como o valor de Pi é conhecido com milhares de casas decimais (através de séries como a apresentada), este teste visa saber se o gerador de números aleatórios é realmente bom.

Em Python:

import random

import math

Npontos = 50000

cIn = 0

cOut = 0

for i in range(Npontos):

    x = random.uniform(-1,1)

    y = random.uniform(-1,1)

    if math.sqrt(x**2+y**2 <= 1):

        cIn +=1

    else:

        cOut +=1

print( cIn / Npontos)

#Rodando, dá valores em torno de pi/4 = 0.78539

Para download, no Google Drive:

Leibniz Pi

Monte Carlo Pi

Calculadora de IMC

Segue um projetinho simples.

Como fazer uma calculadora de IMC (Índice de massa corporal), utilizando formulários em Excel.

Com Alt + F11, abrimos o editor do VBA.

Inserir -> Userform

Vai abrir um formulário. Este formulário tem várias propriedades. Mudar a propriedade Caption (título) para IMC.

Na caixinha de controles, um deles é o label (um texto simples) e outro é uma caixa de texto (para input de dados).

Basta clicar no controle e inserir no formulário.

Inserir os elementos e posicionar no formulário.

No botão rodar, vai o código  que faz o cálculo.

Se a caixinha de texto se chama TxtPeso, para acessar o valor é TxtPeso.Value.

O IMC é o peso pela altura ao quadrado.

imc = peso / (altura ^ 2)

Pela tabela abaixo, temos a recomendação do IMC.

Resultado de imagem para imc tabela

E o resultado final é algo assim:

Link para download: https://drive.google.com/file/d/1DwMTDTahuvRk7JLeInMgdviUexA6bVuq/view?usp=sharing

Private Sub CommandButton1_Click()

Dim imc As Double

Dim peso As Double

Dim altura As Double

Dim texto As String

Dim txtAlt As String

If Information.IsNumeric(TxtPeso.Value) Then

    peso = TxtPeso.Value

Else

    MsgBox “Informar valor numérico para o peso”

    Exit Sub

End If

If Information.IsNumeric(TxtAltura.Value) Then

     altura = TxtAltura.Value

Else

    MsgBox “Informar valor numérico para a altura”

    Exit Sub

End If

imc = Math.Round(peso / (altura ^ 2), 1)

If imc < 17 Then

    texto = “IMC = ” & imc & “, Peso muito abaixo do ideal”

ElseIf imc < 18.5 Then

    texto = “IMC = ” & imc & “: Peso  abaixo do ideal”

ElseIf imc < 25 Then

    texto = “IMC = ” & imc & “: Peso normal”

ElseIf imc < 30 Then

    texto = “IMC = ” & imc & “: Acima do peso”

ElseIf imc < 35 Then

    texto = “IMC = ” & imc & “: Obesidade I”

ElseIf imc < 40 Then

    texto = “IMC = ” & imc & “; Obesidade II (severa)”

Else

    texto = “IMC = ” & imc & “: Obesidade III (mórbida)”

End If

Label3.Caption = texto

End Sub

Ideias técnicas com uma pitada de filosofia

http://ideiasesquecidas.com

2020 ao quadrado

Como encontrar pares de inteiros (não-negativos e maiores do que zero), tais que a^2 + b^2 = 2020^2?

Este tópico trouxe várias respostas criativas.

Resposta: são 4 pares (a,b) tais que a^2+b^2 = 2020^2:

 400 e 1980

868 e 1824

1212 e 1616

1344 e 1508

Seguem 4 resoluções, partindo da mais fácil para a mais elegante.

  1. O Arthur Bratti (de Santa Catarina) fez um tabelão, com as linhas e colunas variando de 1 a 2020, fez as contas para todas as alternativas, e ficou somente com as que davam 2020^2 = 4.080.400. Infelizmente, o excel ficou grande demais para enviar por e-mail. Como usa somente fórmulas de Excel, a lógica é bem simples.

O print abaixo é uma ilustração do método.

  1. Em VBA dá para fazer um loop for dentro de outro. Se for igual a 2020^2, guardo a solução, senão, vou para a próxima.

For i = 1 To 2019

    For j = i + 1 To 2019

        If i ^ 2 + j ^ 2 = 2020 ^ 2 Then

            c = c + 1

            sol(c, 1) = i

            sol(c, 2) = j

        End If

    Next

Next

  1. Python é a linguagem padrão em análise de dados (vide comentário aqui:

https://www.linkedin.com/posts/arnaldogunzi_as-linguagens-de-analytics-no-%C3%BAltimo-f%C3%B3rum-activity-6611608415540137984-48zg)

O mesmo código, em Python:

sol =[]

for a in range(2020):

    for b in  range(a+1,2020):

        if a**2 + b**2 == 2020**2:

            sol.append([a,b])

print(sol)

Note como Python é conciso e direto ao ponto.

  1. A solução mais elegante de todas for enviada pelo grande Marcos Melo. Utiliza matemática, ao invés de computação. Transcrevo aqui suas palavras.

A fórmula que engloba todos os números Pitagóricos é:

A= k*(X^2-Y^2)

B=k*(2*X*Y)

C= k*(X^2+Y^2)

Onde X e Y são primos entre si.

Como 2020 é 1*2*2*5*101

A chave é encontrar os resultados de hipotenusa X^2+Y^2=5: =101 e =505;

A hipotenusa 5 é do bem conhecido triângulo 3, 4 e 5 resultado do par X=2 e Y=1; multiplicado por 404 será de hipotenusa 2020.

(ou seja, resultado 1212 e 1616).

A hipotenusa 101 é do 20, 99 e 101 resultado do par X=10 e Y=1; multiplicado por 20 será de hipotenusa 2020.

(ou seja, o par 400 e 1980).

A hipotenusa 505 tem dois: o formado por X=21 e Y=8 e o X=19 e Y=12, que resultam nos triângulos 336, 377 e 505; e 217, 456.e 505; ambos multiplicados por 4 serão de hipotenusa 2020;

(ou seja, os dois pares faltantes: 868 e 1824; 1344 e 1508).