CoCalc Shared Filesaula8_SageMath.sagewsOpen in CoCalc with one click!
Author: Gastão Junior
Views : 16

SageMath (por exemplos)

 

SageMath é um software matemático livre e de código aberto (open-source), desenvolvido sob a licença GPL por uma comunidade de programadores e matemáticos, que busca ser uma alternativa para os principais sistemas proprietários de software matemático como o Magma, Maple, Mathematica e Matlab. Na instalação padrão do SageMath temos boa parte das bibliotecas (ou pacotes) que possibilitam trabalharmos com diversas áreas:

Pacotes de matemática contidos no SageMath

Álgebra  GAP, Maxima, Singular, Macaulay 2
Geometria algébrica Singular, Macaulay 2
Aritmética de precisão arbitrária MPIR, MPFR, MPFI, NTL, mpmath
Geometria aritmética PARI/GP, NTL, mwrank, ecm
Cálculo Maxima, SymPy, GiNaC
Combinatória Symmetrica, Sage-Combinat
Álgebra linear ATLAS, BLAS, LAPACK, NumPy, LinBox, IML, GSL
Teoria dos gráficos NetworkX
Teoria dos grupos GAP
Computação numérica GSL, SciPy, NumPy, ATLAS, Scilab, GNU_Octave
Teoria dos números PARI/GP, FLINT, NTL, Kash/Kant
Computação estatística R, SciPy

 

Utilizando como sintaxe básica o PYTHON, podemos usar essa ferramenta com as mesmas funções e importando boa parte das mesmas bibliotecas que vinhamos usando.

Vejamos alguns exemplos para por em prática nossos conhecimentos de Python + SageMath.

[Exemplo 1:  Álgebra linear] Balanço de Reações Químicas

Sabemos que o hidrogênio (H2H_2) reage com o oxigênio (O2O_2) para produzir água (H2OH_2 O). Mas, quanto de hidrogênio e oxigênio precisamos? Esta é uma mudança que podemos descrever do seguinte modo: xx moléculas de H2H_2 reagem com yy moléculas de O2O_2 produzindo zz moléculas de H2OH_2O, ou ainda

xH2+yO2zH2Ox\, H_2 + y\,O_2 \, \rightarrow \, z\, H_2O

Como os átomos não são modificados, o número de átomos de cada elemento no início da reação deve ser igual ao número de átomos desse mesmo elemento no final da reação.

{ 2x2z=0 2yz=0.\left \{ \begin{matrix}  2x -2z & = & 0 \\  2y - z & = & 0 \end{matrix} . \right .

Vamos procurar o conjunto solução para este sistema de equações.

## Definindo as variaveis x,y,z = var('x y z') ## Usando o comando "solve" para encontrar ## o conjunto solucao. solucao = solve([2*x - 2*z == 0,2*y - z == 0],[x,y]) ## Exibindo a solucao. show(solucao[0])
[x=z\displaystyle x = z, y=12z\displaystyle y = \frac{1}{2} \, z]

[Exercício 1]

Encontre o balanço das reações químicas:

(a) N2O5N2+O2 N_2O_5 \rightarrow N2 + O_2 ;

(b) (NH4)2CO3NH3+H2O+CO2(NH_4)_2 CO_3 \rightarrow NH_3 + H_2O + CO_2.

### Resolva ...

[Exemplo 2:  Um pouco de Álgebra] Matrizes de Permutação

Dada a matriz identidade de ordem 3×33\times 3 dada por

I3=(100010001) I_3 = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}

permutando as linhas obtemos as seguintes matrizes:

P12=(010100001),P13=(001010100),P23=(100001010). P_{12} = \begin{pmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{pmatrix}, P_{13} = \begin{pmatrix} 0 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 0 \end{pmatrix}, P_{23} = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{pmatrix}.

Para nos ajudar na legenda, vamos denotar A=P12A = P_{12}, B=P13B = P_{13} e C=P23C = P_{23}.

Dada uma matriz arbitrária

M=(abcdefghi),M = \begin{pmatrix} a & b & c \\ d & e & f \\ g & h & i \end{pmatrix},

Usando o produto de matrizes, temos:

### Vetores da base canonica e1, e2, e3. e1 = [1,0,0] e2 = [0,1,0] e3 = [0,0,1] ### Definindo as matrizes de Permutacao P123 = matrix([e1,e2,e3]) P132 = matrix([e1,e3,e2]) P213 = matrix([e2,e1,e3]) P231 = matrix([e2,e3,e1]) P312 = matrix([e3,e1,e2]) P321 = matrix([e3,e2,e1]) ### Mostrando as matrizes show(P123,P132) show(P213,P231) show(P312,P321)
(100010001)\displaystyle \left(\begin{array}{rrr} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right) (100001010)\displaystyle \left(\begin{array}{rrr} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{array}\right)
(010100001)\displaystyle \left(\begin{array}{rrr} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{array}\right) (010001100)\displaystyle \left(\begin{array}{rrr} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{array}\right)
(001100010)\displaystyle \left(\begin{array}{rrr} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{array}\right) (001010100)\displaystyle \left(\begin{array}{rrr} 0 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 0 \end{array}\right)
### Efetuando os produtos com a matriz M show(P123*M, P213*M, P132*M)
Error in lines 1-1 Traceback (most recent call last): File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1191, in execute flags=compile_flags), namespace, locals) File "", line 1, in <module> NameError: name 'M' is not defined
### Sendo: A = P123 B = P132 C = P213 D = P231 E = P312 F = P321 show(A*A,A*B,A*C,A*D,A*E,A*F) show(B*A,B*B,B*C,B*D,B*E,B*F)
(100010001)\displaystyle \left(\begin{array}{rrr} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right) (100001010)\displaystyle \left(\begin{array}{rrr} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{array}\right) (010100001)\displaystyle \left(\begin{array}{rrr} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{array}\right) (010001100)\displaystyle \left(\begin{array}{rrr} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{array}\right) (001100010)\displaystyle \left(\begin{array}{rrr} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{array}\right) (001010100)\displaystyle \left(\begin{array}{rrr} 0 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 0 \end{array}\right)
(100001010)\displaystyle \left(\begin{array}{rrr} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{array}\right) (100010001)\displaystyle \left(\begin{array}{rrr} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right) (010001100)\displaystyle \left(\begin{array}{rrr} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{array}\right) (010100001)\displaystyle \left(\begin{array}{rrr} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{array}\right) (001010100)\displaystyle \left(\begin{array}{rrr} 0 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 0 \end{array}\right) (001100010)\displaystyle \left(\begin{array}{rrr} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{array}\right)

[Exercício]

Com as informações obtidas, podemos preencher parte da tabela, complete-a.

 ABCDEF AA BCDEFBBADCFEB??????C?????? D??????E?????? \begin{array}{c|cccccc} \ast &  A & B & C & D & E & F  \\ \hline A & A &  B & C & D & E & F \\ B & B & A & D & C & F & E \\ B & ? & ? & ? & ? & ? & ? \\ C & ? & ? & ? & ? & ? & ?  \\ D & ? & ? & ? & ? & ? & ? \\ E & ? & ? & ? & ? & ? & ? \end{array}

Neste exemplo, abordamos o conjunto das Matrizes de Permutação. Há uma estrutura que tem o mesmo comportamento, é o Grupo de Simetrias dos vértices de um triângulo.

   

ou observando os apenas os eixos de simetria:

Uma outra forma de montar a tabela é:

### Definindo o grupo finito de simetrias triangle = SymmetricGroup(3) ### Montando a tabela das multiplicacoes triangle.cayley_table()
* a b c d e f +------------ a| a b c d e f b| b a d c f e c| c e a f b d d| d f b e a c e| e c f a d b f| f d e b c a

[Exemplo 3: Equações Diferenciais Ordinárias] Pendulo Simples.

 Denota-se o ângulo formado entre a vertical e o braço de pêndulo. Faz-se as seguintes hipóteses:

  1. O braço é formado por um fio não flexível que se mantém sempre com o mesmo formato e comprimento.
  2. Toda a massa, , do pêndulo está concentrada na ponta do braço a uma distância constante do eixo.
  3. Não existem outras forças a atuar no sistema senão a gravidade e a força que mantém o eixo do pêndulo fixo. (O movimento é portanto conservativo).
  4. O pêndulo realiza um movimento bidimensional no plano xy.

Note que a segunda lei de Newton fornece a seguinte equação diferencial ordinária não-linear conhecida como equação do pêndulo:

d2θdt2+gLsin(θ)=0. \dfrac{d^2 \theta}{d t^2} + \dfrac{g}{L} \sin(\theta) = 0.

Uma versão simplificada (para pequenas oscilações em torno de um ponto de equilíbrio) pode ser definida tomando sin(θ)θ\sin(\theta) \approx \theta, produzindo:

d2θdt2+gLθ=0. \dfrac{d^2 \theta}{d t^2} + \dfrac{g}{L} \theta = 0.

Será esta que vamos buscar uma solução através do SageMath.

T,t=var('T,t') theta = function('theta', t) L = 4 ## Comprimento da corda. g = 9.8 ## acelaração da Gravidade b = g/L ##### Período do Pêndulo : T=2*pi*(L/g)^(1/2) print "t = ",T #### Equacão do Pêndulo ######## equacao =diff(theta,t,t)+b*theta==0 ##################################### ### Resolvendo a Equação Diferencial ### com condição inicial ### theta (0) = 2*pi/3 (i.e at t=0), ### theta'(0) = 1 (i.e angular velocity=1) ##################################### solucao = desolve_laplace(equacao, dvar=theta, ivar=t, ics=[0,2*pi/3,1]) theta(t)=solucao print "Solução da equação do pêndulo:" show(solucao) ### Plotando a solução para a condição inicial dada. plot(solucao,(0,T))
*** WARNING: Code contains non-ascii characters *** Error in lines 2-2 Traceback (most recent call last): File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1191, in execute flags=compile_flags), namespace, locals) File "", line 1, in <module> File "sage/calculus/var.pyx", line 133, in sage.calculus.var.function (build/cythonized/sage/calculus/var.c:1608) def function(s, **kwds): TypeError: function() takes exactly 1 positional argument (2 given)
### Vamos agora plotar o campo de vetores associado a este problema. ### Definindo a variavel auxiliar "y". y = var('y') ### Plotando o campo de vetores. plot_vector_field((y,-b*(x)), (x,-4,4),(y,-4,4))
Error in lines 2-2 Traceback (most recent call last): File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1191, in execute flags=compile_flags), namespace, locals) File "", line 1, in <module> NameError: name 'b' is not defined
x,y,z=var('x y z') plot_vector_field3d((x*cos(z),-y*cos(z),sin(z)), (x,0,pi), (y,0,pi), (z,0,pi))
3D rendering not yet implemented