{
"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