{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# SageMath físicos\n", "***\n", "Rogério T. C." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "**SageMath** (ou simplesmente Sage) é um sistema de computação algébrica. Dentre outras, algumas vantágens de usar sistemas desse tipo são:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Você pode se concentrar mais nas idéias (modelo, formulação, teoria) e menos nas \"contas\";" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Os resultados estendidos, generalizados e analisados com facilidade;" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Você pode explorar a estrutura matemática em torno do seu problema, o Sage é ótimo para isso;" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "- Seus resultados podem ser compartilhados de uma forma reproduzível;" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Depois de investir algum tempo aprendendo o básico, você poderá resolver problema de forma muito mais rápido e com mais ferramentas;" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Você só precisa saber um conjunto básico de comandos e sintaxe, e para todo o restante pode usar os recursos de ajuda e a documentação;" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Tópicos da aula de hoje" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "1. Pré-documento;\n", "2. Operações básicas;\n", "3. Variáveis simbólicas;\n", "4. Expressões simbólicas;\n", "5. Equações, inequações e sistemas\n", "6. Ferramentas de cálculo\n", "7. Substituições em expressões simbólicas\n", "8. Equações diferenciais ordinárias" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Aula I" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 1. Pré-documento" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Você pode fazer o jupyter exibir as equações no formato $\\LaTeX{}$ digitando `%display latex` em uma célula." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "%display latex # outras opções são plane, ascii_art e unicode_art" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "reset() #inicializa todas as variáveis" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 2. Operações Básicas" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "No Sage as operações básicas com números reais, complexos, racionais, etc., são realizadas como nas calculadoras científicas. Frações e raízes são automaticamente simplificadas" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{21}{10}\n", "\\end{math}" ], "text/plain": [ "21/10" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "15/25+3/2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{2 \\, \\sqrt{5}}{\\pi}\n", "\\end{math}" ], "text/plain": [ "2*sqrt(5)/pi" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sqrt(20)/pi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aproximação numérica" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}4.47213595499958\n", "\\end{math}" ], "text/plain": [ "4.47213595499958" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sqrt(20).n()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}4.47213595499958\n", "\\end{math}" ], "text/plain": [ "4.47213595499958" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sqrt(20.0)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Algumas operações e funções básicas do Sage:\n", "\n", "|Operação|Sintáxe|\n", "|:-:|:-:|\n", "|4 operações | `a+b, a-b, a*b, a/b`|\n", "|Potêmcia | `a**b ou a^b`|\n", "|Raiz quadrada | `sqrt(a)`|\n", "|Divisão inteira | `a//b`|\n", "|Resto na divisão | `a%b`|\n", "|Fatorial | `factorial(a)`|\n", "|Coeficiente binômial $\\begin{pmatrix} a\\\\ b\\end{pmatrix}$ | `binomial(a,b)`|\n", "|Parte inteira | `floor(a)`|\n", "|Valor absoluto | `abs(a)`|\n", "|Aproximação numérica | `N(a) ou a.n()`|" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 3. Variáveis simbólicas" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Existem dois tipos básicos de variáveis no sage:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* As variáveis simbólicas, usadas nos cálculos simbólicos;" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Variáveis python, que são usadas para guardas alguma informação na memória. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Variáveis simbólicas precisam ser declaradas. Exceto `x`, que já vem pré-declarada." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(u, y, w, a, b, c\\right)\n", "\\end{math}" ], "text/plain": [ "(u, y, w, a, b, c)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('u y w a b c') " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Uma lista de varáveis simbólicas indexadas pode ser criada com:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\left(x_{0}, x_{1}, x_{2}, x_{3}\\right)\n", "\\end{math}" ], "text/plain": [ "(x0, x1, x2, x3)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = var('x',n=4)\n", "X" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}x_{1}\n", "\\end{math}" ], "text/plain": [ "x1" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Você pode tammbém definir o domínio e um nome $\\LaTeX{}$ para variáveis simbólicas." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}{\\bar{\\alpha}}\n", "\\end{math}" ], "text/plain": [ "alp_bar" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('alp_bar', latex_name=r'\\bar{\\alpha}', domain='real')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}{\\bar{\\alpha}}\n", "\\end{math}" ], "text/plain": [ "alp_bar" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alp_bar" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Variáveis simbólicas são usadas, por exemplo, para declarar funções." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}u \\ {\\mapsto}\\ \\cos\\left(u\\right)^{6} + \\sin\\left(u\\right)^{6} + 3 \\, \\cos\\left(u\\right)^{2} \\sin\\left(u\\right)^{2}\n", "\\end{math}" ], "text/plain": [ "u |--> cos(u)^6 + sin(u)^6 + 3*cos(u)^2*sin(u)^2" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(u)=cos(u)^6 + sin(u)^6 + 3 * sin(u)^2 * cos(u)^2\n", "f" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Código $\\LaTeX$" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\\cos\\left(u\\right)^{6} + \\sin\\left(u\\right)^{6} + 3 \\, \\cos\\left(u\\right)^{2} \\sin\\left(u\\right)^{2}\n" ] } ], "source": [ "print(latex(f(u)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Assim como Python, o Sage usa o paradigma de orientação ao objeto. Se você digitar `.` após o nome de um objeto e apertar a tecla Tab, será exibda uma lista de métodos associados a este objeto." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "* A última saída é armazenada na variável `_` \n", "* Penúltima em `__` \n", "* Antepenúltima `___`" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}u \\ {\\mapsto}\\ \\cos\\left(u\\right)^{6} + \\sin\\left(u\\right)^{6} + 3 \\, \\cos\\left(u\\right)^{2} \\sin\\left(u\\right)^{2}\n", "\\end{math}" ], "text/plain": [ "u |--> cos(u)^6 + sin(u)^6 + 3*cos(u)^2*sin(u)^2" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "_" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Um `?` após o nome de uma função exibe uma descrição da mesma, geralmente com alguns exemplos." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": true }, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 4. Expressões simbólicas" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Expressões simbólicas podem ser manipuladas de várias formas" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}{\\left(x + y\\right)} {\\left(x + 1\\right)}^{2}\n", "\\end{math}" ], "text/plain": [ "(x + y)*(x + 1)^2" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p = (x+y)*(x+1)^2; p" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}x^{3} + x^{2} y + 2 \\, x^{2} + 2 \\, x y + x + y\n", "\\end{math}" ], "text/plain": [ "x^3 + x^2*y + 2*x^2 + 2*x*y + x + y" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p2 = p.expand(); p2" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}x^{3} + x^{2} {\\left(y + 2\\right)} + x {\\left(2 \\, y + 1\\right)} + y\n", "\\end{math}" ], "text/plain": [ "x^3 + x^2*(y + 2) + x*(2*y + 1) + y" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p2.collect(x) #potências da x" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}{\\left(x + y\\right)} {\\left(x + 1\\right)}^{2}\n", "\\end{math}" ], "text/plain": [ "(x + y)*(x + 1)^2" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p2.factor()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Identidades trigonômétricas podem ser utilizadas com `.expand_trig()`" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\cos\\left(y\\right) \\sin\\left(x\\right) + \\cos\\left(x\\right) \\sin\\left(y\\right)\n", "\\end{math}" ], "text/plain": [ "cos(y)*sin(x) + cos(x)*sin(y)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sin(x+y).expand_trig()" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\frac{\\tanh\\left(x\\right) + \\tanh\\left(y\\right)}{\\tanh\\left(x\\right) \\tanh\\left(y\\right) + 1}\n", "\\end{math}" ], "text/plain": [ "(tanh(x) + tanh(y))/(tanh(x)*tanh(y) + 1)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tanh(x+y).expand_trig()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Ou simplificadas usando `trig_simplify()`" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}\\cos\\left(u\\right)^{6} + \\sin\\left(u\\right)^{6} + 3 \\, \\cos\\left(u\\right)^{2} \\sin\\left(u\\right)^{2}\n", "\\end{math}" ], "text/plain": [ "cos(u)^6 + sin(u)^6 + 3*cos(u)^2*sin(u)^2" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(u)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}-6 \\, \\cos\\left(u\\right)^{5} \\sin\\left(u\\right) + 6 \\, \\cos\\left(u\\right) \\sin\\left(u\\right)^{5} + 6 \\, \\cos\\left(u\\right)^{3} \\sin\\left(u\\right) - 6 \\, \\cos\\left(u\\right) \\sin\\left(u\\right)^{3}\n", "\\end{math}" ], "text/plain": [ "-6*cos(u)^5*sin(u) + 6*cos(u)*sin(u)^5 + 6*cos(u)^3*sin(u) - 6*cos(u)*sin(u)^3" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(u).diff()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}1\n", "\\end{math}" ], "text/plain": [ "1" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(u).trig_simplify()" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}0\n", "\\end{math}" ], "text/plain": [ "0" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f(u).diff().trig_simplify()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Manipulação simbólica de polinômios:\n", "\n", "Função | Comando\n", ":--- | :---\n", "expandir | `expand()`\n", "polinômio em `x` | `collect(x)`\n", "Fatorar | `factor()`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Funções trigonométricas:\n", "\n", "Função | Comando\n", ":--- | :---\n", "Simplificação | `trig_simplify()`\n", "Linearização | `reduce_trig()`\n", "Expansão | `expand_trig()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Raízes e frações:\n", "\n", "Função | Comando\n", ":--- | :---\n", "Somar frações com o mesmo denominador | `combine()`\n", "Rotina de simplificações com raízes e frações(muito útil) | `canonicalize_radical()`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Geral:\n", "\n", "Função | Comando\n", ":--- | :---\n", "Simplificação | `simplify()`\n", "Simplificação completa | `full_simplify()`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 5. Equações, inequações e sistemas" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Equações podem ser definidas por expressões simbólicas e guardadas em variáveis python e manipuladas." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/latex": [ "\\begin{math}\n", "\\newcommand{\\Bold}[1]{\\mathbf{#1}}y^{2} - \\frac{2 \\, y}{\\cos\\left(\\phi\\right)} + \\frac{5}{\\cos\\left(\\phi\\right)^{2}} - 4 = 0\n", "\\end{math}" ], "text/plain": [ "y^2 - 2*y/cos(phi) + 5/cos(phi)^2 - 4 == 0" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "var('phi')\n", "eq0 = y**2 - 2/cos(phi)*y + 5/cos(phi)**2 - 4 == 0; eq0" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "