Algumas estatísticas sobre o curso

Terminou! Abaixo vão alguns dados sobre o curso.

Fizemos o volume 1 do livro do Vaz&Capelas de ponta a ponta. Foram 171 exercícios, alguns com vários itens. É uma carga de trabalho semelhante ao dos cursos equivalentes em universidades norte-americanas de ponta, como por exemplo o Caltech. Arrisco dizer que quem fez todos os exercícios como sugerido no início do semestre, teve um aproveitamento satisfatório no curso.

Dos 31 alunos que fizeram no mínimo 5 testes (limite abaixo do qual há reprovação por faltas), 24 foram aprovados. A média desses 31 alunos foi 6. O histograma dessas médias vai abaixo

Considero esse desempenho bastante bom.

O curso começou com 67 matriculados, dos quais 19 desistiram formalmente. Dos que fizeram menos de 5 testes,  15 abandonaram o curso e não fizeram todas as provas/exame.

Parabéns aos(as) que foram aprovados(as), espero vê-los(as) em Métodos 2.

Os que não conseguiram, contem conosco para o que precisarem! Sei que falo em nome dos assistentes também.

Boas férias!

 

 

 

 

Tutorial de instalação Python

Como usuário e evangelizador do open source, me vi na obrigação de fazer essa pequena contribuição propondo maneiras de se instalar o Python e programas/pacotes do mesmo.

A filosofia da linguagem Python alega que deve haver apenas uma maneira óbvia de se fazer as coisas. Curiosamente, há diversas maneiras de se obter o Python, abaixo explico as principais.

Anaconda

Como sugerido pelo professor, uma das formas de se utilizar Python é através da distribuição Anaconda. As instalações disponíveis podem ser facilmente encontradas neste link.

Já existe uma documentação extensa sobre a distribuição e irei apresentá-la, mas antes gostaria de elucidar o que pode ser entendido por distribuição nesse contexto.

O Python é uma linguagem de programação interpretada cuja maior feature é, argumentavelmente, a facilidade de utilizar pacotes/bibliotecas (isto é, código de pessoas que gastaram neurônios para fazer nossa vida mais simples). Para utilizar tais pacotes, é preciso possuir, pasme, um package manager, que permite a instalação e o gerenciamento das versões dos seus pacotes. A distribuição Anaconda é um conjunto composto pelo interpretador Python, o gerenciador conda, bibliotecas comuns (especialmente usadas em computação científica e ciência de dados), ferramentas para edição de código (como Spyder e Jupyter), e provavelmente muitas outras coisas das quais eu não sei e muitos que baixarem a distribuição sequer chegarão a utilizar.

O guia Getting started with Conda te permite iniciar os trabalhos em cerca de 20 minutos. Note que o passo zero é obter uma distribuição, para isso use o guia

Os demais passos indicam como checar a instalação, e como criar e usar um virtual environment, o que é uma forma de isolar diferentes versões de um mesmo pacote para diferentes projetos em sua máquina. Voltaremos nisso depois.

Miniconda

A distribuição Anaconda pode ser considarada bloated, tanto do ponto de vista de software quanto do ponto de vista de tamanho para alguns. Quem possui tais preocupações e ainda prefere utilizar o conda, pode optar pelo Miniconda, o qual contém apenas o interpretador, o package manager e apenas as dependências necessárias.

Barebones

Além de conda, temos um outro gerenciador de pacotes famoso: pip. Chamei essa seção de barebones, porque representa uma forma de instalar apenas o interpretador e as utilidades necessárias.

Linux

Seu dia de sorte! Um dos muitos benefícios de utilizar Linux é já possuir um interpretador Python instalado (a não ser que você não use uma distribuição Linux convencional, nesse caso, você deve já saber muito bem o que está fazendo). Dessa forma é apenas preciso instalar as utilidades que deseja para seus trabalhos, eu recomendo pip (gerenciador de pacotes), venv (ferramenta para criar ambientes virtuais), e tkinter (necessário para ter boa experiência com matplotlib). Caso você esteja usando uma distribuição baseada no Debian/Ubuntu, abra um terminal e faça:

sudo apt install python3-pip python3-venv python3-tk

Além dessas utilidades, é muito comum utilizarmos Jupyter para análises simples de dados, para instalá-lo para seu usuário basta fazer:

pip install jupyterlab

Isso instala uma versão “vitaminada” do Jupyter. Além disso, você com certeza precisará de um editor de texto, como isso é uma discussão inteiramente a parte, me restringirei a recomendar o Nvim (caso você seja macho) ou o VSCode (caso você não seja tão nerd).

Windows

Instale Linux e repita o procedimento acima.

Se você ainda se contenta usando um sistema operacional inferior, acesse https://www.python.org/downloads/windows/, baixe uma versão em Stable Releases e execute o instalador. O passo a passo é bem simples, mas recomendo utilizar o Anaconda no Windows, porque permite que você tenha uma interface gráfica – esse processo barebones faz mais sentido para quem está acostumado com a linha de comando e é mais produtivo nela. Dito isso, instalando dessa forma você já obtém as utilidades citadas acima.

Mac

Não sou grande conhecedor do sistema da Apple, então, como no caso do Windows, recomendo checar https://www.python.org/downloads/macos/ ou usar a Anaconda. Mac é um sistema baseado no Unix, como o Linux, mas possui algumas complicações a mais das quais não tenho capacidade de instruir.

Instalando pacotes

Recomendo sempre considerar a instalação de bibliotecas no contexto de um projeto. Imagine que você esteja trabalhando num projeto já corrente que utiliza a versão 1.18 do NumPy e, paralelamente, deseja iniciar um projeto com a versão mais recente do pacote (1.24). Não é preciso pensar muito para imaginar que um interpretador Python genérico na sua máquina não conseguirá identificar a diferença dos projetos e irá utilizar a versão do NumPy cuja instalação é mais recente. Para evitar esse tipo de problema, podemos criar um ambiente virtual para cada projeto.

Ambientes virtuais são como salas de trabalho para o interpretador. Em cada sala o interpretador só é capaz de utilizar aquilo que está dentro da sala, de forma que salas com a mesma ferramenta em diferentes versões não apresentam conflito algum. O tutorial do Anaconda já conta com uma apresentação de como se fazer isso (criar um ambiente virtual), caso você esteja usando a utilidade que eu sugeti (venv), navegue para a raiz do seu projeto (a pasta que contém todos os arquivos e subpastas relevantes, ou onde fica a pasta .git de um repositório git) e faça:

python -m venv .env

Isso irá criar uma pasta .env no seu projeto (o . no início indica que ela é uma pasta oculta, o que facilita a visualização do projeto em interfaces gráficas, mas é plenamente acessível). Agora, para ativar o ambiente virtual, isto é, para o interpretador entrar na sala,

source .env/bin/activate

Caso você esteja no Windows .env\Scripts\activate

Agora seu interpretador “sabe” que está dentro de um projeto e pode utilizar qualquer biblioteca já instalada dentro do projeto e irá instalar novas bibliotecas de forma isolada do resto do seu computador (na realidade essa instalação não é completamente isolada, mas na prática não fará diferença). Agora, para instalar SymPy, por exemplo

pip install sympy

Ou

conda install sympy

Para obter outras bibliotecas o processo é completamente análogo.

Note que bibliotecas nada mais são do que software e que pip e conda são gerenciadores de pacote da mesma forma que apt é, a única diferença é que os dois primeiros são específicos da linguagem Python. Digo isso porque nem toda instalação via pip/conda precisa ser feita dentro de um ambiente virtual, por exemplo, o window manager que eu uso (Qtile) pode ser instalado diretamente com pip, porém isso não deve (talvez até possa, mas com mais trabalho) ser feito dentro de um ambiente virtual. Similarmente, você pode ter um jupyter-lab para cada projeto, mas eu particularmente não vejo muitos benefícios nisso. A maior vantagem dos ambientes virtuais se dão no uso de bibliotecas de código mesmo, como SymPy, NumPy, Pandas, Matplotlib, etc.

Espero ter ajudado!

Equação associada de Legendre

Caros(as), depois do vexame com meu computador na última aula, vejo-me obrigado a tentar mostrar aqui como os softwares de manipulação simbólica podem ser MUITO uteis, não só para os trabalhos acadêmicos, mas também para a vida profissional mais ampla.

O exemplo que eu tentei mostrar era no Maple, um pacote proprietário já tradicional, pra não dizer “antigo”, mas ainda muito poderoso. É o que eu uso no cotidiano, para meus trabalhos de pesquisa e também pra preparar esses exercícios que vocês tanto gostam. A UNICAMP não tem licença do Maple, e é um software caro. No entanto, todos nós na UNICAMP temos licença para uso do Mathematica, o mais completo, moderno (fashion) e provavelmente poderoso pacote existente atualmente. Para instruções sobre licença e de como instalar o Mathematica em seus computadores, vejam aqui.

Lembrando, nosso problema era encontrar as soluções da equação associada de Legendre

\displaystyle(1-x^2)y'' - 2xy' + \left(\lambda -\frac{m^2}{1-x^2}\right)y=0

sendo m um inteiro.  Vimos que para m=0, a solução deve ser polinomial, caso contrário a solução diverge para  x=\pm 1, e isso estaria associado a divergências para \theta=0,\pi em coordenadas esféricas. Esta exigência era acompanhada da restrição para \lambda = \ell(\ell+1), sendo  \ell um inteiro não negativo, finalizando o problema de autovalores associado à equação de Legendre.

A estratégia que propus para a solução de equação associada de Legendre era baseada na ideia de fazer uma transformação de variáveis que a reduzisse a alguma equação conhecida. No nosso caso, vamos tantar reduzíla à equação de Legendre (m=0).  A mudança de variável que nos interessa é a introdução de uma nova função z(x) tal que

\displaystyle f(x) = (1-x^2)^\frac{m}{2}z(x)

O trabalho é essencialmente mecânico. Deve-se substituir essa expressão na equação e ir colecionando os termos. É um trabalho massante, demorado e extremamente chato. É o tipo de trabalho que recomendei fazer numa folha A3 de lado… Além disso, esse tipo de trabalho está sempre sujeito a erros algébricos que não são fáceis de serem detectados. É aqui que os softwares de manipulação simbólica são valiosíssimos. Como o nome sugere, são softwares que permitem a manipulação simbólica de expressões algébricas, diferencias, etc. O Mathematica (assim como o Maple) é muito intuitivo.  Por exemplo, esta linha de comando

eq := (1 – x^2)*D[y[x], {x, 2}] –
2*x*D[y[x], x] + (lambda – m^2/(1 – x^2))*y[x]

atribui a variável simbólica “eq” o conteúdo associado a equação de Legendre. No Mathematica, o operador D[y[x], {x, n}] corresponde a n-ésima derivada da função y[x]. Examinando o conteúdo da variável “eq”, tem-se

y(x) \left(\text{lambda}-\frac{m^2}{1-x^2}\right)+\left(1-x^2\right) y''(x)-2 x y'(x) 

de onde vemos claramente que se trata da equação associada de Legendre. Todas estas instruções estão neste arquivo, do tipo “Mathematica notebook”, que pode ser executado no Mathematica. Para fazer a substituição de variáveis no Mathematica, basta fazer

y[x] := (1 – x^2)^(m/2)*z[x]

Se agora pedirem para ver o conteúdo da variável “eq”, verão que teremos uma expressão grande e um tanto confusa. Porém, a mágica ocorre com o comando

Simplify[(1 – x^2)^(-m/2)*eq]

Que “simplifica” a expressão, colecionando os termos equivalentes, sem cometer os erros que qualquer humano cometeria… Sugiro que vcs testem  o Mathematica para esse tipo de operação, verão que ele é muito intuitivo e fácil de usar. É uma ferramenta valiosíssima.

Bem, feita essas simplificações, ficamos com a seguinte equação para z(x)

\displaystyle(1-x^2)z'' - 2(m+1)xz' + \left(\lambda - m(m+1) \right)z=0

cuja semelhança com a equação de Legendre é evidente. A ideia aqui é simples, vamos resolver essa equação como fizemos para o caso anterior, usando Frobenius em x=0. Feito isso, ficamos (confiram!) com a seguinte relação de recorrência

\displaystyle a_{k+2} =\left(  \frac{(k+m)(k+m+1)-\lambda}{(k+2)(k+1)}\right)a_k.

A série associada tem as mesmas propriedades de convergência do caso m=0, i.e., ou a série é truncada, ou irá divergir para x=\pm 1. A única maneira da série ser truncada é termos, para um dado m,

\displaystyle  \lambda = (k+m)(k+m+1).

para algum k. Quer dizer, a constante de separação \lambda continua sendo o produto de dois inteiros consecutivos \lambda = \ell (\ell+1), como no caso da equação de Legendre. Mais que isso, a dependência da relação de recorrência em m sugere que, para um m positivo fixo, a solução correspondendo ao autovalor \lambda = \ell (\ell+1) será um polinômio de grau \ell - m. Esta é a dica que nos permite identificar a solução como

\displaystyle z(x) = \frac{d^m}{dx^m}P_\ell(x),

vejam os detalhes no livro, incluindo o caso de m negativo.

Como entusiasta do software livre, tenho que comentar sobre as alternativas livres dos softwares de manipulação algébrica. São dois os principais: o SageMath e o SymPy. O primeiro é um pacote completo, baseado no python e, portanto, com sintaxe semelhante. O segundo é uma library para o python. Minha experiência é que ambos funcionam bem, mas são muito menos intuitivos que o Mathematica e, portanto, seu uso é mais difícil. Eu recomendo a todos os meus alunos a distribuição Anaconda do python, pois ela tem todas as libraries científicas mais comuns, incluindo o SymPy. Sobre como instalar o python e seus pacotes, eu acho que, por exemplo, o Matheus-Unabomber-Powerlifter poderia ajudar. Se ele quiser publicar aqui um “tutorial”, será bem vindo, e poderá ganhar um \varepsilon>0 na média final.

Constante de Euler-Mascheroni

Caras(os),

a constante \gamma de Euler, ou de Euler-Mascheroni (imagino que o Mascheroni tenha sido primeiro a encontrá-la, depois do Euler 😀), aparece em vários contextos. Vamos retomá-la aqui na fórmula de Weierstrass (que de fato é do Euler) para a função gamma. Relembrando, partimos da fórmula de Euler (Ok, Euler-Gauss)

\displaystyle\Gamma(z) = \lim_{n\to \infty } \frac{n!n^z}{z(z+1)(z+2)\cdots(z+n)}

 

para z\ne 0,-1,-2,\dots .Vimos em aula o seguinte produto

\displaystyle \prod_{k =1}^n \left( 1+\frac{z}{k}\right)^{-1} = \frac{n!}{(z+1)(z+2)\cdots(z+n)}

 

o que nos permite escrever

\displaystyle\frac{1}{\Gamma(z)} = z \lim_{n\to \infty } n^{-z} \prod_{k =1}^n \left( 1+\frac{z}{k}\right)

 

e seguindo os passos na página 184 do livro, temos a fórmula de Weierstrass

\displaystyle\frac{1}{\Gamma(z)} = z  e^{\gamma z}\lim_{n\to \infty} \prod_{k =1}^n \left( 1+\frac{z}{k}\right) e^{-\frac{z}{k}}

 

sendo

\displaystyle\gamma =  \lim_{n\to \infty } \left( \sum_{k=1}^n \frac{1}{k} - \log n \right)

 

a nossa constante em questão. Seu valor numérico é \gamma  = 0.57721\dots , veja mais sobre sua história aqui. Porem, mostrar que  \gamma  é um número entre 0 e 1 é um exercício simples de Cálculo 1. Basta comparar a série harmônica com a função f(x) = 1/x , vejam abaixo

é fácil estabelecer a seguinte desigualdade

\displaystyle\sum_{k=2}^n \frac{1}{k} < \int_{1}^n \frac{dx}{x} = \log n < \sum_{k=1}^n \frac{1}{k} 

 

de onde tem-se

\displaystyle 0 < \sum_{k=1}^n \frac{1}{k} -  \log n < 1

 

de onde temos a relação que procurávamos. Notem que esta desigualdade não é suficiente pra concluir que o limite da definição \gamma  existe (por que?). Mas, assumindo que o limite existe, é claro que estará entre 0 e 1.

Finalmente, alguns “exercícios” que podem ser vistos como “simulados” para uma eventual “prova difícil”. Primeiro, o da série de Wallis que comentei hoje.  É o exercício 3 da P2 do curso de 2017, vejam aqui as avaliações desse curso. A solução envolve as funções beta e gama.

Uma outra coisa interessante, envolvendo a função gama, é este problema, que foi um problema de Páscoa de um curso antigo de Cálculo II. Por certo, aqui estão todas as avaliações desse curso, talvez vocês achem uteis.

Post pré-prova

Caras(os)

sobre a classificação das transformações de Moebius que comentei na aula, vejam o verbete da wikipedia

https://en.wikipedia.org/wiki/M%C3%B6bius_transformation

lá tem todas as referências pertinentes e, mais interessante, um monte de figuras bonitas, incluindo o caso loxodrômico!

Sobre a conversa da “incrível efetividade” da matemática na descrição do nosso mundo, a minha referência predileta é o ensaio do Wigner:  “The Unreasonable Effectiveness of Mathematics in the Natural Sciences“. Tem muito material a respeito, pesquisem.

Finalmente, há de fato um problema com os arquivos do curso de 2017. É mais rápido eu passar aqui as provas e testes, depois eu conserto os links quebrados.

 

 

 

Cálculo III

Caros(as),

vejam só, um aluno cursão que não faz métodos me pediu o material do meu curso de Cálculo III 😀! Obviamente, isso me deixa realmente contente e entusiasmado, provavelmente a minha atuação de “coach” está funcionando! 😀

Enfim, é uma longa história que posso contar semana que vem, mas o blog de Cálculo III que eu tinha foi hackeado e perdemos quase todo o conteúdo. Eu consegui ressuscitar os testes, provas e exames, estão aqui

http://vigo.ime.unicamp.br/ma311/

caso queiram dar uma olhada.. Infelizmente, os posts e suas discussões sumiram. O “forum do cursão”

http://forum.ime.unicamp.br/

que eu mantinha foi parcialmente preservado, mas, por causa dos hackers, ele só é acessível da rede do IMECC. Você deve estar lá pra ver o conteúdo, ou usar um VPN.

Reunindo o material agora há pouco, encontrei uma coisa interessante… Houve um trabalho de Páscoa nesse curso! Está aqui:

http://vigo.ime.unicamp.br/ma311/epascoaV2.pdf

Talvez vocês gostem. Creio me lembrar que a turma da época se divertiu com esse trabalho….

Vector illustration of a football coach.

Últimos comentários sobre variáveis complexas

Superfícies de Riemann

Quero retomar aqui, com muito mais capricho, a discussão das últimas aulas sobre a superfície de Riemann associada a função f(z)=\sqrt{z} . Para não ser repetitivo, farei aqui o caso da função f(z)=\sqrt[3]{z} . Como vocês já sabem, para z=\rho e^{i\theta} , a função f(z)=\sqrt{z} é multivaluada e temos

\sqrt[3]{z} = \sqrt[3]{\rho} \exp i\left(\frac{\theta}{3} + \frac{2k\pi}{3} \right) , 

com k=0,1,2. Vamos considerar inicialmente o caso correspondente a k=0. Trata-se do mapa abaixo

com o ângulo polar definido como \theta \in [0,2\pi]. Como discutimos várias vezes, essa função, como definida, será sempre irremediavelmente descontinua, veja a vizinhança correspondente ao círculo de cores verde e magenta e suas respectivas imagens. Temos que pontos arbitrariamente próximos do domínio são mapeados em pontos distantes na imagem, não há como essa função ser contínua. Para efeitos práticos, nós vamos sempre lidar com essas descontinuidades, associadas aos “cortes” ou “ramificações” no domínio da função, nesse caso a semirreta \theta =0.

Há, porém, uma construção elegante que permite definir uma função f(z)=\sqrt[3]{z} contínua. Estas construções envolvem um alteração o domínio associado, que deixa de ser o plano complexo simples. A ideia é considerar os outros valores da raiz. Peguemos, por exemplo, o caso correspondente a k=1, que corresponde ao mapa abaixo

isto é, é o mesmo anterior, porém agora “girado” de \frac{2\pi}{3} (120 graus). Vejam que interessante, a vizinhança correspondente ao semicírculo magenta se encaixa perfeitamente na imagem do caso anterior. Quer dizer, se de alguma maneira identificarmos \theta = 2\pi do caso anterior com \theta = 0 deste caso, teremos uma função contínua para a vizinhança magenta! Esta identificação pode ser feita como mostrei na aula com nosso modelo de papel. “Cortamos” os dois planos em \theta = 0, e unimos o \theta = 2\pi do plano que está abaixo com o \theta = 0 do plano acima, como na figura abaixo:

Por certo, esta figura  e as que vão abaixo foram geradas em Python, os códigos fontes estão aqui. Sempre recomendo que instalem a distribuição Anaconda, ela tem tudo o que precisamos para computação científica.

Notem que a origem é comum aos dois planos. Se usarmos a raiz restante, k=2, cujo mapa associado é

podemos “completar” toda a imagem de maneira contínua. O domínio terá um aspecto semelhante a este

porém com um detalhe que não está representado nessa figura. O \theta = 2\pi do último plano, o azul, correspondendo a raiz k=2, deve ser identificado como o \theta = 0 do plano amarelo, que corresponde à raiz k=0. Obviamente, esta superfície terá autointersecção se representada em R^3, veja abaixo

De maneira muito interessante, se definirmos uma parametrização para esta superfície tal que 0\le \theta \le 6\pi, sendo 0\le \theta \le 2\pi o plano amarelo, 2\pi \le \theta \le 4\pi o vermelho, e 4\pi \le \theta \le 6\pi o azul, teremos que as três raízes serão descritas por uma única  expressão:

\sqrt[3]{z} = \sqrt[3]{\rho} \exp\left( i \frac{\theta}{3}  \right).

Finalizando este tópico de superfícies, vão abaixo duas imagens da “sela do macaco” comentada em aula, cuja expressão é

z =x^3 -3xy^2.

 

Séries de Taylor

Acho que vale a pena repetir os argumentos que mostram que toda função analítica tem série de Taylor. O ponto de partida é a Integral de Cauchy

f(z) = \frac{1}{2\pi i} \oint_\gamma \frac{f(w)}{w-z} dw

e suas equivalentes para as derivadas de f(z)

\frac{d^n}{dz^n}f(z) = \frac{n!}{2\pi i} \oint_\gamma \frac{f(w)}{(w-z)^{n+1}} dw

Vamos agora considerar um ponto z_0 dentro da região delimitada por \gamma e escrever

f(z) = \frac{1}{2\pi i} \oint_\gamma \frac{f(w)}{w-z_0+z_0- z}  dw = \frac{1}{2\pi i} \oint_\gamma \frac{f(w)}{1 - \frac{z- z_0}{w-z_0}}  \frac{dw}{w-z_0}

Agora, lembrando a identidade

  \frac{1}{1-s} = 1+s+s^2+\cdots +s^n + \frac{s^{n+1}}{1-s}

podemos escrever

f(z) =   \frac{1}{2\pi i} \oint_\gamma \frac{f(w)}{w-z_0} {dw} + \frac{z-z_0}{2\pi i} \oint_\gamma \frac{f(w)}{(w-z_0)^2} {dw} + \cdots + \frac{(z-z_0)^n}{2\pi i} \oint_\gamma \frac{f(w)}{(w-z_0)^{n+1}} {dw} + \xi_n   

sendo

\xi_n  =  \frac{(z-z_0)^{n+1}}{2\pi i} \oint_\gamma \frac{f(w)}{(w-z_0)^{n+1}} \frac{dw}{w-z} 

Utilizando a fórmula de Cauchy e as expressão para as derivadas de f(z), temos finalmente

f(z) =   f(z_0)  (z-z_0) +  \frac{d}{dz}f(z_0) + \frac{(z-z_0)^2 }{2} \frac{d^2}{dz^2}f(z_0)  \cdots + \frac{(z-z_0)^n}{n!} \frac{d^n}{dz^n}f(z_0)  + \xi_n   

Notem que não há nenhuma aproximação aqui, tudo é válido para n. Porém, é possível mostrar (ver, por exemplo, a seção 58 do livro do Churchill) que

\lim_{n\to \infty} |\xi_n| =0,   

estabelecendo-se, desta forma, a existência da série de Taylor para uma f(z) analítica. Em breve nos depararemos com uma outra representação em série de funções que possuem polos: a série de Laurent.