Introdução ao Mathematica

Introdução

Devido a meu interesse de aprender mais sobre o uso prático da matemática, decidi, nos últimos meses, investir mais tempo no software Mathematica. Um fator motivacional foi um post do X em que o autor consegue obter a distribuição de probabilidade baseado em dados de uma imagem. O objetivo deste post é primeiramente documentar o que aprendi até agora para ajudar na fixação do conhecimento e também compartilhar com quem deseja iniciar, assim como, tentar fazer uso prático da ferramenta Mathematica ao obter a área criada pela mancha de café no fundo de uma caneca.

Ambiente

Uso o Mathematica na licença Home Edition, versão 13.0.1.0 e no Macbook M1. Ao abrir o programa, a tela abaixo é mostrada. Como vocês podem ver, estou logado em minha conta e têm alguns arquivos recentes.

Quando quero fazer alguma coisa, sempre inicio criando um novo documento e a tela abaixo é exibida. Tudo é feito nessa tela.

Comandos iniciais

fn + enter – Enviar comando

Ao apertar enter no prompt, o comando não será enviado. O cursor passará para a linha de baixo e o comando digitado não será executado. Exemplo:

Se quiser que o comando seja executado, o comando correto é fn + enter. Ao digitar um comando e executá-lo, o resultado é automaticamente exibido. Caso não queria ver o resultado, a inserção do caractere ; no final do comando suprime a saída. O Mathematica usa a linguagem de programação própria, e como toda linguagem de programação, variáveis e comandos mais complexos podem ser usados.

Command + a, Delete – Selecionar tudo e apagar

Após usar o programa por algum tempo, me incomoda ter muitos comandos com resultados na tela. Uma das primeiras coisas que pesquisei foi como limpar a tela. Até o momento não encontrei nada específico, mas o comando Command + A e Delete tem funcionado. A sequência Command + A seleciona tudo e Delete apaga. Após isso, a tela estará limpa novamente.

Command + l – Obter último comando executado

Uma das dificuldades que sinto até o momento, é como obter o histórico de comandos. Não encontrei solução para isso e quando preciso alterar um comando anterior, copio com o mouse e colo no prompt. Quando o comando que quero executar é uma variação do último, utilizo Command + l. Ainda não aprendi muitos comandos, mas com os listados já consegui aprender o suficiente para fazer algumas coisas do meu interesse.

Uso prático

Uma das coisas que me motivou a aprender usar o programa Mathematica foi o post do X. Apresento-o a seguir.

https://twitter.com/dzviovich/status/1730236957874061445

Fiquei surpreso como uma pessoa com uma ferramenta poderia facilmente obter a distribuição de probabilidade baseado em dados de uma imagem. Mesmo após ter visto esse post e ter decidido que iria começar a usar o programa, eu não tinha feito nada após meses. Eu tomo bastante café e tinha notado que toda vez que termino, no fundo da caneca, uma mancha se formava seguindo o mesmo padrão. Daí pensei, tem como calcular a área dessa mancha usando o Mathematica? Foi assim a primeira vez que realmente usei o programa para tentar fazer algo prático. Abaixo vocês podem ver a foto original que tirei do fundo da caneca com meu celular.

Primeiro passo é importar a imagem no programa. Para isso a função Import[] é utilizada. Aqui eu usei o comando SetDirectory[] anteriormente para definir qual diretório a função Import[] vai localizar a imagem. Se não quiser usar o comando SetDirectory, precisa apenas passar o caminho completo da localização da imagem.

Como podem ver, há uma diferença de tamanho entre a imagem original acima e a imagem importada no programa. Após importar e clicar na imagem, um menu é exibido com algumas informações, permitindo fazer modificação na imagem, inclusive redimensioná-la. Eu a cortei para ter somente a parte necessária. Com a imagem no tamanho ideal, usando o mesmo menu podemos usar o mouse e obter as coordenadas da área desejada, usando a opção Coordinates Tool. Essa opção permite usar o mouse para ir selecionando a área desejada. Não é um método com um alto grau de precisão, porque dificilmente selecionará a mesma área repetida vezes, mas foi suficiente para eu ver como poderia fazer isso com o Mathematica. Exemplo:

Após copiar as coordenadas, precisa colocá-las em uma variável para poder manipulá-las mais facilmente.

In[3]:= coordinates = {{125.328125`,57.6015625`},{125.890625`,55.16796875`},{127.2109375`,53.015625`},{132.01953125`,43.1484375`},{139.60546875`,37.734375`},{143.33984375`,35.91796875`},{151.32421875`,31.7578125`},{153.30078125`,29.01171875`},{155.44140625`,28.41796875`},{161.3515625`,25.55859375`},{163.77734375`,25.55859375`},{166.23046875`,25.7421875`},{169.7734375`,26.4140625`},{171.890625`,26.79296875`},{176.73828125`,27.171875`},{179.6875`,27.99609375`},{191.4921875`,30.453125`},{202.92578125`,35.45703125`},{204.92578125`,36.8515625`},{210.3046875`,39.78515625`},{223.96875`,42.203125`},{228.43359375`,48.77734375`},{234.890625`,58.6015625`},{237.30078125`,62.3203125`},{243.890625`,82.34765625`},{249.5546875`,86.7578125`},{261.63671875`,99.21484375`},{265.515625`,102.13671875`},{270.0078125`,102.13671875`},{279.16015625`,109.21875`},{279.67578125`,112.21875`},{281.3203125`,120.859375`},{283.70703125`,127.390625`},{286.30078125`,129.78515625`},{293.25390625`,135.1484375`},{301.86328125`,139.27734375`},{307.83984375`,153.6796875`},{313.953125`,162.328125`},{316.28125`,163.70703125`},{321.9140625`,169.66796875`},{342.171875`,183.78125`},{346.64453125`,185.74609375`},{351.81640625`,186.84765625`},{368.37109375`,191.9375`},{384.8046875`,194.546875`},{388.703125`,194.17578125`},{390.9296875`,192.8046875`},{400.86328125`,184.39453125`},{409.1484375`,186.921875`},{420.16015625`,182.8515625`},{422.8515625`,180.08984375`},{440.69921875`,178.58984375`},{447.04296875`,173.5390625`},{457.890625`,176.72265625`},{471.4609375`,177.76171875`},{487.8125`,171.9140625`},{508.80859375`,169.05078125`},{517.80859375`,163.76171875`},{520.46484375`,162.375`},{531.38671875`,157.53515625`},{545.83203125`,148.9375`},{550.34765625`,145.92578125`},{553.53125`,143.24609375`},{572.859375`,134.6796875`},{585.60546875`,134.38671875`},{590.3125`,133.01171875`},{599.73828125`,129.1796875`},{605.43359375`,122.19140625`},{614.3125`,121.12109375`},{624.1328125`,118.37890625`},{637.68359375`,116.59375`},{649.30078125`,113.59765625`},{657.484375`,115.34765625`},{660.2890625`,115.86328125`},{664.14453125`,116.43359375`},{672.4765625`,121.31640625`},{682.26171875`,135.08984375`},{688.25390625`,144.44140625`},{691.94921875`,150.00390625`},{702.17578125`,165.26171875`},{705.02734375`,179.65234375`},{705.02734375`,182.9453125`},{706.09765625`,200.0859375`},{703.25`,211.640625`},{701.16015625`,217.26953125`},{699.296875`,221.171875`},{692.3984375`,235.66796875`},{683.375`,246.1796875`},{680.42578125`,251.58984375`},{679.35546875`,256.8984375`},{677.71875`,259.38671875`},{675.95703125`,266.3203125`},{674.8203125`,275.94140625`},{668.46484375`,284.5390625`},{660.98046875`,286.5703125`},{657.51171875`,288.30078125`},{646.34765625`,297.92578125`},{639.62890625`,303.65625`},{630.62890625`,312.8203125`},{628.875`,316.05078125`},{627.38671875`,320.74609375`},{624.23046875`,324.6171875`},{619.30078125`,329.4375`},{616.3046875`,333.171875`},{611.51171875`,339.296875`},{607.2890625`,344.7265625`},{595.5859375`,352.71875`},{591.57421875`,355.8359375`},{588.46484375`,360.0703125`},{581.62109375`,367.328125`},{573.625`,374.12109375`},{571.5859375`,375.93359375`},{559.03515625`,385.8671875`},{555.58984375`,387.37890625`},{550.90625`,391.41796875`},{545.5546875`,395.09765625`},{537.78515625`,401.30078125`},{529.6484375`,407.2578125`},{526.4140625`,409.51953125`},{519.23046875`,412.4140625`},{506.9609375`,418.30078125`},{503.51171875`,420.5`},{500.6640625`,421.81640625`},{494.421875`,425.89453125`},{489.62890625`,429.40625`},{480.58203125`,431.32421875`},{472.0390625`,432.8984375`},{466.265625`,433.90234375`},{455.63671875`,436.26171875`},{452.19921875`,437.69921875`},{449.7734375`,438.58984375`},{447.7578125`,439.56640625`},{440.56640625`,442.24609375`},{434.6328125`,446.05078125`},{430.1875`,449.76953125`},{425.15234375`,451.35546875`},{421.73046875`,452.10546875`},{416.23046875`,452.57421875`},{411.53125`,455.2265625`},{405.46484375`,456.40625`},{400.2578125`,457.41796875`},{389.32421875`,460.2421875`},{380.79296875`,460.2578125`},{368.78125`,461.19921875`},{365.6640625`,461.33203125`},{359.00390625`,460.12890625`},{350.31640625`,458.94921875`},{340.19140625`,458.68359375`},{334.15234375`,457.875`},{326.390625`,455.953125`},{323.4140625`,455.27734375`},{316.23046875`,451.4765625`},{289.93359375`,448.90234375`},{287.32421875`,448.90234375`},{276.1484375`,442.9609375`},{266.8984375`,437.62890625`},{254.49609375`,431.1328125`},{246.9375`,425.6953125`},{226.8984375`,415.12109375`},{223.08984375`,413.328125`},{216.453125`,407.24609375`},{208.1015625`,398.08203125`},{201.390625`,391.078125`},{196.234375`,385.25390625`},{190.33984375`,379.64453125`},{183.359375`,373.53515625`},{171.21484375`,363.65234375`},{166.3203125`,360.13671875`},{161.10546875`,352.03515625`},{160.61328125`,348.1796875`},{159.23046875`,343.34765625`},{154.98046875`,334.13671875`},{152.6796875`,326.984375`},{147.125`,314.421875`},{146.5`,310.8359375`},{145.296875`,307.33984375`},{140.24609375`,299.6484375`},{136.078125`,293.64453125`},{131.91015625`,289.765625`},{127.171875`,287.43359375`},{125.16796875`,285.9453125`},{124.3671875`,283.671875`},{125.3671875`,281.57421875`},{125.3671875`,276.765625`},{124.6328125`,272.73046875`},{122.5234375`,263.9375`},{122.48046875`,260.9140625`},{121.03515625`,257.90625`},{117.140625`,252.73828125`},{113.1015625`,248.01171875`},{109.25390625`,245.421875`},{106.97265625`,244.24609375`},{105.4453125`,242.21484375`},{102.87109375`,239.38671875`},{98.1875`,236.3828125`},{96.42578125`,234.31640625`},{94.79296875`,230.24609375`},{94.79296875`,228.15234375`},{94.375`,222.76171875`},{94.72265625`,219.5078125`},{96.90234375`,217.13671875`},{98.37890625`,210.4453125`},{98.62109375`,208.20703125`},{98.62109375`,205.984375`},{98.00390625`,203.61328125`},{96.6953125`,201.37890625`},{93.70703125`,199.01171875`},{91.34375`,197.50390625`},{88.87109375`,194.140625`},{88.87109375`,191.76953125`},{88.87109375`,189.60546875`},{89.9453125`,187.359375`},{93.05859375`,187.`},{95.2109375`,186.03515625`},{95.6953125`,183.875`},{95.57421875`,181.6953125`},{93.46875`,170.6953125`},{93.359375`,167.11328125`},{93.359375`,164.71484375`},{93.359375`,162.12109375`},{93.359375`,159.7421875`},{93.359375`,157.66015625`},{93.359375`,155.51171875`},{93.359375`,153.484375`},{93.359375`,151.265625`},{93.62109375`,148.875`},{94.14453125`,146.57421875`},{94.14453125`,143.546875`},{94.14453125`,137.1015625`},{94.41015625`,134.0546875`},{94.92578125`,131.80078125`},{95.38671875`,129.56640625`},{97.09765625`,127.4921875`},{98.08984375`,125.37890625`},{98.09375`,122.88671875`},{99.73046875`,120.625`},{100.58203125`,118.58984375`},{100.58203125`,116.375`},{100.59765625`,114.2421875`},{100.84765625`,112.0625`},{101.05859375`,109.65625`},{101.11328125`,107.33984375`},{101.11328125`,104.83984375`},{101.11328125`,102.55859375`},{101.12890625`,100.33203125`},{101.24609375`,97.93359375`},{101.1171875`,95.88671875`},{101.12890625`,93.73828125`},{103.01953125`,91.73828125`},{104.18359375`,89.44140625`},{104.7890625`,87.32421875`},{104.93359375`,85.26171875`},{104.93359375`,83.21875`},{104.93359375`,81.12109375`},{106.2890625`,78.890625`},{108.94921875`,77.0546875`},{111.35546875`,74.91015625`},{113.76953125`,72.1171875`},{114.78125`,69.9453125`},{117.19140625`,68.39453125`},{119.50390625`,67.01953125`},{120.9140625`,64.84375`},{123.28125`,60.9921875`}};

Com as coordenadas da área, usamos a função Polygon[] para desenhar um polígono da área e ver se realmente as coordenadas fazem sentido. Usando a função Polygon[] obtemos o retorno da área clicando no + ao lado da figura desenhada. Entretanto, queremos obter o valor diretamente.

Usando o comando Graphics[] a figura é desenhada de uma forma que podemos visualizar melhor.

Se a imagem desenhada está dentro do esperado, para calcular a área podemos usar o comando Area[] e passar o polígono como argumento.

Conclusão

Apesar de eu não ter tido experiência com o Mathematica anteriormente, consegui, de forma simples, obter a área de uma foto que tirei com meu celular. Isso era algo que eu não imaginava que eu poderia fazer há um tempo atrás e fiquei muito contente com o resultado, apesar de ser simples. Isso demonstra o poder da ferramenta. Não apenas pelo conteúdo desta postagem, mas também pela postagem do X que me motivou a aprender usar o Mathematica. A área obtida através desse método não corresponde a área real na caneca. O resultado é representado em pixels de acordo com o tamanho da imagem. Para obter a dimensão real da mancha na caneca, precisaria levar em consideração informações do celular que utilizei para tirar a foto. Talvez esse seja o conteúdo de um próximo post.

Author: Anderson Nascimento

A computer security researcher focused on understanding, discovering and exploiting computer security vulnerabilities. - Um pesquisador em segurança da informação com o foco em entender, descobrir e explorar vulnerabilidades em computadores.

Leave a Reply

Discover more from Anderson Nascimento

Subscribe now to keep reading and get access to the full archive.

Continue reading