{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bem vindo ao curso \"*SageMath para físicos*\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Esse notebook tem o objetivo introduzir algumas funcionalidades básica do [SageMath](https://pt.wikipedia.org/wiki/SageMath). Como o curso durará apenas uma semana, e nosso objetivo será aplicar a ferramenta para resolver problemas de física, é imprescindível que você tenha uma familiaridade mínima com o ambiente do Sage. Faça testes, mude parâmetros, experimente as funcionalidades do guia de referência e anote suas dúvidas para que possamos discutir sobre elas no decorrer do curso. Embora a linguagem de programação adotada pelo Sage seja o Python, saber Python, apesar de útil, não será necessário para acompanhar o curso. Mas saber um pouco de física e matemática certamente será." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Jupyter notebook (o essencial)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "O documento que você está lendo é um _notebook jupyter_, ele contém contém textos explicativos e códigos de Sage intercalados. O jupyter é um ambiente bastante versátil e poderoso, discutiremos um pouco sobre ele no curso. Em um _notebook_, as unidades básicas de texto ou código são chamadas de **células**. O importante agora é entender o funcionamento básico delas. É aqui que você entrará com os comandos sage, códigos Python, texto, códigos latex, html, etc. Vamos focar nos comandos Sage nesse momento. As células de código vêm precedidas por `[ ]`. Para executar o comando contido em uma célula basta pressionar SHIFT+ENTER. Experimente agora na célula abaixo. Digite `sin(pi/2) - sqrt(8)`, ou `plot(exp(-x^2),(x,-3,3))`, por exemplo." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Digite agora `show(sin(pi/2) - sqrt(8))`. Percebe alguma diferença?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Outra forma de avaliar o conteúdo de uma célula é usar o botão \"Run\" na barra de ferramentas do jupyter (como no vídeo sobre a instalação/cocalc)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Atribuições e relações" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Assim como em Python, no Sage o símbolo `=` é o operador usado para atribuição. Ou seja, a operação de guardar um valor em uma variável Python. Os símbolos `==`, `<=`, `>=`, `<` e `>` são usandos para comparação. Teste os comandos `a=2;a`, `a>3`, `a<=4`, `a==2`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Algumas expressões matemáticas retornam valores simbólicos 'exatos', como `sin(1)`, em vez de aproximações numéricas. Para obter uma apreximação numérica, use a função ``n`` ou o método ``n`` (ambos\n", "possuem um nome longo, ``numerical_approx``, e a função ``N`` é o mesma que ``n``). Essas funções aceitam o argumento opcional ``digits``, que é o número de dígitos decimais de precisão requisitado." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Teste isso digitando os comandos ``exp(2)``, `n(exp(2))`, `sin(10).n(digits=5)`, `N(sin(10), digits=10)` ou `numerical_approx(pi, digits=100)`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "O Python é uma linguagem de tipagem dinâmica, isso significa que cada variável possui um tipo associado, mas uma mesma variável pode receber dados de diferentes tipos." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = 5 # a é um inteiro\n", "type(a)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = 5/3 # agora é um racional\n", "type(a)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = 'Olá' # agora uma string\n", "type(a)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = tan(x) # e agora uma expressão simbólica\n", "type(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As linguagens de programação C e Java, por exemplo, são de tipagem estática. Portanto uma variável que foi declarada como int pode apenas armazenar números inteiros." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Expressões simbólicas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Além das variáveis Python, responsáveis por guardar alguma informação na memória, existem as variáveis simbólicas, usadas nos cálculos simbólicos que faremos durante todo o curso. Variáveis simbólicas precisam ser declaradas. Exceto `x`, que já é pré declarada. Declare as variáveis simbólicas `y` e `z` usando o comando `var('y,z')`. Defina agora alguma expressão com as variáveis simbólicas disponíveis, como `1/(x^2-y^2)`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A função ``solve`` resolve equações. Para usá-la, as variáveis simbólicas utilizadas na equação já precisam ter sido declaradas. Os argumentos da função ``solve`` são uma equação (ou um sistema de equações), e a variável ou variáveis para as quais resolver. Tente `solve(x^2 + 3*x + 2==0, x)`, `solve([x^2 + y*x + z == 0],x)` ou `solve([x+y==6, x-y==4], x, y)`. Teste alguns comandos do guia de referência rápida." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Como obter ajuda?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A forma mais simples é digitando o nome de uma função do Sage seguida por um ponto de interrogação. Teste `cos?` ou `plot?`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Se ao invés de `?` você digitar `??`, o Sage mostrará o código fonte daquela função." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Onde mais?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tutorial oficial de funcionalidades básicas (em português): \n", "https://doc.sagemath.org/html/pt/tutorial/index.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tutoriais temáticos:\n", "https://doc.sagemath.org/html/en/thematic_tutorials/index.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Manual de referência:\n", "https://doc.sagemath.org/html/en/reference/index.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Livros" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Excelente referência tanto para Sage quanto para o básico de Python para Sage (grátis): \n", "- http://sagebook.gforge.inria.fr/english.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Outra boa referência, em espanhol, focada em estudantes de graduação (grátis):\n", "- http://www.sage-para-estudiantes.com/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Livro recente em português, editado pela sociedade brasileira de matemática (esse eu ainda não conheço):\n", "- https://sagectu.com.br/index.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tutorial por Michael E. O'Sullivan, da San Diego State University (grátis)\n", "\n", "- [On-line](https://mosullivan.sdsu.edu/Teaching/sdsu-sage-tutorial/index.html)\n", "- [PDF](https://mosullivan.sdsu.edu/Teaching/sdsu-sage-tutorial/SDSUSageTutorial.pdf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Teste as funções do guia de referência rápida!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%display latex" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercícios" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Gaussiana\n", "\n", " a. Verifique que $\\displaystyle\\int\\limits_{-\\infty}^\\infty e^{-\\frac{1}{2}x^2}dx = \\sqrt{2\\pi}$\n", " \n", " b. Defina a variável simbólica \"$a$\". Assuma $a>0$ e determine $\\displaystyle\\int\\limits_{-\\infty}^\\infty e^{-\\frac{1}{2}ax^2}dx$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "3. Oscilador amortecido\n", "\n", " a. Oscilador amortecido $$m\\ddot{y}(t) +b\\dot{y}(t)= -ky(t).$$\n", "\n", "Para resolver a EDO você precisará:\n", " - Definir as variáveis simbólicas e funções involvidas (ver guia de referencia rápida);\n", " - Estabelecer a equação diferencial;\n", " - Assuma $4mk-b^2>0$;\n", " - Resolver a equação diferencial usando o comando `desolve`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A sintáxe do comando é `desolve(equação, dvar, ivar=t)`, onde `dvar` é a variável dependente e `ivar=t` indica que a variável independente e $t$. Use a ajuda `desolve?` se necessário." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "b. Suponha que um sistema mecânico seja governado por pela equação diferencial $$\\ddot{y}(t) +\\frac{1}{5}\\dot{y}(t)= -\\frac{1}{4}y(t).$$\n", "Encontre a solução assumindo as condições iniciais $$y(0) = \\frac{1}{2}, \\dot{y}(0) = \\frac{7}{4}.$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para incluir as condições iniciais, use `desolve(equação, dvar, ics=[t_0, y(t_0), y'(t_0)])`, onde `t_0, y(t_0), y'(t_0)` são as tais condições." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "c. Plote um gráfico da solução encontrada no intervalo $0