Página Web do Sadao Massago

Página de Maxima

\( \DeclareMathOperator{\abs}{abs} \)

Introdução ao Maxima

Autor: Sadao Massago
instituição: DM-UFSCar
web: http://www.dm.ufscar.br/~sadao
data: 2010-06-19
site do maxima e manual
http://maxima.sourceforge.net/
http://maxima.sourceforge.net/documentation.html
Um dos manuais mais recomendado é
http://maxima.sourceforge.net/docs/manual/en/maxima.html
A versão em PDF em
http://maxima.sourceforge.net/docs/manual/en/maxima.pdf
A versão em português (um pouco desatualizado) em
http://maxima.sourceforge.net/docs/manual/pt/maxima.html

Para executar <cntrl><ENTER> executa o bloco de comandos onde o cursor está <ctrl>R executa todo arquivo
Para acrescentar codigos e comentários F5 abre o campo de comando F6 abre o campo de comentário (texto)
Estes e outros comandos estão no menu "cell".
F1 abre a ajuda do Maxima. Se o cursor estiver sobre a palavra, procurara por esta paravra na ajuda.

1 O que é maxima

O sistema maxima é uma versão de código aberto do sistema macsyma desenvolvido para manipulação  simbólica, similar ao sistema comercial como Maple, Mathematica e Derive.
Por ser de código aberto, o maxima pode ser obtido e usado gratuitamente, incluindo o uso comercial e é um dos mais completos sistemas de matemática simbólica de código aberto.
A interface gráfica A interface gráfica mais popular é o wxmaxima que é instalado junto a maxima na versão windows e distribuido como pacote opcional para linux.
Formato de arquivo suportado pelo wxmaxima são
wxm → formato no modo texto que pode ser editado ou executado fora do wxmaxima,  pois parte de texto e TAG's especificos para wxmaxima estão como  comentário do maxima.  No entanto, arquivos alterados fora do wxmaxima que não estiver com  formatação  adequada, pode não ser mais compativeis com o wxmaxima.  Neste formato, a saída de maxima não serão salvas.
wxmx → O formato de arquivo em XML.  Não pode ser executado pelo maxima sem intermedio de wxmaxima.  Neste formato, o resultado da execussão também serão salvas.
mac → formato modo texto para maxima.  A parte de texto ficam como comentário e os TAG's especificos  para formatação no wxmaxima serão eliminados.  Parte do comando é igual ao do wxm, mas parte de comentário  ficam bem mais limpos.  O wxmaxima pode executar o formato mac, mas não abre para a edição.
Obs.: wxmaxima pod esportar no formato HTML para disponibilizar na página web.
Tambem existe a interface gráfica clássica que é xmaxima, mas não é focado na edição de arquivos, mas para execução  de comandos.
O maxima, wxmaxima e sua documentação  estão sendo distribuidos gratuitamente pelo site oficial
http://maxima.sourceforge.net/
http://maxima.sourceforge.net/documentation.html

WXMAXIMA gera comandos pelo menu
O wxmaxima permite gerar diversos comandos tais como manipulação  das expressoes, diferenciação  e integração, gráficos, etc. Para isso, basta escolher o item desejado no menu da interface.
Neste tutorial, será apresentado os conceitos básicos necessários para resolução  de problemas mais complexas, mas para tarefas simples, o uso do menu para gerar comandos permite efetuar diversas tarefas sem precisar conhecer a linguagem macsyma (usado pelo maxima)

2 Expressões

Expressão é similar a outros sistemas computacionais "+", "-", "*" e "/' são usados para adição, subtração, multiplição e divisão. "^" para potenciação. "!" e "!!" para fatorial e duplo fatorial.
Obs.: Para produto e potenciação não comutativa como o produto e ptenciação de matrizes, usa-se o "." e "^^"
A expressão terminado em ";" sera exibido na tela A expressão terminado em "$" só sera executado e não será exibida na tela Para abrir uma nova linha, pressione ENTER Para executar, presione <ctrl>ENTER

(%i2) 2+3^2;
3+4$
\[\mathrm{\tt (\%o1) }\quad 11\]

As funções podem ser usadas, mas atente ao fato de que o seno é "sin" e não "sen". Mesmo vale para seno hiperbolico que é "sinh" As letras podem ser usadas como variaveis

(%i3) cos(x)*sin(x);
\[\mathrm{\tt (\%o3) }\quad \mathrm{cos}\left( x\right) \cdot \mathrm{sin}\left( x\right) \]

Constantes "pi", "e", "i", "phi" e "gamma" são precedidas de "%". Note que log é o logaritmo natural e exp é exponencinal

(%i7) cos(%pi/2);
atan(1);
log(%e);
exp(1);
\[\mathrm{\tt (\%o4) }\quad 0\]\[\mathrm{\tt (\%o5) }\quad \frac{\pi }{4}\]\[\mathrm{\tt (\%o6) }\quad 1\]\[\mathrm{\tt (\%o7) }\quad e\]

O último resultado pode ser referenciado pelo "%" Note que "%" é o resultado do último comando executado e não da linha anterior, a menos que seja executado em sequências Portanto, evite de usar "%" para resultado anterior a menos que seja do mesmo bloco de comandos (mesmo campo de entrada)

(%i9) exp(1);
log(%);
\[\mathrm{\tt (\%o8) }\quad e\]\[\mathrm{\tt (\%o9) }\quad 1\]

O valor aproximado como ponto flutuante (decimal) pode ser obtido pelo comando "float"

(%i11) exp(1);
float(exp(1));
\[\mathrm{\tt (\%o10) }\quad e\]\[\mathrm{\tt (\%o11) }\quad 2.718281828459045\]

O maxima faz distinção  entre maiúsculo e minúsculo. Portanto, tomar cuidado "sqrt(2)" é raiz quadrada de 2, mas "Sqrt(2)" ou "SQRT(2)" não é

(%i14) sqrt(2);
Sqrt(2);
SQRT(2);
\[\mathrm{\tt (\%o12) }\quad \sqrt{2}\]\[\mathrm{\tt (\%o13) }\quad \mathrm{Sqrt}\left( 2\right) \]\[\mathrm{\tt (\%o14) }\quad \mathrm{SQRT}\left( 2\right) \]

3 Comentários

O comentário é a parte que não será executado No maxima, comentário é a parte delimitado entre "/*" e "*/"
CUIDADO: no maxima, não pode finalizar o campo de comando com o comentário. Por isso, o wxmaxima sempre grava um string no final do arquivo, o que não é exibido na tela (se abrir o wxm no editor de texto, terá um string no final do arquivo)
CUIDADO quando usa wxmaxima --------------------------- O presente implementação  do wxmaxima (2010), acrescenta automaticamente o ";" após a primeira execussão quando o último item do campo de comando for comentário. Isto não causa problemas desde que sejam executados dentro do wxmaxima.
No entanto, se exportar o código e executar diretamente no maxima, ou carregar como um pacote, isto dará erro.
Por exemplo
sqrt(2); /* sqrt calcula a raiz quadrada */
Após a primeira execussão torna
sqrt(2); /* sqrt calcula a raiz quadrada */;
que é inválido, pois tem ";" sem ter comando (comentário não é comando).
Se tiver algum comando após o comentário, não ocorre tais problemas.
sqrt(2); /* sqrt calcula a raiz quadrada */ float(sqrt(2));
não causa problemas, pois o último item não é comentario
Uma forma de finalizar após comentário na última posição  do campo de comando sem alterar o comportamento do programa como o valor do último resultado (acessado por "%") é colocar "%$"
Assim,
sqrt(2); /* sqrt calcula a raiz quadrada */ %$
sempre será valida.

(%i17) sqrt(2); /* sqrt calcula a raiz quadrada */
float(sqrt(2)); /* obtem aproximação  decimal */ %$
\[\mathrm{\tt (\%o15) }\quad \sqrt{2}\]\[\mathrm{\tt (\%o16) }\quad 1.414213562373095\]

4 Armazenando as expressões

Podemos armazenar as expressões nas variaveis para serem utilizados mais tarde Para atribuir (guardar) uma expressão ou valor, usa-se o ":" Tome cuidado que "=" é reservado para equações (comparacao) e ":=" é reservado para definir uma função.
Usando o ev(), poderá calcular a expressão com valores substituídas
Para ter a expressão (não o valor substituído), coloca-se o apóstrofo (') antes da expressão Não confundir apóstrofos com o acênto agúdo.
O apóstrofo (') deixa de evaluar somente o que segue imediatamente. Para não substituir na expressão inteira, coloque a expressão entre parenteses, precedidos de apóstrofos.

(%i22) x : 2;
ev(x+1);
'x+x^2;
'x+'x^2;
'(x+x^2);
\[\mathrm{\tt (\%o18) }\quad 2\]\[\mathrm{\tt (\%o19) }\quad 3\]\[\mathrm{\tt (\%o20) }\quad x+4\]\[\mathrm{\tt (\%o21) }\quad {{x}^{2}}+x\]\[\mathrm{\tt (\%o22) }\quad {{x}^{2}}+x\]

O comando display() imprime a variável e valor, útil para "ver" o que está armazenado na variável, mas como será expresso na forma de variavel=valor, não deve usar para outros propósitos.

(%i28) x : 1;
y : x+1;
z : '(x+1);
display(x);
display(y);
display(z);
\[\mathrm{\tt (\%o23) }\quad 1\]\[\mathrm{\tt (\%o24) }\quad 2\]\[\mathrm{\tt (\%o25) }\quad x+1x=1\]\[\mathrm{\tt (\%o26) }\quad \mathit{done}y=2\]\[\mathrm{\tt (\%o27) }\quad \mathit{done}z=x+1\]\[\mathrm{\tt (\%o28) }\quad \mathit{done}\]

O maxima exibe o resultado final quando o comando termina em ";" e a forma como exite tal resultado final quando não tem ev() nem apóstrofos depende da configuração  (valor da variavel globel referente).
Dentro do wxmaxima, é configurado para efetuar substituição  no resultado final de exibicao.
Na execussão pelo comando de linha é configurado para exibir a expressão ou o que está armazenado na variável.
em resumo, para a exibição, use - Para exibir o que foi armazenado exatamente, use o display() - Para exibir o resultado da substituição, use o ev() - Para exibir a expressão sem substituir, use '()

(%i33) x : 1;
ev(x+1); /* substitui para exibir */
'(x+1); /* não substitui na exibição  */
x+1; /* depende da configuração  */ %$
\[\mathrm{\tt (\%o29) }\quad 1\]\[\mathrm{\tt (\%o30) }\quad 2\]\[\mathrm{\tt (\%o31) }\quad x+1\]\[\mathrm{\tt (\%o32) }\quad 2\]

Quando não é exibição do resultado final como no caso de armazenar expressão, o padrão e efertuar substituição.
NÃO use display() exceto para exibir resultado na tela.

(%i43) x : 1;
y : x^2+1; /* substitui */
display(y);
z : '(x^2+1); /* não substitui */
display(z);
ev(z); /* efetua substituição  agora */
x : 2; /* troca o valor de x */
ev(y); /* não atualiza o y, pois y não é expressão */
ev(z); /* atualiza o z, pois é expressão */ %$
\[\mathrm{\tt (\%o34) }\quad 1\]\[\mathrm{\tt (\%o35) }\quad 2y=2\]\[\mathrm{\tt (\%o36) }\quad \mathit{done}\]\[\mathrm{\tt (\%o37) }\quad {{x}^{2}}+1z={{x}^{2}}+1\]\[\mathrm{\tt (\%o38) }\quad \mathit{done}\]\[\mathrm{\tt (\%o39) }\quad 2\]\[\mathrm{\tt (\%o40) }\quad 2\]\[\mathrm{\tt (\%o41) }\quad 2\]\[\mathrm{\tt (\%o42) }\quad 5\]

Tomar cuidado do fato do maiúsculo e minúsculo ser considerado diferentes

(%i46) x : 2;
ev(X + 10); /* X não é x */
ev(x + 1);
\[\mathrm{\tt (\%o44) }\quad 2\]\[\mathrm{\tt (\%o45) }\quad X+10\]\[\mathrm{\tt (\%o46) }\quad 3\]

Quando usa a variável que ainda não tem valor, cria uma expressão em termos deste variável
Quando troca o valor da variável, poderá efetuar a substituição para ver o valor novo.

(%i51) y : t^2+1;
t : 1;
ev(y);
t : 2;
ev(y);
\[\mathrm{\tt (\%o47) }\quad {{t}^{2}}+1\]\[\mathrm{\tt (\%o48) }\quad 1\]\[\mathrm{\tt (\%o49) }\quad 2\]\[\mathrm{\tt (\%o50) }\quad 2\]\[\mathrm{\tt (\%o51) }\quad 5\]

Quando tiver dúvida de que a variável já tem o valor e quer usar como a variável, precisará colocar apóstorfos antes do nome de cada variável. Se não precisar mais do valor armazenado na variável, é mais pratico liberar a variavel referente com o comando kill() para dispensar o uso de apostrofos.
Note que "kill(all)" remove todas as variáveis atribuidas, sendo útil para limpar os resíduos da execussão anterior antes de iniciar o programa. Também poderá voltar o valor das variáveis globais como padrão, usando "reset()".

(%i62) /* não sabe se t ja tem valor */
y : 't^2+'t+1; /* usando apóstrofos em cada t */
display(y);
kill(t); /* se não vai precisar mais do valor de t, poderá liberar o t */
y : t^2+1; /* e usar normalmente */
display(y);
t : 1;
ev(y);
t : 2;
ev(y);
kill(t,y); /* liberando t e y para uso futuro */ %$
\[\mathrm{\tt (\%o52) }\quad {{t}^{2}}+t+1y={{t}^{2}}+t+1\]\[\mathrm{\tt (\%o53) }\quad \mathit{done}\]\[\mathrm{\tt (\%o54) }\quad \mathit{done}\]\[\mathrm{\tt (\%o55) }\quad {{t}^{2}}+1y={{t}^{2}}+1\]\[\mathrm{\tt (\%o56) }\quad \mathit{done}\]\[\mathrm{\tt (\%o57) }\quad 1\]\[\mathrm{\tt (\%o58) }\quad 2\]\[\mathrm{\tt (\%o59) }\quad 2\]\[\mathrm{\tt (\%o60) }\quad 5\]\[\mathrm{\tt (\%o61) }\quad \mathit{done}\]

Atribuir valor a variáveis usados na expressão deverá ser cautelosa, pois poderá tentar usar como variáveis mais para frente e colocar apóstorfos em cada variável ou usar kill após cada uso é tediosa.
O recomendado é não "gastar" variáveis desnecessariamente para obter valor temporário, ou usar o kill após o uso para deixar a variavel livre, o que evita a confusão mais tarde.
O uso de "at()" ou "subst()" permite efetuar substituição local sem gastar variáveis.
at(y, x=a) troca "x" por "a" na expressão de "y" subst(a,x, y) troca "x" por "a" na expressão de "y" subst(lista, y) troca seguindo a equacao da lista na expressão de "y"

(%i75) kill(x,y,z); /* libera x, y e z */
y : x^2+1;
at(y,x=2);
ev(y);
at(y, x=t+1);
ev(y);
subst(2,x,y);
ev(y);
subst(t+1,x,y);
ev(y);
subst([a=b, b=c], a+b); /* trocando vários valores */
kill (y); /* liberando o único que recebeu atrivuição  */ %$
\[\mathrm{\tt (\%o63) }\quad \mathit{done}\]\[\mathrm{\tt (\%o64) }\quad {{x}^{2}}+1\]\[\mathrm{\tt (\%o65) }\quad 5\]\[\mathrm{\tt (\%o66) }\quad {{x}^{2}}+1\]\[\mathrm{\tt (\%o67) }\quad {{\left( t+1\right) }^{2}}+1\]\[\mathrm{\tt (\%o68) }\quad {{x}^{2}}+1\]\[\mathrm{\tt (\%o69) }\quad 5\]\[\mathrm{\tt (\%o70) }\quad {{x}^{2}}+1\]\[\mathrm{\tt (\%o71) }\quad {{\left( t+1\right) }^{2}}+1\]\[\mathrm{\tt (\%o72) }\quad {{x}^{2}}+1\]\[\mathrm{\tt (\%o73) }\quad 2\cdot c\]\[\mathrm{\tt (\%o74) }\quad \mathit{done}\]

Outro exemplo

(%i83) kill(x,y,z); /* libera x, y e z */
y : x^2+1; /* y depende de x */
display(y);
z : 'y*sin('y); /* z depende de y. Como não pode liberar y, usando apóstrofos */
display(z);
at(ev(z), x=2); /* efetua substituição e atribui valor a x */
kill (y,z); /* liberando os que receberam atribuição  */ %$
\[\mathrm{\tt (\%o76) }\quad \mathit{done}\]\[\mathrm{\tt (\%o77) }\quad {{x}^{2}}+1y={{x}^{2}}+1\]\[\mathrm{\tt (\%o78) }\quad \mathit{done}\]\[\mathrm{\tt (\%o79) }\quad y\cdot \mathrm{sin}\left( y\right) z=y\cdot \mathrm{sin}\left( y\right) \]\[\mathrm{\tt (\%o80) }\quad \mathit{done}\]\[\mathrm{\tt (\%o81) }\quad 5\cdot \mathrm{sin}\left( 5\right) \]\[\mathrm{\tt (\%o82) }\quad \mathit{done}\]

5 Alguns exemplos de manipulação da expressão

Poderá efetuar diversas manipulações sobre as expressões. A seguir, alguns exemplos ilustrativos.

expandindo o produto

(%i84) expand((x+y)^2);
\[\mathrm{\tt (\%o84) }\quad {{y}^{2}}+2\cdot x\cdot y+{{x}^{2}}\]

Fatorando

(%i85) factor(x^2+2*x+1);
\[\mathrm{\tt (\%o85) }\quad {{\left( x+1\right) }^{2}}\]

simplificando

(%i86) ratsimp((x^2-y^2)/(x+y));
\[\mathrm{\tt (\%o86) }\quad x-y\]

simplificação  trigonométrica

(%i87) trigsimp(cos(x)^2+sin(x)^2);
\[\mathrm{\tt (\%o87) }\quad 1\]

6 Definindo uma função

Para facilitar o cálcuo, é interessante definir uma função. Na função, a substituição dos valores ocorre de forma natural sem a necessidade do uso de at ou subst Uma função é definida de forma similar a usado na matemática, com a diferença de usar ":= " em vez de "=". Veja um exemplo.

(%i88) f(x) := x^2+1;
\[\mathrm{\tt (\%o88) }\quad \mathrm{f}\left( x\right) :={{x}^{2}}+1\]

Uma função pode ser usado como é de costume na matemática

(%i93) f(x) := sin(x)+1;
display(f(2));
display(f(x));
display(f(1-t));
display(f(f(x)));
\[\mathrm{\tt (\%o89) }\quad \mathrm{f}\left( x\right) :=\mathrm{sin}\left( x\right) +1\mathrm{f}\left( 2\right) =\mathrm{sin}\left( 2\right) +1\]\[\mathrm{\tt (\%o90) }\quad \mathit{done}\mathrm{f}\left( x\right) =\mathrm{sin}\left( x\right) +1\]\[\mathrm{\tt (\%o91) }\quad \mathit{done}\mathrm{f}\left( 1-t\right) =1-\mathrm{sin}\left( t-1\right) \]\[\mathrm{\tt (\%o92) }\quad \mathit{done}\mathrm{f}\left( \mathrm{sin}\left( x\right) +1\right) =\mathrm{sin}\left( \mathrm{sin}\left( x\right) +1\right) +1\]\[\mathrm{\tt (\%o93) }\quad \mathit{done}\]

7 Trabalhando com expressões e funções

Para ter a expressão da função, basta calcular numa variavel que não tenha o valor atribuido

(%i95) f(x) := cos(x);
display(f(t));
\[\mathrm{\tt (\%o94) }\quad \mathrm{f}\left( x\right) :=\mathrm{cos}\left( x\right) \mathrm{f}\left( t\right) =\mathrm{cos}\left( t\right) \]\[\mathrm{\tt (\%o95) }\quad \mathit{done}\]

Para usar uma expressão armazenada como expressão da função é mais prático usar define() em vez de ":=".

Definindo corretamente a função usando a expressão armazenada (usando define)

(%i102) kill (x); /* liberando x */
y : x^2+1;
display(y);
define(f(x), y); /* definindo usando a expressão armazenada */
display(f(x));
define(g(x), cos(x)*sin(x)); /* definindo diretamente */
display(g(x));
\[\mathrm{\tt (\%o96) }\quad \mathit{done}\]\[\mathrm{\tt (\%o97) }\quad {{x}^{2}}+1y={{x}^{2}}+1\]\[\mathrm{\tt (\%o98) }\quad \mathit{done}\]\[\mathrm{\tt (\%o99) }\quad \mathrm{f}\left( x\right) :={{x}^{2}}+1\mathrm{f}\left( x\right) ={{x}^{2}}+1\]\[\mathrm{\tt (\%o100) }\quad \mathit{done}\]\[\mathrm{\tt (\%o101) }\quad \mathrm{g}\left( x\right) :=\mathrm{cos}\left( x\right) \cdot \mathrm{sin}\left( x\right) \mathrm{g}\left( x\right) =\mathrm{cos}\left( x\right) \cdot \mathrm{sin}\left( x\right) \]\[\mathrm{\tt (\%o102) }\quad \mathit{done}\]

Se usar ":=" para atribuir expressão armazenada na expressao, gera a função que provavelmente nao é o que maioria das pessoas espeream, pois a variável da expressão não será o argumento da função

O uso indevido da expressão armazenada para definir função (tentando definir diretamente)

(%i108) kill (x); /* limpando o x */
y : x^2+1;
f(x) := y;
display(f(2));
x : 1;
display(f(2));
\[\mathrm{\tt (\%o103) }\quad \mathit{done}\]\[\mathrm{\tt (\%o104) }\quad {{x}^{2}}+1\]\[\mathrm{\tt (\%o105) }\quad \mathrm{f}\left( x\right) :=y\mathrm{f}\left( 2\right) ={{x}^{2}}+1\]\[\mathrm{\tt (\%o106) }\quad \mathit{done}\]\[\mathrm{\tt (\%o107) }\quad 1\mathrm{f}\left( 2\right) ={{x}^{2}}+1\]\[\mathrm{\tt (\%o108) }\quad \mathit{done}\]

Tambem ficar atento ao fato de que, quando a função  é definido diretamente, nao ha problema de variaveis mas quando usa a expressão armazenada, precisa que a variavel usada esteja livre.

(%i116) kill (x); /* limpando o x */
y : x^2+1;
x : 1;
f(x):= x^2+1; /* OK */
display(f(t));
/* define(g(x), y); */  /* Errado: x não está livre */
kill(x); /* libera x */
define (g(x), y); /* agora OK */
display(g(t));
\[\mathrm{\tt (\%o109) }\quad \mathit{done}\]\[\mathrm{\tt (\%o110) }\quad {{x}^{2}}+1\]\[\mathrm{\tt (\%o111) }\quad 1\]\[\mathrm{\tt (\%o112) }\quad \mathrm{f}\left( x\right) :={{x}^{2}}+1\mathrm{f}\left( t\right) ={{t}^{2}}+1\]\[\mathrm{\tt (\%o113) }\quad \mathit{done}\]\[\mathrm{\tt (\%o114) }\quad \mathit{done}\]\[\mathrm{\tt (\%o115) }\quad \mathrm{g}\left( x\right) :={{x}^{2}}+1\mathrm{g}\left( t\right) ={{t}^{2}}+1\]\[\mathrm{\tt (\%o116) }\quad \mathit{done}\]

Outros exemplos Se tem variáveis atribuidas da expressão, tomar cuidados.

(%i126) y : x^2+1;
x : 1; /* se x tem valor */
define(f('x), 'y); /* ERRADO, pois queremos o conteudo de y */
ev(f(2));
define(g('x), 'x^2+1); /* OK */ %$
ev(g(2));
/* forma ERRADA */
define(dg('x), '(diff(g(x), x)) );
/* ev(dg(2)); */ /* resulta em erro */
/* forma CORRETA */
define(dg('x), diff(g('x), 'x));
ev(dg(2));
\[\mathrm{\tt (\%o117) }\quad {{x}^{2}}+1\]\[\mathrm{\tt (\%o118) }\quad 1\]\[\mathrm{\tt (\%o119) }\quad \mathrm{f}\left( x\right) :=y\]\[\mathrm{\tt (\%o120) }\quad {{x}^{2}}+1\]\[\mathrm{\tt (\%o121) }\quad \mathrm{g}\left( x\right) :={{x}^{2}}+1\]\[\mathrm{\tt (\%o123) }\quad 5\]\[\mathrm{\tt (\%o124) }\quad \mathrm{dg}\left( x\right) :=\mathrm{diff}\left( \mathrm{g}\left( x\right) ,x\right) \]\[\mathrm{\tt (\%o125) }\quad \mathrm{dg}\left( x\right) :=2\cdot x\]\[\mathrm{\tt (\%o126) }\quad 4\]

8 listas (vetores, matrizes e similares)

Lista será delimitado pelo "[" e "]" e seus elementos serão separados pela virgula. Vetores são representados como listas.

(%i127) [1,2,3];
\[\mathrm{\tt (\%o127) }\quad [1,2,3]\]

Matriz é gerado por matrix, cuja argumentos são vetors linhas separados pela virgula

(%i128) matrix([1,2],[3,4]);
\[\mathrm{\tt (\%o128) }\quad \begin{pmatrix}1 & 2\cr 3 & 4\end{pmatrix}\]

Calculando o determinate da matriz

(%i129) determinant(matrix([1,2],[3,4]));
\[\mathrm{\tt (\%o129) }\quad -2\]

Para resolver Ax=b, basta calcular \[ x = A^{-1} b \] onde b é matriz coluna (transposta de uma linha).
Note que o produto matricial é feito por "." e não por "*". Analogamente, potência de uma matiz é indicado por "^^" e não por "^".

(%i132) A : matrix([1,2],[3,4]);
b : transpose([2, 3]);
x : invert(A) . b; /* mesmo que x : A^^(-1) . b; */;
\[\mathrm{\tt (\%o130) }\quad \begin{pmatrix}1 & 2\cr 3 & 4\end{pmatrix}\]\[\mathrm{\tt (\%o131) }\quad \begin{pmatrix}2\cr 3\end{pmatrix}\]\[\mathrm{\tt (\%o132) }\quad \begin{pmatrix}-1\cr \frac{3}{2}\end{pmatrix}\]

Os elementos da lista é acesssado por índice delimitado em "[" e "]" Note que os índices começa em 1 e não em 0 como de costume em várias linguagens de programação. Assim, os elementos da lista com n elementos são indexados de 1 a n

(%i136) v : [-1, 1, 0];
v[2];
M : matrix([1,2],[3,4]);
M[2,1];
\[\mathrm{\tt (\%o133) }\quad [-1,1,0]\]\[\mathrm{\tt (\%o134) }\quad 1\]\[\mathrm{\tt (\%o135) }\quad \begin{pmatrix}1 & 2\cr 3 & 4\end{pmatrix}\]\[\mathrm{\tt (\%o136) }\quad 3\]

Primeiro elemento até o décimo elemento também podem ser acessados por first, second, thrird, ..., tenth

(%i138) v : [-1, 1, 0];
ev(second(v));
\[\mathrm{\tt (\%o137) }\quad [-1,1,0]\]\[\mathrm{\tt (\%o138) }\quad 1\]

9 Equações

Para definir equação, usa-se o "="

(%i140) kill(x,y); /* limpando x e y */
x^2+y^2=1;
\[\mathrm{\tt (\%o139) }\quad \mathit{done}\]\[\mathrm{\tt (\%o140) }\quad {{y}^{2}}+{{x}^{2}}=1\]

O lado esquerdo e direito da equação pode ser extraido por lhs e rhs  respectivamente

(%i143) eq : x^2+y^2=1;
lhs(eq);
rhs(eq);
\[\mathrm{\tt (\%o141) }\quad {{y}^{2}}+{{x}^{2}}=1\]\[\mathrm{\tt (\%o142) }\quad {{y}^{2}}+{{x}^{2}}\]\[\mathrm{\tt (\%o143) }\quad 1\]

Uma equação pode ser resolvido pelo solve Em geral, devolve tanto a solução real como a solução complexa. Fique atendo se tem "%i" ou não, para distinguir solução real da solução complexa.

(%i144) solve(x^2+x+1=0);
\[\mathrm{\tt (\%o144) }\quad [x=-\frac{\sqrt{3}\cdot i+1}{2},x=\frac{\sqrt{3}\cdot i-1}{2}]\]

A solução sempre será devolvido na forma de lista de soluções Para ter o valor da solução desejada, deverá obter a solução da posição desejada (isolando a variavel, se necessário) e retirar o lado direito da equação.

(%i147) sol : solve(x^2+2*x=0);
rhs(sol[1]);
rhs(sol[2]);
\[\mathrm{\tt (\%o145) }\quad [x=-2,x=0]\]\[\mathrm{\tt (\%o146) }\quad -2\]\[\mathrm{\tt (\%o147) }\quad 0\]

Para isolar uma variável da equação, resolva em relação  a variável desejada

Encontrando y em termos de x

(%i148) solve(x^2+y^2=1,y);
\[\mathrm{\tt (\%o148) }\quad [y=-\sqrt{1-{{x}^{2}}},y=\sqrt{1-{{x}^{2}}}]\]

Para resolver um sistema de equações, passe a lista de equações

(%i149) solve([x^2+y^2=1,y=x^2]);
\[\mathrm{\tt (\%o149) }\quad [[y=\frac{\sqrt{5}-1}{2},x=-\frac{\sqrt{\sqrt{5}-1}}{\sqrt{2}}],[y=\frac{\sqrt{5}-1}{2},x=\frac{\sqrt{\sqrt{5}-1}}{\sqrt{2}}],[y=-\frac{\sqrt{5}+1}{2},x=-\frac{\sqrt{\sqrt{5}+1}\cdot i}{\sqrt{2}}],[y=-\frac{\sqrt{5}+1}{2},x=\frac{\sqrt{\sqrt{5}+1}\cdot i}{\sqrt{2}}]]\]

Outro exemplo Encontrando y e z em termos de x (isolando y e z)

(%i151) kill(x,y,z);
solve([x^2+y^2+z^2=1,z=x^2+x^2],[y,z]);
\[\mathrm{\tt (\%o150) }\quad \mathit{done}\]\[\mathrm{\tt (\%o151) }\quad [[y=-\sqrt{-4\cdot {{x}^{4}}-{{x}^{2}}+1},z=2\cdot {{x}^{2}}],[y=\sqrt{-4\cdot {{x}^{4}}-{{x}^{2}}+1},z=2\cdot {{x}^{2}}]]\]

10 Gráficos

Gráfico da função  pode ser obtido pelo plot2d e plot3d, dependendo da dimensão.
O maxima costuma usar o gnuplot para desenhar o gráfico e criar uma janela independente com recurso de iteratividade como zoom e rotação do grafico tridimensional com o mouse.
Dentro do wxmaxima, a familia destes comandos podem ser precedidos de "wx" como em wxplot2d, wxplot3d, etc que correspondem ao plot2d, plot3d, etc Tais comandos redirecionam a saida do gnuplot para arquivo (em vez da janela separada) e carrega diretamente dentro da area de trabalho do wxmaxima, o que mantém os gráficos na posição correspondente ao comando gráfico que gerou. Note que estes graficos não podem ser rotacionados e podem apresentar qualidade inferior ao gerado pelos plot's correspondentes.
Também não funciona fora do ambiente wxmaxima, como no caso de executar diretamente no maxima.
Os exemplos a seguir são feitos pela versão "wx". Se quer rodar diretamente no maxima (fora do wxmaxima), remova o wx no comeco do comando wxplot2d, wxplot3d, etc para ficar como plot2d, plot3d, etc antes de salvar no formato mac (ou wxm).

Grafico 2D da função real de uma variável Usando a função

(%i153) f(x) := x^2;
wxplot2d(f, [x,-2,2], [y,0,4])$
\[\mathrm{\tt (\%o152) }\quad \mathrm{f}\left( x\right) :={{x}^{2}}\]\[\mathrm{\tt (\%t153) }\quad \]  (Graphics)

Grafico 2D da função de uma variavel Usando a expressão

(%i154) wxplot2d(sin(x), [x,-2*%pi,2*%pi], [y,-2,2])$
\[\mathrm{\tt (\%t154) }\quad \]  (Graphics)

Usando a função convertida em expressão

(%i156) f(x) := exp(x);
wxplot2d(f(x), [x,-2,2], [y,0,6])$
\[\mathrm{\tt (\%o155) }\quad \mathrm{f}\left( x\right) :=\mathrm{exp}\left( x\right) \mbox{}\\\mbox{plot2d: some values were clipped.}\]\[\mathrm{\tt (\%t156) }\quad \]  (Graphics)

Mesma escala em xy

(%i157) wxplot2d(2*x^2, [x,-1,1],[y, -0.1,1], same_xy);
\[\mbox{}\\\mbox{plot2d: some values were clipped.}\]\[\mathrm{\tt (\%t157) }\quad \]  (Graphics) \[\mathrm{\tt (\%o157) }\quad \]

Apesar de poder omitir o limite para segunda variavel y, é recomendável que especifique para evitar gráficos indesejados que surge no modo automático

(%i158) wxplot2d(1/x, [x,-2,2])$
\[\mbox{}\\\mbox{plot2d: expression evaluates to non-numeric value somewhere in plotting range.}\]\[\mathrm{\tt (\%t158) }\quad \]  (Graphics)

Delimitando o y, terá visão melhor

(%i159) wxplot2d(1/x, [x,-2,2],[y,-10,10])$
\[\mbox{}\\\mbox{plot2d: expression evaluates to non-numeric value somewhere in plotting range.}\mbox{}\\\mbox{plot2d: some values were clipped.}\]\[\mathrm{\tt (\%t159) }\quad \]  (Graphics)

Para gráfico de mais de uma função, basta passar lista de expressões

(%i160) wxplot2d([sin(x),cos(x)],[x,-2*%pi,2*%pi],[y,-2,2], same_xy)$
\[\mathrm{\tt (\%t160) }\quad \]  (Graphics)

Poderá esboçar as curvas paramétricas Atente na difêrença de passagem de parámetros

(%i161) wxplot2d([parametric, sin(x),cos(x),[x,-2*%pi,2*%pi]],same_xy)$
\[\mathrm{\tt (\%t161) }\quad \]  (Graphics)

Gráfico 3D da função de duas variáveis

(%i163) f(x,y) := x^2+y^2;
wxplot3d(f(x,y), [x,-5,5], [y,-5,5])$
\[\mathrm{\tt (\%o162) }\quad \mathrm{f}\left( x,y\right) :={{x}^{2}}+{{y}^{2}}\]\[\mathrm{\tt (\%t163) }\quad \]  (Graphics)

Curvas de níveis da função de duas variáveis

(%i165) f(x,y) := x^2+y^2;
wxcontour_plot(f(x,y), [x,-5,5], [y,-5,5])$
\[\mathrm{\tt (\%o164) }\quad \mathrm{f}\left( x,y\right) :={{x}^{2}}+{{y}^{2}}\]\[\mathrm{\tt (\%t165) }\quad \]  (Graphics)

Para escolher os níveis desejados, deverá passar parámetro para o gnuplot [gnuplot_preamble,"set cntrparam levels discrete <niveis>] onde <niveis> são os níveis separados pela vírgura. Isto informa ao gnuplot, qual das curvas de níveis devem ser desenhados.

(%i166) wxcontour_plot(x^2+y^2, [x, -2, 2], [y, -2, 2],[gnuplot_preamble,"set cntrparam levels discrete 0, 1, 4"]);
\[\mathrm{\tt (\%t166) }\quad \]  (Graphics) \[\mathrm{\tt (\%o166) }\quad \]

A curva implícita pode ser expresso como curvas de nível da função  de duas variaveis. Uma forma natural é passar toda expressão para um lado, escrevendo como curvas de nível no nível 0
Por exemplo, x^2+y^2=1 torna x^2+y^2-1=0 Para especificar o nível (o valor do lado direito da equação), precisará passar parámetro para gnuplot O parámetro set cntrparam levels discrete 0 faz com que o gnuplot desenhe a curva de nível somente no nível 0 set size ratio -1 configurará para usar mesma escala tanto para eixo x como y

(%i167) wxcontour_plot(x^2+y^2-1, [x, -1, 1], [y, -1, 1],[gnuplot_preamble,"set cntrparam levels discrete 0;set size ratio -1"]);
\[\mathrm{\tt (\%t167) }\quad \]  (Graphics) \[\mathrm{\tt (\%o167) }\quad \]

Note que no exemplo acima, foi usado somente os comandos básicos do maxima.
Para trabalhar com gráficos de forma mais eficiente, deverá usar as funções draw2d() e draw3d() fornecido pelo pacote adicional "draw"
A seção  de "pacotes adicionais" tem alguns exemplos destes.

Campo de vetores. No exemplo, é o campo F(x,y) = [y, -x] com -1 ≤ x ≤ 1 e -1 ≤ y ≤ 1 plotdf não tem a versão wx e será desenhado na janela separada. Se clicar dentro desta janela, traçará a trajetória do campo partindo deste ponto.
O plotdf() nao tem a versao wx. Note que existe o drawdf() do pacote drawdf que tem a funcionalidade similar e tem também a versão wx.

(%i168) plotdf([y,-x],[x,-1,1], [y,-1,1]);
\[\mathrm{\tt (\%o168) }\quad /home/sadao/maxout12811.xmaxima\]
(Graphics)

11 Pacotes adicionais

Para cada finalidade, existem pacotes na qual precisam ser carregados explicitamente pelo comando load. Uma vez carregado, poderá usar as funções definidas no pacote. Não é necessário especificar o pacote mais de uma vez.

Campo de vetores Exemplo de campo de vetores F(x,y)=(y,-x) Para mais exemplos de campo de vetores, veja http://maxima.sourceforge.net/docs/manual/en/maxima_71.html

(%i170) load("drawdf");
wxdrawdf([y,-x],[x,-1,1], [y,-1,1],proportional_axes = xy);
\[\mbox{}\\\mbox{Loading /home/sadao/.maxima/binary/5\_38\_0/gcl/GCL\_2\_6\_12/share/draw/grcommon.o}\mbox{}\\\mbox{Finished loading /home/sadao/.maxima/binary/5\_38\_0/gcl/GCL\_2\_6\_12/share/draw/grcommon.o}\mbox{}\\\mbox{Loading /home/sadao/.maxima/binary/5\_38\_0/gcl/GCL\_2\_6\_12/share/draw/gnuplot.o}\mbox{}\\\mbox{Finished loading /home/sadao/.maxima/binary/5\_38\_0/gcl/GCL\_2\_6\_12/share/draw/gnuplot.o}\mbox{}\\\mbox{Loading /home/sadao/.maxima/binary/5\_38\_0/gcl/GCL\_2\_6\_12/share/draw/vtk.o}\mbox{}\\\mbox{Finished loading /home/sadao/.maxima/binary/5\_38\_0/gcl/GCL\_2\_6\_12/share/draw/vtk.o}\mbox{}\\\mbox{Loading /home/sadao/.maxima/binary/5\_38\_0/gcl/GCL\_2\_6\_12/share/draw/picture.o}\mbox{}\\\mbox{Finished loading /home/sadao/.maxima/binary/5\_38\_0/gcl/GCL\_2\_6\_12/share/draw/picture.o}\]\[\mathrm{\tt (\%o169) }\quad /usr/share/maxima/5.38.0/share/diffequations/drawdf.mac\]\[\mathrm{\tt (\%t170) }\quad \]  (Graphics) \[\mathrm{\tt (\%o170) }\quad 0\]

Exemplo de obter o gradiente da função  de duas variáveis que é o caso especial de jacobiana

(%i172) load("linearalgebra");
jacobian([x^2+y^2], [x,y]);
\[\mathrm{\tt (\%o171) }\quad /usr/share/maxima/5.38.0/share/linearalgebra/linearalgebra.mac\]\[\mathrm{\tt (\%o172) }\quad \begin{pmatrix}2\cdot x & 2\cdot y\end{pmatrix}\]

Como o pacote de álgebra linear já está carregada, poderá continuar usando Gerando o matriz de Vandermonde de três variáveis

(%i173) vandermonde_matrix ([x, y, z]);
\[\mathrm{\tt (\%o173) }\quad \begin{pmatrix}1 & x & {{x}^{2}}\cr 1 & y & {{y}^{2}}\cr 1 & z & {{z}^{2}}\end{pmatrix}\]

Método simplex para aotimização  linear minimizar a função  objetiva x+y sujeito à condição 3*x+2*y>2 x+4*y>3

(%i175) load("simplex")$
minimize_lp(x+y, [3*x+2*y>2,x+4*y>3]);
\[\mathrm{\tt (\%o175) }\quad [\frac{9}{10},[y=\frac{7}{10},x=\frac{1}{5}]]\]

Definindo a norma euclidiana O pacote "eigen" contém função inprod() para produto interno (produto escalar)

(%i178) load("eigen"); /* contém o produto interno */
norm(v) := sqrt(inprod(v,v)); /* definindo a norma euclidiana */
norm([1,2]);
\[\mathrm{\tt (\%o176) }\quad /usr/share/maxima/5.38.0/share/matrix/eigen.mac\]\[\mathrm{\tt (\%o177) }\quad \mathrm{norm}\left( v\right) :=\sqrt{\mathrm{inprod}\left( v,v\right) }\]\[\mathrm{\tt (\%o178) }\quad \sqrt{5}\]

O pacote "draw" contem função  que permite usar recursos gráficos 2D (draw2d) e 3D (draw3d) sofisticados usando o gnuplot
O exemplo a seguir, desenha três curvas juntas - curva implicita: circulo x^2+y^2=1 - curva paramétrica: cuspede (t^2,t^3) - gráfico da função: sqrt(x)
Usando a versão com "wx' para manter na área de trabalho do wxmaxima

(%i179) /* pacote gráfico adicional */
load("draw");
\[\mathrm{\tt (\%o179) }\quad /usr/share/maxima/5.38.0/share/draw/draw.lisp\]
(%i180) wxdraw2d(color=blue,implicit(x^2+y^2=1, x, -1,1, y, -1,1),
        color=red,parametric(t^2, t^3,t,-1,1),
        color=green,explicit(sqrt(x),x,0,1),proportional_axes = xy);
\[\mathrm{\tt (\%t180) }\quad \]  (Graphics) \[\mathrm{\tt (\%o180) }\quad \]

Desenhando a superfície de nível

(%i181) wxdraw3d(implicit((x-1)^2+y^2+(z+1)^2=1,
           x,-2,2,y,-2,2,z,-2,2),
        surface_hide = true,proportional_axes = xyz)$
\[\mathrm{\tt (\%t181) }\quad \]  (Graphics)

Curvas implícitas

(%i183) load(implicit_plot);
wximplicit_plot(x^2+y^2=1, [x,-1.2, 1.2], [y, -1.2, 1.2],same_xy);
\[\mathrm{\tt (\%o182) }\quad /usr/share/maxima/5.38.0/share/contrib/implicit\_plot.lisp\]\[\mathrm{\tt (\%t183) }\quad \]  (Graphics) \[\mathrm{\tt (\%o183) }\quad \]

No caso de programa a ser executado diretamente no maxima, o comando para finalizar o maxima é
quit();
Nao esquecer de parenteses, assim como ";"


Created with wxMaxima.