Tutorial MuPAD Light 2.5.2 para Windows Campinas, 2003 1 Índice 1. Introdução ............................................................... 1 2. O que é MuPAD...................................................... 2 3. Download e instalação do MuPAD...................... 3 4. Iniciando o uso do MuPAD................................... 4 5. Funções, derivadas e integrais ............................ 12 6. Gráficos em duas dimensões............................... 15 7. Gráficos em três dimensões................................. 25 8. Tabela de comandos úteis ................................... 30 Tutorial do MuPAD Light v2.5.2 para Windows Por André Oliveira Maroneze RA 023146 MA211 — Turma K Setembro de 2003 1 1. Introdução Este tutorial tem por objetivo ensinar usuários iniciantes a desfrutar dos principais recursos do pacote de software MuPAD, que dispõe de poderosas ferramentas matemáticas para diversos níveis, de alunos a profissionais. O tutorial não visa expandir conceitos aprofundados ou ferramentas de uso específico; tampouco cobrirá todas as inúmeras possibilidades do software. O enfoque principal será dado à manipulação de ferramentas de um curso de Cálculo, tais como derivadas, integrais, manipulação de funções e uso de gráficos. O tutorial explicará o que é MuPAD e como surgiu; onde encontrálo e quais os requerimentos para seu uso; porque preferi-lo a outros softwares matemáticos; como realizar as operações básicas e, depois, as necessárias a um curso de Cálculo. Ao fim, há uma tabela com os principais comandos, para servir de referência rápida. Espera-se que, com a difusão do conhecimento e das possibilidades de softwares de uso gratuito, possam as pessoas usufruir de produtos melhores e mais acessíveis no futuro. A ciência não deve servir ao capital, mas às mentes humanas. 2 2. O que é MuPAD MuPAD é um sistema algébrico computacional originalmente desenvolvido pelo MuPAD Research Group na Universidade de Paderborn (Alemanha), sob a direção do Professor B. Fuchssteiner. O projeto teve início em setembro de 1989, com a tese de mestrado de Karsten Morisse e Oliver Kluge. Andreas Kemper, em sua tese de mestrado, desenvolve a linguagem de programação MuPAD, semelhante em diversos aspectos ao Pascal — linguagem de programação de aprendizado relativamente fácil. O nome original — mupas — foi substituído em 1990 por MuPAD (Multi Processing Algebra Data Tool, ferramenta de multiprocessamento de dados algébricos). Além da sigla, o sufixo incorpora o local de origem do projeto (Universidade de Paderborn). Com os anos, o software vai sendo difundido e aprimorado. Surgem versões para Macintosh e, mais tarde, para Unix. Pesquisadores desenvolvem teses e pacotes, expandindo as possibilidades de uso. Em 1995, surge a versão para Windows. Atualmente (agosto de 2003), existem duas versões para Windows: MuPAD Pro (v 2.5.3) e Light (v 2.5.2). Além destas, há versões para Linux, Macintosh e Solaris, todas distribuídas pela SciFace (SciFace Software GmbH & Co. KG, fundada em 1997). A versão Pro do Windows dispõe de uma interface mais amigável e pode ser utilizada para fins comerciais, mas não é gratuita: usuários comerciais devem pagar US$ 500,00 por uma licença individual; usuários governamentais ou acadêmicos pagam US$ 300,00, e alunos, US$ 100,00. Pode-se experimentar essa versão por 30 dias com recursos limitados. Felizmente, existe a versão Light, cujas ferramentas são mais que o suficiente para os propósitos anteriormente mencionados. Essa versão é gratuita para estudantes, professores, funcionários de empresas filantrópicas e grupos de pesquisa sem fins lucrativos. O presente tutorial refere-se a essa versão. 3 3. Download e instalação do MuPAD Através do site www.mupad.com é possível realizar o download do programa. A versão atual (2.5.2) encontra-se no link ftp://ftp.mupad.de/MuPAD/distrib/windows/mupad_light_252.exe e tem 14.3 Mb (o programa ocupa aproximadamente 30 Mb depois de instalado). Ela funciona em Windows 95, 98, ME (Millennium), NT 4.0, 2000 e XP (só não existem versões para Windows 3.1). Aconselha-se visitar o site, e não diretamente o link para o arquivo, para se obterem informações sobre o programa e sobre possíveis novas versões. Em seguida, é necessário realizar o registro do programa (para usuários que se encaixam nas especificações de uso gratuito, descritas no final do capítulo anterior). Do contrário, ele funciona por apenas 30 dias, com algumas limitações de uso de memória. Em http://www.sciface.com/mupad_download/ há um formulário para ser preenchido e enviado. Dependendo de quando se realiza o registro, ele pode demorar alguns dias. Uma senha de desbloqueamento é enviada para o e-mail do usuário após esse período, mas já é possível executar o programa logo após a instalação. 4 4. Iniciando o uso do MuPAD Após instalado, o MuPAD cria um atalho no menu Programas. Ele cria atalhos para o programa em si (MuPAD Light), para um documento de referência à versão Pro e para um tutorial da versão 2.0 e posteriores (em inglês). Há também os acessórios, como o visualizador dos arquivos de ajuda do MuPAD (que podem conter links que levam de uma página à outra da ajuda, uma ferramenta extremamente útil) e a ferramenta VCam Light (para visualização de gráficos 3D), que será explicada mais tarde. Uma vez aberto o programa, surge uma janela informando quantos dias restam do período de avaliação gratuita. Essa janela não surgirá depois que as informações do registro (nome e senha) forem atualizadas. Para isso, basta clicar no menu Help > Register…. A tela do programa contém os menus, alguns botões e o prompt de comando. 5 Cada linha do prompt começa com um símbolo ’Ÿ’. Os comandos a serem executados (input) aparecem em vermelho, enquanto as respostas do programa (output) surgem em azul. Isso é o padrão, mas pode ser modificado no menu View > Options: botões Input Regions e Output Regions. Infelizmente, um comando avaliado não pode ser modificado e reutilizado na mesma linha; é preciso copiá-lo para a linha corrente do prompt e modificá-lo, então avaliá-lo novamente. Cada vez que se quer avaliar uma linha, basta teclar <Enter>. Podese também dividir um comando em diversas linhas, teclando <Shift>+<Enter>, como no exemplo abaixo: Ÿ sin (Shift+Enter) Ÿ (PI/2) (Enter) 1 Esse conjunto de linhas é equivalente a: Ÿ sin(PI/2) (Enter) 1 Preste atenção às letras; comandos costumam ser escritos todos em minúsculas, opções costumam ter a inicial em maiúscula e algumas variáveis são inteiras em maiúsculas. O tutorial descreve os comandos da forma exata que devem ser escritos. Os sinais de espaço entre alguns comandos e opções servem para facilitar a legibilidade, mas nem sempre são necessários. As operações usuais são escritas como em quase todos os sistemas computacionais: Adição: + Subtração: Multiplicação: * Divisão: / Exponenciação: ^ Podem-se inserir parênteses dentro de outros; colchetes e chaves têm outras funções. Funções trigonométricas básicas, constantes p, ä e ã, raízes, logaritmos e função módulo são definidos como a seguir: sin(x)(sen x), cos(x)(cos x), tan(x)(tg x) 6 PI (3.14... - note-se que deve ser escrito com ambas as letras maiúsculas) I (i, a unidade imaginária (i2=-1)) E (o número e, também representado por exp(1)) sqrt(x)(raiz quadrada de x, ou x1/2) log(b,x)(log b x), ln(x)(ln x, ou log e x) abs(x)(|x|) Exemplo de uma equação, na forma tradicional1 e como poderia ser escrita no MuPAD: 2 x 5 − y − [k + 2(log 5 x − sin x)] π tan e z PI*((2*x^5-sqrt(y)-(k+2-(log(5,x)-sin(x))))/tan(E)^z) Dois comandos muito úteis são o info e o help. O comando info mostra brevemente o que faz determinado comando ou, no caso de uma variável, mostra suas propriedades. Veja o exemplo a seguir: • info(ln) ln -- the natural logarithm • info(x) x -- an unprotected identifier without properties • x:=2 2 • info(x) 2 -- of domain type 'DOM_INT' O comando info requer um parâmetro entre parênteses. Note que atribuímos o valor 2 à variável ‘x’ usando ‘:=’, que é o comando utilizado para atribuição de valores às variáveis. Um sinal de igual (‘=’) apenas representa a igualdade em equações. O MuPAD diferencia letras maiúsculas de minúsculas, e permite definir palavras como variáveis. x, X, x1, X1 e valor_de_x são todos nomes válidos e diferentes de variáveis. 1 As palavras ‘sin’ e ‘tan’ referem-se a seno e tangente, respectivamente, que costumam ser denotadas por ‘sen’ e ‘tg’. 7 O comando help chama o MuPAD Help Browser, uma janela que permite explorar os tópicos de ajuda e encontrar mais informações sobre os comandos. O comando help requer um parâmetro entre parênteses e entre aspas, conforme é visível na imagem. Um modo mais fácil de usá-lo é digitar um ponto de interrogação (‘?’) antes da palavra a ser pesquisada. help(“info”)e ?info são equivalentes. O MuPAD tem por padrão utilizar manipulações algébricas sempre que possível. Por exemplo, se desejarmos saber quanto vale ln 2, e digitarmos: • ln(2^3) Por ser um número inexato, e para melhorar a precisão dos cálculos em diversas situações, o MuPAD retorna simplesmente: ln(8) Se quisermos um valor numérico para a expressão, precisaremos usar a função float, como a seguir: • float(ln(8)) 2.079441542 8 Outra solução é denotar os números como sendo variáveis de ponto flutuante, isto é, valores numéricos e não algébricos. No exemplo acima, bastaria digitar ln(8.0)para se obter a mesma saída. Nos casos em que isso não for possível, no entanto, é necessário usar a função. Existe uma variável definida pelo programa chamada DIGITS, que representa a quantidade de casas decimais a serem impressas toda vez que um valor numérico é desejado. Seu valor padrão é 10, mas basta atribuí-la outro valor (Ex: DIGITS:=100) para que os valores sejam expressos nessa precisão. Por exemplo: • DIGITS:=100; ln(8.0) 100 2.079441541679835928251696364374529704226500403080765 762362040028480180865\ 909084146817589980989256063 A barra invertida (‘\’) surge no prompt do MuPAD quando a saída de algum comando é grande demais para caber em apenas uma linha. Como o tamanho da linha deste arquivo é diferente, a barra aparece depois da primeira linha. Para ajustar o valor de caracteres a serem mostrados em uma única linha, basta ir no menu Session > Text Width… e mudar o valor. Isso facilita quando a linha é grande demais para caber na tela, ou quando se quer que uma expressão extrapole a tela sem quebrar (para, por exemplo, copiá-la em outro lugar sem necessidade de remover as barras). Para remover o valor atribuído a uma ou mais variáveis, o comando delete é usado. Veja o exemplo: • x; y x y • x:= PI; y:= 3 PI 3 • cos(x); y+2 -1 5 • delete x, y • cos(x); y-2 9 cos(x) y - 2 Há a função last(n), cujo valor é igual ao do n-ésimo output na ordem inversa, isto é, 1 é o último, 2 o penúltimo, e assim por diante. No caso de last(1), existe uma simplificação, que é ‘%’. Veja o exemplo: • 3+4+5 12 • 2*last(1) 24 • last(2)/3 4 • %*3 12 • last(2)/3 4/3 Note que o valor de last(n) é atualizado a cada saída. Por essa razão, ele pode ser usado para simular iterações simples ou calcular progressões termo a termo. Para a resolução de equações e sistemas, existe o comando solve. Se inserida apenas uma equação, basta digitar solve(equação) que ele definirá automaticamente a variável e o seu valor. Caso haja mais de uma variável, ele expressará as demais em função da primeira (em ordem lexicográfica, isto é, de ‘A’ (maiúsculo) até ‘Z’ (maiúsculo), então d ‘a’ (minúsculo) até ‘z’ (minúsculo). Variáveis com nomes mais curtos costumam vir antes das demais.). Com solve(equação, variável), obtém-se o resultado expresso na variável desejada. Veja exemplos: • solve(x^2-6*x+5=0) {[x = 1], [x = 5]} • solve(x^2-6*x+5=0, x) {1, 5} • solve(x+3*y-z=2) {[x = z - 3*y + 2]} • solve(x+3*y-z=2, z) {x + 3*y - 2} • solve(x^2+4=0) {[x = -2*I], [x = 2*I]} 10 • solve(receita - custo = lucro + impostos) {[lucro = receita - custo - impostos]} Para inserir conjuntos de equações ou variáveis, basta envolvê-los por chaves. Uma alternativa por vezes mais prática de resolver sistemas é dividir as equações em um conjunto, separadas por vírgulas, e as incógnitas em outro, e então usar solve(equações, incógnitas), conforme o exemplo: • equacoes := {x + 2*y - 3*z = 2, 3*x - 2*y + z/2 = 4, x/2 + y = 2} {x + 2*y - 3*z = 2, 1/2*x + y = 2, 3*x - 2*y + 1/2*z = 4} • incognitas := {x, y, z} {x, y, z} • solve(equacoes, incognitas) {[x = 23/12, y = 25/24, z = 2/3]} Há duas funções muito úteis nas manipulações algébricas: expand e simplify. A primeira serve para desenvolve expressões, enquanto a segunda procura simplificar ao máximo expressões dadas. É sempre conveniente adicionar um simplify(%) ao fim de extensas manipulações de expressões algébricas. Segue abaixo um exemplo de ambas. • expand(cos(x-y)*sin(x+y)) cos(x)*cos(y)^2*sin(x) + cos(x)^2*cos(y)*sin(y) + \ cos(x)*sin(x)*sin(y)^2 + cos(y)*sin(x)^2*sin(y) • simplify(%) 1/2*sin(2*x) + 1/2*sin(2*y) • expand(%) cos(x)*sin(x) + cos(y)*sin(y) Como se pode perceber, o segundo expand não retornou à expressão original, mas a outra equivalente. Quando alguma expressão é digitada de forma incorreta, aparece uma mensagem de erro especificando a linha (no caso de uma entrada dividida em várias linhas) e a coluna (às vezes, vale a pena contar os caracteres para encontrar o erro, quando a expressão é muito longa ou complexa). Abaixo seguem dois exemplos de erros comuns: no primeiro, 11 faltou o sinal de multiplicação entre o 2 e o PI; no segundo, esqueceu-se de colocar um ‘)’ à direita do último: • f := x + y - 3*z^2 / 2PI Error: Unexpected 'identifier' [line 1, col 25] • sin(x)+4(cos(x)/3+(2-(1/x)) Error: ')' expected [line 1, col 28] Com isso, concluímos as funções e manipulações básicas do MuPAD. Com os conhecimentos adquiridos até então, já podemos realizar manipulações algébricas e cálculos numéricos não muito complexos. Prosseguiremos com ferramentas de Cálculo e funções. 12 5. Funções, derivadas e integrais Funções no MuPAD podem ser definidas facilmente usando-se os símbolos ‘->’. Em seguida, basta digitar o nome da função e o valor da variável para se obter o resultado. Veja o exemplo: • f := x -> 2*x^3 x -> 2*x^3 • f(2) 16 • f(3.5) 85.75 Funções de várias variáveis são definidas com as variáveis entre parênteses, como no exemplo: • f := (x,y,z) -> 2*x + y^3 - 1/z (x, y, z) -> (2*x + y^3) - 1/z • f(2,3,4) 123/4 Funções compostas são definidas através da definição de uma função sobre a outra, como a seguir: • g := f + 2 (x -> 2*x^3) + 2 • g(2) 18 A derivada dessas funções é rapidamente calculada usando o operador D ou o apóstrofo (’) — ambos são equivalentes. Veja os exemplos a seguir: • f' 6*id^2 • D(f) 6*id^2 Note que o id presente nas respostas refere-se à variável da função, isto é, id pode ser qualquer variável, já que a função não está definida em termos de apenas um “x”. Podemos pensar em f como sendo f(x); nesse caso, id seria x, portanto f’(x) = 6x2. 13 Existe também o comando diff(função, realiza derivadas de funções explícitas: • diff(sin(x),x) cos(x) variável), que D e diff ambos realizam diferenciação, mas funcionam em situações diferentes. Usar D(sin(x)), por exemplo, não funcionaria do modo desejado, enquanto que a linha diff(f(x),x) não teria problemas. No primeiro caso, o operador interpreta x como um valor desconhecido, e portanto permanece com ele, diferenciando apenas o resto da função. Veja um exemplo: • D(sin(2*x)^2) 2*sin(2*x)*D(sin(2*x)) Repare que ainda há um D na função — o operador não compreende que x é uma variável. Se tivesse sido usado diff, a função seria diferenciada sem problemas. Esse mesmo comando também calcula derivadas parciais em funções de diversas variáveis, enquanto que o operador D não o faz. Há, ainda, a possibilidade de se calcularem derivadas de ordem superior facilmente. No caso de haver uma função definida, basta inserir diversos apóstrofos; no caso do comando diff, é necessário adicionar um novo parâmetro: diff(função, variável $ n), onde n é a ordem da derivada. Veja os exemplos a seguir: • f := x->x^7; f''''' x -> x^7 2520*id^2 • diff(x^7, x $ 5) 2520*x^2 Para a integração, existe o comando int. int(função, variável) retorna a integral indefinida da função, enquanto int(função, variável = mínimo..máximo) (repare nos dois pontos (‘..’), que indicam intervalo) retorna o valor da integral definida naquele trecho, conforme os exemplos: • int(3*x^2, x) x^3 • int(3*x^2, x = -1..2) 9 14 Caso a função seja descontínua no intervalo, ocorrerá um erro: • int(1/x,x=-1..0) Warning: Antiderivative is unbounded at upper limit [intlib::antiderivative] - I*PI - infinity O cálculo dos limites ajuda a encontrar tais descontinuidades. Existem três formas de usar a função limit: limit(f, x = x0): calcula o limite bidirecional de f em x(se existir); limit(f, x = x0, Left): calcula o limite de f em x pela esquerda (se existir); limit(f, x = x0, Right): calcula o limite de f em x pela direita (se existir). Exemplos: • limit(1/x, x=0, Left) -infinity • limit(1/x, x=0, Right) infinity • limit(1/x, x=0) undefined De posse desses conhecimentos de Cálculo, podemos realizar diversas operações com funções. Seria interessante fazer gráficos delas, e isso será ensinado no próximo capítulo. 15 6. Gráficos em duas dimensões Os gráficos no MuPAD são todos realizados através da biblioteca plot e exibidos na VCam Light. Há basicamente dois modos de operação da câmera, um para gráficos 2D e outro para gráficos 3D. O primeiro tem apenas controle de zoom, enquanto que o segundo permite rotacionar a imagem. Clicando no atalho Tools > VCam Light Demo, o programa será aberto com um exemplo: a garrafa de Klein. Quando se está usando o MuPAD, qualquer comando plot também abrirá o VCam, a menos que o comando esteja incorreto. A janela principal do programa está mostrada abaixo. Qualquer gráfico pode ser salvo como uma imagem no formato VC e aberto sem a necessidade de se executar o MuPAD. A barra de ferramentas contém os principais botões para a manipulação de gráficos 3D: 16 Os dois primeiros (que são os únicos que funcionam em gráficos 2D) permitem ampliar ou reduzir a imagem. Os quatro seguintes permitem girar gráficos 3D para se conseguir um ângulo melhor. Os dois últimos mudam a perspectiva, como se o observador estivesse mais perto ou mais longe da imagem. Existem diversas opções de construção de gráficos que permitem mudar o aspecto e as cores. O MuPAD pode plotar curvas 2D e 3D, superfícies, curvas de nível e campos vetoriais. Existem outros comandos além do plot. Eles permitem plotar funções mais rapidamente, sem a necessidade de especificação de muitos parâmetros, mas são mais limitados. Por exemplo: para plotar a parábola f(x) = x2: • f := x -> x^2 x -> x^2 • plotfunc2d(f) E temos o gráfico da parábola: 17 Há várias opções para alterar o gráfico. Por exemplo, poderíamos determinar os intervalos de x e de y: • plotfunc2d(f, x = -2..2, y = 0..0.5) As escalas usadas são escolhidas pelo computador, mas podemos forçá-las a serem idênticas (isso é muito útil para plotar funções como circunferências, quando o ajuste automático tende a achatá-las em elipses): • f := x -> sqrt(1 - x^2) x -> sqrt(1 - x^2) • plotfunc2d(f, x = -2..2, y = -2..2, Scaling = Constrained) Note que determinar o intervalo de plotagem é opcional. plotfunc2d(f, Scaling = Constrained)funcionaria também, mas o intervalo adotado pelo programa seria x = [-1,1] e y = [0,1]. Às vezes, é útil exigir maior precisão do computador; ou pode ser melhor remover pontos excessivos para fazer gráficos mais rápido. Nesses casos, a opção Grid = n é utilizada. Compare dois gráficos da mesma função, um usando 100 pontos e outro usando 1000: • plotfunc2d(x*sin(1/x), x=-0.1..0.1, y=-0.1..0.1, Grid=100) ↓ ↑ • plotfunc2d(x*sin(1/x), x=-0.1..0.1, y=-0.1..0.1, Grid=1000) 18 Os erros de aproximação numérica são bem mais visíveis na função à esquerda que na da direita. Mas o excesso de pontos pode atrapalhar em alguns casos. Existem diversas opções, mas muitas delas referem-se à aparência e não são tão importantes. Apenas como exemplo, podemos mudar as linhas, adicionar marcas, sentido dos eixos, entre outras opções: • plotfunc2d(x*sin(1/x), x=-0.1..0.1, y=-0.1..0.1, Grid = 200, GridLines = Automatic, LineStyle = DashedLines, Ticks = 10, Arrows = TRUE) Geralmente, as opções podem ser adicionadas todas no início ou todas no fim. O comando ?plotOptions2d informa mais sobre opções de plotagem. Podemos usar o comando plot2d para curvas parametrizadas. Podemos tanto definir uma função parametrizada anteriormente e plotála depois, quanto defini-la na mesma hora da plotagem. Por exemplo: • x := w -> cos(w); y := u -> sin(2*u); f := [Mode = Curve, [x(t), y(t)], t=[-PI, PI]]; • plot2d(f) As três linhas de comando acima produzirão o mesmo que: • plot2d([Mode=Curve,[cos(t),sin(2*t)], t=[-PI,PI]]) 19 Preste atenção para não esquecer de fechar nenhum colchete. Repare também que o intervalo, agora, é definido na forma x = [a,b], enquanto que antes era x = a..b. É possível definir pontos e formas geométricas para compor diversas funções em um único gráfico, na forma de uma lista (Mode = List). Veja o exemplo abaixo: • P := point(1.1,0); Q := point(0.8,0.502); R := point(0.5,1.04); • S := point(0,1.56); T := point(-0.5,2.03); U := point(-0.8, 2.5); • V := point(-1, 3.1) • lista := [Mode = List, [P, Q, R, S, T, U, V]]; • curva := [Mode = Curve, [cos(x), x], x=[0,PI]] • plot2d(PointStyle = Circles, PointWidth = 100, lista, curva) Se quisermos mudar a curva, basta re-atribuir a variável curva com as novas opções e re-enviar o comando plot2d: • curva := [Mode = Curve, [cos(x), x], x=[0,PI], Color=[Height, [0.8,0.8,0.8], [0.2,0.2,0.2]], LineWidth=50]; plot2d(PointStyle = Circles, PointWidth = 100, lista, curva) 20 Uma breve explicação sobre a opção Color, que é meio trabalhosa de usar mas melhora bastante a aparência de alguns gráficos: Color = [R, G, B] define a cor dos pontos/curvas. São necessários três números, que variam de 0 a 1, e especificam a quantidade de cada cor (vermelho, verde e azul) que comporão os pontos. [0,0,0] corresponde a preto e [1,1,1] é branco. O MuPAD conta com algumas variáveis pré-definidas para as cores, que podem ser acessadas usando-se RGB::Cor (RGB::White, por exemplo). Existem três modos de coloração: Flat (cor única), Height (gradiente, que varia conforme a altura) e function (função definida pelo usuário). Em geral, a Height é a mais utilizada, por dar a alguns gráficos uma aparência melhor. Do mesmo modo que plotamos pontos, podemos plotar polígonos, que nada mais são que conjuntos de pontos. O comando é quase igual, exceto que devemos adicionar um polygon(a, b, c, <opções>) à lista, como no exemplo: • a := point(0,3); b := point(2,-3); c := point(3,1); d := point(3,1); e := point(-2, -3) • estrela := [Mode = List, [polygon(a, b, c, d, e, Filled = TRUE, Closed = TRUE, Color = RGB::Gray)]] • plot2d(Scaling = Constrained, estrela) A função polygon tem as opções filled (preenchido) e closed (fechado). Se a ordem dos pontos fosse mudada, o polígono resultante seria bem diferente. Observe também que, no caso do plot2d, é necessário colocar as opções antes dos objetos a serem plotados. 21 Finalmente chegamos ao comando plot. Ele possui diversas opções e modos de plotagem, de forma que praticamente qualquer objeto pode ser plotado com ele. Começaremos com a função implícita x3+y3, usando para isso a função plot e a opção plot::implicit: • plot(Scaling = Constrained, plot::implicit(x^3+y^33*x*y, x=-2..3, y=-2..3)) Podemos criar um conjunto de isotermas dessa mesma função adicionando a opção Contours = [$ a..b]. Contours aceita um conjunto de valores separados por vírgulas, mas se usarmos o operador $ e um intervalo separado por ‘..’, o MuPAD gerará um conjunto de números inteiros no intervalo especificado. Ou seja, $ 1..3 é a mesma coisa que digitar 1, 2, 3. Assim, aplicando isso à função, temos: • plot(Scaling = Constrained, plot::implicit(x^3+y^33*x*y, x=-2..3, y=-2..3, Contours = [$ -3..3])) 22 O MuPAD escolhe automaticamente um conjunto de cores. Mas existe a opção plot::contour, que é mais adequada para esse tipo de imagem. Reciprocamente, ela também imprime funções implícitas, mas o gráfico pode sair um pouco distorcido, mesmo que adicionemos várias linhas de contorno (o padrão são 8 linhas): • plot(Scaling = Constrained, plot::contour([x, y, x^3+y^3-3*x*y], x=-2..3, y=-2..3, Contours=40)) Observe a sintaxe do comando: plot::contour([x, y, função], x = a..b, y = c..d). Gráficos gerados por plot::contour costumam ficar melhores quando as cores são ajustadas de acordo com a altura (nível das curvas). Além disso, existe a opção Style = Attached, que gera uma imagem tridimensional das curvas: • plot(Scaling = Constrained, plot::contour([x, y, (x^2+y^2)], x=-1..1, y=-1..1, Contours=20, Style = Attached, Colors = [Height])) 23 Em breve, veremos mais detalhes de gráficos tridimensionais. Antes, vamos concluir a plotagem de gráficos bidimensionais com o plot::vectorfield. Ele cria campos vetoriais bidimensionais. Veja um exemplo: • plot(plot::vectorfield([x*sin(1/x),cos(x)], x=-5..5, y=-5..5, Grid = [20,20])) A quantidade de vetores é definida por Grid = [x,y]. Uma utilidade dos campos vetoriais é servirem como campos direcionais. Podemos associar a eles outras funções e plotá-los junto de outros gráficos, como complemento. Além disso, as componentes dos vetores podem depender tanto de x quanto de y como no exemplo abaixo: 24 • V := plot::vectorfield([y,-x], x=-2..2, y=-2..2, Grid=[15,15]) • C := plot::contour([x, y, x^2+y^2], x = -2..2, y = 2..2, Contours = 12) • plot(Scaling = Constrained, V, C) Caso se queira plotar uma função junto com outros objetos através do comando plot (sem usar o plot2d ou o plotfunc2d), é necessário usar a opção plot::Function2d, conforme o exemplo ilustra: • plot(plot::Function2d(cos(x), x = -2*PI..2*PI, Color = [0,0,1]), plot::contour([x, y, y-cos(x)], x = -6..6, y = -2..2)) 25 7. Gráficos em três dimensões Os únicos gráficos tridimensionais vistos até agora foram a garrafa de Klein e a função das curvas de nível. Agora veremos como plotar curvas, superfícies e funções parametrizadas. A maioria dos comandos de gráficos 3D é análoga ao dos gráficos 2D, com uma variável extra e algumas opções diferentes. Veja um exemplo com plotfunc3d (foram plotadas duas funções simultaneamente, e uma independe de y): Uma das maiores vantagens dos gráficos tridimensionais no MuPAD é que é possível ajustar em tempo real o ângulo de visão. Existem opções que indicam o ângulo de visão a ser plotado, mas elas não serão comentadas por serem praticamente desnecessárias. As opções de estilo dos gráficos podem ser adicionadas na linha de comando ou modificadas nas janelas de opção (através do menu View > Options...), mas no último caso é necessário reiniciar o MuPAD para que as opções sejam atualizadas2. Cada gráfico de exemplo mostrará um aspecto diferente, para que se tenha noção das possibilidades do programa. 2 Não há referência clara a isso nos arquivos de ajuda do MuPAD, o que me leva a crer que possa ser algum erro que ocorreu em minha instalação. Mesmo assim, é possível que o botão Apply seja funcional apenas na versão Pro ou em outros sistemas. 26 A primeira janela de opções permite mudar o estilo dos eixos (nenhum, origem, canto, caixa), a quantidade de marcas em cada eixo (Ticks), se o sentido dos eixos deve ser indicado por setas, as cores de frente e fundo, os rótulos dos eixos e se a escala deve ser igual em todos os eixos ou não. 27 A segunda janela é a mais importante: nela estão os estilos das curvas, superfícies e pontos. Todas podem ser modificadas nos próprios comandos, mas caso se queira ajustar o padrão, é melhor modificar na janela. É fácil criar curvas ou superfícies parametrizadas com o comando plot3d. Análogo ao plot2d, ele aceita tanto objetos do tipo Curve (com 1 parâmetro) como Surface (com 2 parâmetros). Veja o exemplo: • espiral := [Mode = Curve, [1.1*cos(12*t)*sin(t), 1.1*sin(12*t)*sin(t), 1.1*cos(t)], • t=[0,PI], Grid = [100], Smoothness = [10]] • esfera := [Mode = Surface, [sin(u)*cos(t), cos(u)*cos(t), sin(t)], • t = [0, 2*PI], u = [0, 2*PI], Style = [HiddenLine, Mesh]] • plot3d(Scaling = Constrained, esfera, espiral) Repare que a opção Grid contém o número entre colchetes Para superfícies, Grid pode conter dois números, um para cada eixo (x e y). A opção Smoothness (também funcional em duas dimensões) define quantos pontos de intercalação devem ser plotados entre cada ponto da grade, para melhorar o ajuste de curvas. Um número excessivo de pontos pode aumentar enormemente o tempo de plotagem. 28 A opção em negrito (Style) foi realçada para que se note a diferença dela para a superfície anterior. Há diversos modos de estilo para superfícies tridimensionais. Do mesmo modo que existe a plot::Funcion2d, existe a plot::Function3d, e a plot::Curve3d (para curvas parametrizadas), similar à plot::Curve2d (todas usadas com o comando plot). Veja um exemplo de cada uma das formas tridimensionais: • mola := plot::Curve3d([cos(6*t), sin(6*t), t], t = 8..8, LineWidth=30, Color=[Flat, [0.5,0.5,0.5]]); • onda := plot::Function3d(sin(x)*cos(y) + sin(y)*cos(x), x = 0..PI, y = 0..PI); • onda::Style := [WireFrame, ULine]; • plot(onda, mola) Não há muita novidade nos comandos apresentados, exceto a atribuição do estilo após a declaração do objeto. onda foi atribuído com o gráfico de uma função tridimensional no estilo padrão. Depois de criada, pudemos atribuir à sua propriedade Style (através de onda::style) novas propriedades (note o símbolo de atribuição em oposição ao de igual usado na mola). Com isso, torna-se mais fácil mudar algumas propriedades caso o gráfico não tenha saído do modo desejado. 29 Infelizmente, o MuPAD não plota curvas de nível tridimensionais. Uma alternativa seria plotar diversos gráficos tridimensionais de tamanhos variados, simulando curvas de nível tridimensionais, mas a opção de estilo Transparent não foi ainda implementada na versão Windows. Em todo caso, com os conhecimentos adquiridos, podem-se tentar diversas alternativas, como plotagem de superfícies eqüidistantes com cores diferentes. Sem dúvida, seria trabalhoso. O MuPAD ainda é capaz de plotar histogramas, matrizes, funções em coordenadas polares, cilíndricas e esféricas; mas todas essas funções são sub-opções do comando plot, e como não são tão importantes para este tutorial (além de que basta pesquisar na ajuda para descobrir como funcionam, visto que os principais termos do programa já são conhecidos), não serão tratadas especificamente. Há, inclusive, funções que mostram aproximações de Riemann e Simpson para integrais. Aqui terminam as lições do tutorial. Com o que foi explicado, é possível realizar a maior parte das operações necessárias a um curso de Cálculo I-II, e é possível visualizar diversas das funções e equações comumente vistas. Há muito mais de que o MuPAD é capaz, mas para algumas soluções é necessária muita criatividade e capacidade de abstração (paciência ajuda muito). telhado := plot::Function3d • (2-abs(x)^(0.3)+2-abs(y)^(0.3), • x = -2..2, y = -2..2); • telhado::Style := [ColorPatches, • AndVLine]; • torre := plot::Surface3d( • [1.7*cos(t), 1.7*sin(t), s], • t=[0,2*PI], s = [-3,1.9], • Color = [Height, [0.5, 0.165, • 0.165], [0.7,0.9,0.7]]); • torre::Style := [ColorPatches, • Only]; plot(Scaling = Constrained, telhado, torre) 30 8. Tabela de comandos úteis Nota: Itens em azul são opcionais. Barras “\” indicam que se deve optar por algum dos itens. Funções/Constantes Módulo: abs(x) Raiz quadrada: sqrt(x) Logaritmo (x na base b): log(b, x) Exponencial: exp(x) Funções trigonométricas: sin(x), cos(x), tan(x), sec(x), csc(x), cot(x) Funções hiperbólicas: sinh(x), cosh(x), tanh(x), sech(x), ... Funções trigonométricas inversas: arcsin(x), arccos(x), arctan(x), ... Unidade imaginária (i): I Número de Euler (e): E Número pi: PI Precisão decimal exibida: DIGITS := n Comandos úteis e regras de sintaxe Atribuição: := Declaração de função: f := x -> ???x (Ex: f := x -> 2*x) Declaração de seqüência: $ a..b Informação sobre variáveis/comandos: info(expressão) Ajuda detalhada: help(“expressão”) ou ?expressão Resolução de equações/sistemas: solve({x+y+z...=a, x+y+z...=b, ...}, {x, y, z}) Re-utilização de última saída: last(1) ou % Simplificação de expressões: simplify(expressão) Desenvolvimento de expressões: expand(expressão) Remoção de valor de variáveis: delete x, y, z... Cálculo Limites: limit(f, x = a, Left\Right) Derivação: diff(f, x) Integração: int(f, x = a..b) 31 Funções de gráficos Plotagem geral: plot(objeto) Plotagem de funções de 2 dimensões: plotfunc2d(f, x = a..b) Plotagem de funções de 3 dimensões: plotfunc3d(f, x = a..b, y = c..d) Plotagem de gráficos de 2 dimensões: plot2d([Mode = tipo, [...]) Plotagem de gráficos de 3 dimensões: plot3d([Mode = tipo, [...]) Objetos para a função plot: Funções implícitas: plot::implicit([expr1, expr2, ...], x = a..b, y = c..d) Curvas de nível: plot::contour([x, y, z], s = a..b, t = c..d, Contours = [e..f]) Campos vetoriais: plot::vectorfield([vx, vy], x = a..b, y = c..d) Funções 2D: plot::Function2d(f, x = a..b) Funções 3D: plot::Function3d(f, x = a..b, y = c..d) Curvas 2D parametrizadas: plot::Curve2d([x, y], t = a..b) Curvas 3D parametrizadas: plot::Curve3d([x, y, z], t = a..b) Superfícies parametrizadas: plot::Surface3d([x, y, z], s = a..b, t = c..d) Opções de gráficos3 GridLines = [None\Automatic] (apenas para gráficos 2D) LineStyle = [SolidLines\DashedLines] LineWidth = n PointStyle = [Circles\Squares\FilledCircles\FilledSquares] PointWidth = n Scaling = [Constrained\Unconstrained] Ticks = [Automatic\None] Outras opções Estas opções estão disponíveis em algumas funções de plotagem e são extremamente úteis. Color = [R, G, B] Grid = n Grid = [x, y] Smoothness = [n] 3 Foram listadas apenas as opções mais usadas. Algumas podem ter outros valores a elas atribuídos, porém apenas os mais usados estão listados.