"Sage é um software matemático gratuito e 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. Ele engloba e se utiliza de pacotes pré-existentes como Maxima, GAP, Pari/GP, softwares de renderização de imagens e outros, integrando-os em uma interface única, amigável e de fácil assimilação."
Neste blog divulgarei o meu progresso de aprendizagem no Sage e tentarei aplicá-lo, na medida do possível, na minha principal área de interesse, que é a Física.
Conheça mais sobre o software em: http://www.sagemath.org/

sexta-feira, 28 de setembro de 2012

Tutorial do Sage - 02


Obtendo ajuda

Para obter informações sobre uma função ou constante (por exemplo) é só digitar o seu nome seguido do símbolo de interrogação: 

sage: pi?

Type:           Expression
Base Class:     <type 'sage.symbolic.expression.Expression'>
String Form:    pi
Namespace:      Interactive
Length:         0
File:           /opt/sage-4.8/local/lib/python2.6/site-packages/sage/symbolic/expression.so
Definition:     pi(self, *args, **kwds)
Docstring:
       Nearly all expressions are created by calling
       new_Expression_from_*, but we need to make sure this at least
       doesn't leave self._gobj uninitialized and segfault.
    
       TESTS:
Type:           Expression
Base Class:     <type 'sage.symbolic.expression.Expression'>
Type:           Expression
Base Class:     <type 'sage.symbolic.expression.Expression'>
String Form:    pi
Namespace:      Interactive
Length:         0
File:           /opt/sage-4.8/local/lib/python2.6/site-packages/sage/symbolic/expression.so
Definition:     pi(self, *args, **kwds)
Docstring:
       Nearly all expressions are created by calling
       new_Expression_from_*, but we need to make sure this at least
       doesn't leave self._gobj uninitialized and segfault.
    
       TESTS:
    
          sage: sage.symbolic.expression.Expression(SR)
          0
          sage: sage.symbolic.expression.Expression(SR, 5)
          5
    
       We test subclassing "Expression":
    
          sage: from sage.symbolic.expression import Expression
          sage: class exp_sub(Expression): pass
          sage: f = function('f')
          sage: t = f(x)
          sage: u = exp_sub(SR, t)
          sage: u.operator()
          f

Constructor Docstring:
       Nearly all expressions are created by calling
       new_Expression_from_*, but we need to make sure this at least
       doesn't leave self._gobj uninitialized and segfault.
.
.
.

sage: sin?

Type:           Function_sin
Base Class:     <class 'sage.functions.trig.Function_sin'>
String Form:    sin
Namespace:      Interactive
File:           /opt/sage-4.8/local/lib/python2.6/site-packages/sage/functions/trig.py
Definition:     sin(self, *args, coerce=True, hold=False, dont_call_method_on_arg=False)
Docstring:
       The sine function.
    
       EXAMPLES:
    
          sage: sin(0)
          0
          sage: sin(x).subs(x==0)
          0
          sage: sin(2).n(100)
          0.90929742682568169539601986591
          sage: loads(dumps(sin))
          sin
    
       We can prevent evaluation using the "hold" parameter:
    
          sage: sin(0,hold=True)
          sin(0)
    
       To then evaluate again, we currently must use Maxima via
       "sage.symbolic.expression.Expression.simplify()":
    
          sage: a = sin(0,hold=True); a.simplify()
          0
    
       TESTS:
    
          sage: conjugate(sin(x))
          sin(conjugate(x))

Constructor Docstring:
       The sine function.
    
       EXAMPLES:
    
          sage: sin(0)
          0
.
.
.

é possível completar as funções/comandos do Sage usando a tecla TAB.

Funções, Indentação e  Contagem

Para definir uma função no Sage utiliza-se o comando def e dois pontos após a lista de variáveis definidas. Ex: 

sage: def par(n):
....:     return n%2==0
....: 
sage: par(3)
False
sage: par(6)
True

Não é necessário especificar o tipo de qualquer argumento de entrada e as funções podem ter múltiplos argumentos. Cada argumento pode ter um valor padrão, que é usado caso não for passado nenhum outro valor. Ex:

sage: def divisivel_por(numero,divisor=3):
....:     return numero%divisor==0
....: 
sage: divisivel_por(4,2)
True
sage: divisivel_por(4)
False
sage: divisivel_por(6)
True

Como o Sage é uma interface em Python, os blocos de código não são indicados por chaves ou qualquer sinalizador de inicio e fim mas sim pela própria indentação. Ex

(sem erro de indentação)
sage: def pares_ate(n):
....:     v=[]
....:     for i in range(3,n):
....:         if i%2==0:
....:             v.append(i)
....:     return v
....: 
sage: pares_ate(12)
[4, 6, 8, 10]

(com erro de indentação)
sage: def pares_ate(n):
....:     v=[]
....:     for i in range(3,n):
....:         if i%2==0:
....:             v.append(i)
....: return v    
------------------------------------------------------------
   File "<ipython console>", line 6
     return v
          ^
SyntaxError: invalid syntax

Ponto e virgula (;) no final de atribuições de variáveis, por exemplo, não é necessário, quando as declarações são feitas em linhas separadas. No caso de fazer mais de uma declaração na mesma linha é preciso usar o ponto e vírgula. 

sage: a=3  
sage: b=a+2
sage: b
5
sage: a=4; b=a-1; b
3

Caso queira que uma linha de código continue na próxima, é só usar a barra invertida (\):

sage: 5 + \
....: 6
11

No Sage é possível fazer uma contagem iterando no domínio dos inteiros. Por exemplo, a iteração for(i=0; i<5; i++) no C++ ou Java, no Sage, fica:

sage: for i in range(5):
....:     print i
....:     
0
1
2
3
4
Se quisermos que a iteração comece de um número diferente de zero:

sage: for i in range(3,5):           
....:     print i
....:     
3
4

Se quisermos especificar também o passo da iteração, acrescentamos mais um argumento: 

sage: for i in range(2,7,2):             
....:     print i
....:     
2
4
6

A estrutura mais básica no Sage é uma lista. Um lista pode ser criada, por exemplo, pelo comando range:

sage: range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Uma lista pode ser armazenada em uma variável e ela pode ter não só números, mas textos e funções, por exemplo:

sage: w = [3, "oi", 5/3, tan(x^2)]
sage: w
[3, 'oi', 5/3, tan(x^2)]

A indexação da lista começa do zero:

sage: w[0]
3

Use len(w) para obter o comprimento de w, use w.append(obj) para acrescentar um novo objeto no final da lista w, e use del w[i] para deletar a i-ésima entrada de w.


sage: len(w)
4
sage: w.append(e^2)
sage: w
[3, 'oi', 5/3, tan(x^2), e^2]
sage: del w[3]
sage: w
[3, 'oi', 5/3, e^2]

Outra estrutura de dados importante é o dicionário. Ele funciona como uma lista, exceto que pode ser indexado por quase qualquer objeto e é delimitado por chaves: 

sage: k = {'oi':5, 9.9:e, pi:'teste'}
sage: k[9.9]
e
sage: k['oi']
5
sage: k[pi]
'teste'

Nenhum comentário:

Postar um comentário