x - Fernando Deeke Sasse
Transcrição
x - Fernando Deeke Sasse
Aplicações de Maple em Cálculo e Álgebra Linear Fernando Deeke Sasse [email protected] Departamento de Matemática, UDESC - Joinville 1 Introdução O Maple foi criado nos anos 80 pelos matemáticos Keith Geddes e Gaston Gonnet, na Universidade Waterloo e é considerado uma plataforma de computação algébrica genérica com sólida base matemática. Computação algébrica é o mesmo que computação simbólica, ou seja, computação envolvendo a manipulação de símbolos. A computação numérica também pode ser realizada pelo Maple, embora de forma mais lenta do que programas tradicionais, como Fortran e C. A integração numérica/simbólica e a excelência da sua linguagem de programação, fazem com que o Maple sirva muito bem como uma ferramenta de criação de protótipos de programas. Há vários anos o Maple vem sendo desenvolvido em várias partes do mundo, graças ao fato dele ser construído sobre sua própria linguagem, não compilada. Somente um pequeno núcleo básico é compilado, por razões de velocidade. 2 Gráficos Esta seção foi baseada em parte nas worksheets de Peter Stone, School of Life and Physical Sciences, RMIT. 2.1 plot,implicitplot,with(plots),display,seq O comando do Maple plot pode ser utilizado para traçar gráficos. Sua versatilidade reside no fato de que ele pode lidar com várias formas de parâmetros de entrada. Os seguintes comandos fazem o gráfico da função y = x4 K4 x3 C3 de x = K2 a x = 2. O intervalos que a variável x pode assumir é especificada na forma mostrada, utilizando dois pontos .. e constitui uma estrutura de dados do Maple denominada range. Inicialmente definimos a expressão: O restart: O y:=x^4-4*x^3+3; y := x4 K4 x3 C3 (2.1.1) O plot(y,x=-2..2); 50 40 30 20 10 K2 0 K1 K10 1 x 2 1 x 2 Para rotular também o eixo vertical com um y, digitamos: O plot(y,x=-2..2,'y'); 50 40 30 y 20 10 K2 0 K1 K10 Podemos restringir ou estender o gráfico na direção vertical digitando o intervalo de valores para y: O plot(y,x=-2..2,'y'=-10..10); 10 y K2 5 0 K1 1 x 2 K5 K10 Podemos escolher a cor do gráfico adicionando uma opção do tipo color=??. ou colour=??. O plot(y,x=-2..2,'y',colour=magenta); 50 40 30 y 20 10 K2 0 K1 K10 1 x 2 As escolhas para a opção colour são: aquamarine, black, blue, coral, cyan, brown, gold, green, grey, khaki, magenta, maroon, navy, orange, pink, plum, red, sienna, tan, turquoise, violet, wheat, white, yellow. Podemos escolher a cor definindo-a em termos de componentes de vermelho, verde e azul (RGB) . O plot(y,x=-4..4,color=COLOR(RGB,.7,0,0.8)); 500 400 300 200 100 K4 K3 K2 K1 0 1 2 x 3 4 2 x 3 4 Podemos dar nome à cor: O purpura := COLOR(RGB,.7,0,1); plot(x^2,x=-4..4,color=purpura); purpura := COLOR RGB, 0.7, 0, 1 16 14 12 10 8 6 4 2 K4 K3 K2 K1 0 Alternativamente é possível usar uma macro. 1 O macro(darkgreen=COLOR(RGB,0,0.6,0)); plot(x^2,x=-4..4,color=darkgreen); darkgreen 16 14 12 10 8 6 4 2 K4 K3 K2 K1 0 1 2 x 3 4 Gráficos simultâneos podem ser construídos definindo uma lista de expressões, cujos gráficos queremos traçar: O [x^2,x+1]; 2 x , x C1 (2.1.2) O plot([x^2,x+1],x=-2..2,'y'); 4 3 y 2 1 K2 K1 0 K1 1 x Podemos escolher as cores dos gráficos definindo a respectiva lista de cores: . O plot([x^2,x+1],x=-2..2,'y',color=[blue,green]); 2 4 3 y 2 1 K2 K1 0 1 x K1 2 Note que usamos aspas simples para retardar a avaliação de y, que já tem um valor atribuído. O seguinte exemplo mostra um tipo de erro devido ao fato da variável já ter um valor atribuído: O x := 5; plot(2*x-x^2,x=-1..3); x := 5 Error, (in plot) unexpected option: 5 = -1 .. 3 Este problema pode ser resolvido removendo a atribuição de x: O x := 'x': plot(2*x-x^2,x=-1..3); 1 K1 0 1 2 3 x K1 K2 K3 Podemos atribuir nomes aos gráficos, para depois exibi-los. Antes disso devemos carregar a bibliteca plots: O with(plots): O g1:=plot(sin(x)^2,x=-Pi..Pi,color=blue): O g2:=plot(sin(x^2),x=-Pi..Pi): O display([g2,g1]); 1 0.8 0.6 0.4 0.2 K3 K2 K1 1 K0.2 2 3 x K0.4 K0.6 K0.8 Os gráficos são desenhados com a espessura de um pixel, a menos que uma espessura maior que 1 seja especificada com a opção "thickness" . O plot(2*x-x^2,x=-1..3,thickness=2); 1 K1 0 K1 1 2 x K2 K3 Para plotar funções parametrizadas o procedimento é o seguinte: O plot([t*cos(2*Pi*t), t*sin(2*Pi*t), t=0..4], scaling= constrained, axes=box); 3 3 2 1 0 K1 K2 K3 K3 K2 K1 0 1 2 3 4 Gráficos de funções definidas implicitamente podem ser traçados com o comando implicitplot: O implicitplot(sin(x*y)+y=2,x=-6..6,y=0..4); 4 3 x4 K4 x3 C3 2 1 0 1 1.5 2 2.5 3 3.5 x O implicitplot(sin(x*y)+y=2,x=-6..6,y=0..4,numpoints=10000); 4 3 x4 K4 x3 C3 2 1 0 1 1.5 2 2.5 3 3.5 x As coordenadas de um ponto podem ser representadas em Maple por meio de uma lista com dois números. Por exemplo, o ponto (1,2) é escrito como [1,2]. Definimos a seguir a lista de pontos dados por K2, 2 , K1, K2 , 1, 2 , 2, 3 . O mypoints := [[-2,2],[-1,-2],[1,2],[2,3]]; mypoints := K2, 2 , K1, K2 , 1, 2 , 2, 3 Podemos plotar estes pontos em gráfico usando plot. O plot(mypoints,style=point); (2.1.3) 3 2 1 K2 K1 0 1 2 K1 K2 As escolhas das cores são as mesmas que foram definidas para plotar gráficos. Os símbolos podem ser escolhidos como box, cross, circle, point, e diamond. Você pode também digiter estes tipos de pontos em maiúsculas, BOX,CROSS,CIRCLE, POINT,DIAMOND, mas não misture maiúsculas e minúsculas. O plot(mypoints,style=point,colour=blue,symbol=circle); 3 2 1 K2 K1 0 1 2 K1 K2 Mais informações sobre as opções para o procedimento plot podem ser obtidas na página help associada. . Os três modos de acesso à página de ajuda para as opções de plot são • Clique no hyperlink: plot[options]. • Selecione a palavra plot[options] com o mouse e escolha Help on "plot[options]" que deve aparecer na segunda linha do menu help. • Digite ?plot[options] em uma linha de comando e execute. O ?plot[options] A sequência de números 1, 4, 9, 16, 25, . . . , 100 de todos os quadrados dos números de 1 a 10 podem ser construídos usando o procedimento seq. O seq(i^2,i=1..10); 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 (2.1.4) Esta sequência pode ser transformada em uma lista colocando colchêtes em torno do comando O [seq(i^2,i=1..10)]; 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 (2.1.5) O seguintes comandos plotam os pontos 0, 1 , 1, 3 , 2, 5 , 3, 7 , 4, 9 , 5, 11 , 6, 13 . Estes pontos tem a forma k, 2 k C1 onde os parâmetro k toma valores todos os valores inteiros de t 0 a 6 inclusive, de modo que podemos usar seq. A opção view pode ser utilizada para especificar o intervalo vertical a ser empregado no plot. O point_list := [seq([k,2*k+1],k=0..6)]; point_list := 0, 1 , 1, 3 , 2, 5 , 3, 7 , 4, 9 , 5, 11 , 6, 13 (2.1.6) O plot(point_list,style=point,symbol=box,color=brown,view=0. .13); 12 10 8 6 4 2 0 0 1 2 3 4 5 6 2.2 pointplot,pointplot3d Outro modo de fazer gráfico com pontos é através do comando pointplot: O restart: O with(plots): O pointlist:=[[1,2],[2,6],[4,4],[3,2]]; pointlist := 1, 2 , 2, 6 , 4, 4 , 3, 2 (2.2.1) A opção connect=true pode ser utilizada para conectar os pontos por segmentos ou curvas: O pointplot(pointlist,color=blue,connect=true); 6 5 4 3 2 1 2 3 Também podemos fazer gráficos de pontos em três dimensões: 4 O points:= [ seq([cos(Pi*T/40),sin(Pi*T/40),T/40],T=0..40) ]: O pointplot3d(points,axes=boxed,connect=true); 0.0 0.5 1.0 1.0 -1 0.5 0 0.0 1 2.3 plot3d,implicitplot3d Maple pode também plotar gráficos em 3D. A superfície pode ser girada com o mouse. O restart: O plot3d(x^2+y^2,x=-2..2,y=-2..2,axes=boxed); 8 6 4 -2 2 0 2 -1 1 0 y 0 x 1 -1 2-2 Quando temos uma função definida implicitamente, podemos utilizar o comamdo implictplot3D: O implicitplot3d(sin(x*y)+y*z^2-z,x=-1..1,y=-1..1,z=-1..1, axes=boxed); implicitplot3d sin x y Cy z2 Kz, x = K1 ..1, y = K1 ..1, z = K1 ..1, axes = boxed (2.3.1) O implicitplot3d(x^3+y^3+z^3+1=(x+y+z+1)^3, x=-2..2, y=-2..2, z=-2..2, grid=[10,10,10],axes=frame); 3 3 3 3 implicitplot3d x Cy Cz C1 = x Cy Cz C1 , x = K2 ..2, y = K2 ..2, z = K2 ..2, grid (2.3.2) = 10, 10, 10 , axes = frame No seguinte exemplo utilizamos coordenadas esféricas: O implicitplot3d(r=(3)^x*sin(y), r=0.1..5, x=-1..2*Pi, y=0.. Pi, coords=spherical); implicitplot3d r = 3x sin y , r = 0.1 ..5, x = K1 ..2 π, y = 0 ..π, coords = spherical (2.3.3) Agora utilizamos coordenadas cilíndricas: O implicitplot3d(r^2+z^2=1, r=0..1, theta=-Pi..Pi, z=-1..1, coords=cylindrical,axes=frame); implicitplot3d r2 Cz2 = 1, r = 0 ..1, θ = Kπ ..π, z = K1 ..1, coords = cylindrical, axes (2.3.4) = frame No seguinte exemplo tivemos que aumentar o número mínimo total de pontos utilizado para gerar gráfico para a obtenção de um resultado satisfatório (default 625 = 25^2): O implicitplot3d([y=sin(x*z+6), y=cos(-x*z)], x=-Pi..Pi, y=Pi..Pi, z=-1..1,color=[blue,red],axes=frame, numpoints= 2000); implicitplot3d y = sin x z C6 , y = cos x z , x = Kπ ..π, y = Kπ ..π, z = K1 ..1, color (2.3.5) = blue, red , axes = frame, numpoints = 2000 No próximo exemplo usamos a opção scaling=constrained que faz com que as escalas dos diferentes eixos sejam as mesmas. O implicitplot3d([(x+2)^3+(y+2)^2+(z+2)^2=9, (x-2)^2+(y-2)^2+ (z-2)^2=15], x=-5..7, y=-8..8, z=-8..7, color=[blue,green], scaling=constrained, axes=boxed); implicitplot3d x C2 3 C y C2 2 C z C2 2 = 9, x K2 2 C y K2 2 C z K2 2 (2.3.6) = 15 , x = K5 ..7, y = K8 ..8, z = K8 ..7, color = blue, green , scaling = constrained, axes = boxed Para ver a diferença, modifique esta opção para scaling=unconstrained (default). 2.3 polygonplot,polygonplot3d,with(plottools),animate O procedimento polygonplot, que logo abaixo é utilizado para plotar o triângulo (cheio) com vértices em 0, 0 , 0, 1 , 1, 1 and 1, 0 : O with(plots); animate, animate3d, animatecurve, arrow, changecoords, complexplot, complexplot3d, (2.4.1) conformal, conformal3d, contourplot, contourplot3d, coordplot, coordplot3d, densityplot, display, dualaxisplot, fieldplot, fieldplot3d, gradplot, gradplot3d, graphplot3d, implicitplot, implicitplot3d, inequal, interactive, interactiveparams, intersectplot, listcontplot, listcontplot3d, listdensityplot, listplot, listplot3d, loglogplot, logplot, matrixplot, multiple, odeplot, pareto, plotcompare, pointplot, pointplot3d, polarplot, polygonplot, polygonplot3d, polyhedra_supported, polyhedraplot, rootlocus, semilogplot, setcolors, setoptions, setoptions3d, spacecurve, sparsematrixplot, surfdata, textplot, textplot3d, tubeplot O triangle := [[0,0],[0,1],[.5,1]]: polygonplot(triangle,axes=none,color=orange); O ngon := n -> [seq([cos(2*Pi*i/n), sin(2*Pi*i/n)], i = 1..n) ]; 2πi 2πi ngon := n/ seq cos , sin , i = 1 ..n (2.4.2) n n O display([polygonplot(ngon(5)), textplot([0,0,`Octagon`])], color=magenta); 0.8 0.6 0.4 0.2 K0.8K0.6K0.4 Octagon 0.2 0.4 0.6 0.8 1 K0.2 K0.4 K0.6 K0.8 O pacote plots também contém o procedimento polygonplot3d que pode ser usado da seguinte forma pra traçar um cubo: O plots[polygonplot3d]([[[0,0,0],[1,0,0],[1,1,0],[0,1,0]], [[0,0,1],[1,0,1],[1,1,1],[0,1,1]], [[0,0,0],[0,1,0],[0,1,1],[0,0,1]], [[1,0,0],[1,1,0],[1,1,1],[1,0,1]], [[0,0,0],[1,0,0],[1,0,1],[0,0,1]], [[0,1,0],[1,1,0],[1,1,1],[0,1,1]]], lightmodel=light4,scaling=constrained,style=patchnogrid); Alguns objetos geométricos em 3D, assim como as operações de reflexão, rotação e translação destes objetos são encontrados no pacote plottools. Note que este pacote deve ser carregado junto plots. O with(plottools); arc, arrow, circle, cone, cuboid, curve, cutin, cutout, cylinder, disk, dodecahedron, (2.4.3) ellipse, ellipticArc, hemisphere, hexahedron, homothety, hyperbola, icosahedron, line, octahedron, parallelepiped, pieslice, point, polygon, project, rectangle, reflect, rotate, scale, semitorus, sphere, stellate, tetrahedron, torus, transform, translate, vrml O C1 := cone([0,0,0], 1/2, 2): O display( C1,axes=frame ); -0.5 0.0 2.0 0.5 -0.5 1.5 1.0 0.0 0.5 0.0 0.5 Note que a manipulação do gráfico admite dois graus de liberdade de rotação. No caso acima, não conseguimos fazer o vértice do cone apontar na direção horizontal. No entanto, ao aplicar uma π rotação de com relação a um dos eixos do plano ortogonal ao eixo de simetria do cone temos 2 O C2:=rotate(C1,Pi/2,0,0): O display(C2,axes=frame,scaling=unconstrained); 0.0 0.5 1.0 0.5 1.5 2.0 -0.5 0.25 0.0 -0.25 0.0 -0.25 0.25 -0.5 0.5 Mesmo com dois graus de liberdade somente podemos agora fazer o vértice apontar em qualquer uma das três direções espaciais . Por quê ? Façamos um objeto composto: O sorvete := cone([0,0,-2],0.7,2,color=tan), sphere([0,0,0.1],0.68,color=wheat): O plots[display](sorvete, scaling=constrained); O f := dodecahedron([0,0,0],0.8), torus([1,1,1], 0.5, 1.4): plots[display](f,orientation=[45,0],scaling=constrained); Tente colocar o dodecaedro no centro do toro. 2.4 animate Gráficos podem ser animados. O animate( 3*exp(-0.2*t-x^2)*sin(Pi*(x+t)),x=-5..5,t=0..20, view=[-3..3,-3..3],axes=normal, frames=50,numpoints=500); 3 2 1 K3 K2 K1 0 K1 1 2 3 x K2 K3 Este comando pode ser utilizado também em 3D: O animate( plot3d, [sin(t)*(x^2+y^2), x=-2..2, y=-2..2], t=0. .2*Pi,axes=boxed ); t = 0. -2 -1 0 y 1 7 2 -2 2 -1 0 -3 1 -8 x 2 O ; 2.5 Exercícios 4 3 2 1. Plote a curva y = x K4 x Kx C5 x K1 para mostrar as principais características do gráfico. Em particular, certifique-se que todas as intersecções e pontos de retorno apareçam no figura. A 4 3 2 equação x K4 x Kx C5 x K1 = 0 possui alguma solução inteira? Explique. 2. (a) Plote o gráfico de y = x sin 60 x no intervalo de x = 0 a x = 3 π usando a opção "numpoints" , se necessário, para obter um bom resultado. (b) Plote as curvas y = x sin 60 x , y = x e y = K x simultaneamente para mostrar como a curva y = x sin 60 x está "presa" entre as curvas y = x e y = K x . 3. Plote the gráficos dados pelas equações abaixo. Em cada caso escolha um intervalo conveniente que mostre as principais características do gráfico. I (a) y = x2 K5 x K3 (b) y = x3 Kx (c) y2 = x (d) x2 Ky2 = 2 Para o gráfico em (d), mostre também as assíntotas y = x e y = Kx . 2 4. Plote as funções y = x K5 x C6 e y = 1 juntas. Experimente diferentes intervalos x K2 2 para y de modo que ambos gráficos sejam mostrados de forma satisfatória. 5. Faça o mesmo com f x = sec x C4 no intervalo 0, 2 π . x 6. Estime graficamente onde as funções definidas por f x = 20 Kx e h x = 1.012 se interceptam. n 7. Faça gráficos comparativos das funções y = x , para diferentes valores de n. Faça uma animação. 8. Faça o gráfico simultâneo das superfícies definidas por sin x y Ccos z C2 = 0 e x C2 y Kx = 3. 9. Faça o gráfico das seguintes funções parametrizadas: t2 K1 2t (a) r t = 2 , 2 , para t pertencendo a KN ..N . t C1 t C1 4 t3 14 t2 t 4 t3 t2 14 t (b) r t = K C C1, K K C , para t pertencendo a (0,1) 9 9 9 9 9 9 10. Desenhe um pentágono inscrito numa circunferência. 11. Desenho um toro que possa ser interativamente orientado em qualquer direção espacial. 12. Plote o Folium, que é definido como o gráfico em coordenadas polares de seguinte função 2 radial: cos θ 4 sin θ K1 . Utilize a opção coords=polar (veja exemplos no menu help) para traçar o gráfico em coordenadas polares. 3 Expressões e Funções 3.1 Seta, eval Ao usar Maple é importante distinguir cuidadosamente expressões e funções. Por exemplo, x2 K4 x C3 and x C2 são funções na variável x. Elas são introduzidas como já fizemos antes, atribuindo nomes se necessário: O x^2-4*x+3;h:=sqrt(x)+2; x2 K4 x C3 h := x C2 (3.1.1) Em matemática utilizamos tais expressões para definir funções, como f x = x2 K4 x C3 e g x = x C2. Em Maple as funções f e g devem ser entendidas agora de uma forma bastante precisa, como nomes de ações ou procedimentos associados com valores computados destas expressões para um dado número de entrada x. No Maple funções são facilmente definidas utilizado a seta. Por exemplo, O f := x -> x^2-4*x+3; f := x/x2 K4 x C3 (3.1.2) Uma vez que tal comando foi executado a função f pode ser utilizada durante a seção como qualquer outra função definida previamente. Assim, O f(1/2); 5 (3.1.3) 4 O f(3); (3.1.4) 0 Entradas simbólicas também podem ser utilizadas. O f(s); 2 s K4 s C3 O f(s+1); s C1 2 (3.1.5) (3.1.6) K4 s K1 A função pode plotada: O plot(f(x),x=0..4); 3 2 1 0 K1 ou O plot(f,0..4); 1 2 x 3 4 3 2 1 0 1 2 3 4 K1 Outras funções podem ser definidas em termo de f: O g := x -> f(x-1); h := x -> f(x-2); g := x/f x K1 (3.1.7) h := x/f x K2 O plot([f(x),g(x),h(x)],x=0..6,y=-1..3,color=[red,aquamarine, gold],thickness=2); 3 2 y 1 0 1 2 3 x 4 5 6 K1 Uma vez que a função foi definida, o Maple lembrará desta função durante toda a seção. É possível sobrescrever a definição de uma função com uma nova definição. Por exemplo, se queremos mudar a definição da função f x = executar o comando: x , devemos digitar e x C1 2 O f := x -> x/(x^2+1); f := x/ x x C1 2 (3.1.8) A presente (nova) definição da função f pode ser confirmada da seguinte forma: O f(x); x x C1 2 (3.1.9) ou, utilizando o comando de avaliação, O eval(f); x/ x 2 x C1 Digitando simplesmente f; em uma linha de comando não é suficiente: O f; f Note: Note que com a nova definição de f, g e h també, mudam: O g(x); x K1 x K1 2 C1 O h(x); x K2 x K2 2 C1 (3.1.10) (3.1.11) (3.1.12) (3.1.13) No entanto, a aplicação de eval a g confirma as definições de g in termos de f, mas não diz nada sobre f: O eval(g); x/f x K1 (3.1.14) O plot([f(x),g(x),h(x)],x=-5..7,color=[red,aquamarine,gold], thickness=2); 0.4 0.2 K4 K2 0 2 4 6 x K0.2 K0.4 Para limpar a atribuição de f sem redefini-lo fazemos O f := 'f'; f := f (3.1.15) Um certo número de funções, digamos, f, g, h, podem ter suas atribuições limpadas simultaneamente: O unassign('f','g','h'); Para economizar memória é sempre bom limpar as atribuições de funções e variáveis, ao iniciar um novo problema. Alternativamente podemos sempre usar restart; para limpar tudo da memória. 3.2 unapply, map Uma expressão como O F:= x^2-4*x+3; F := x2 K4 x C3 (3.2.1) pode ser transformada em uma função com o comando unapply: O f:=unapply(F,x); f := x/x2 K4 x C3 (3.2.2) Podemos calcular o valor da função em x = 3, por exemplo, de dois modos. O f(3); 0 (3.2.3) O eval(F,x=3); 0 O comando subs pode ser também usado para avaliar a expressão num dado ponto: O subs(x=3,F); 0 (3.2.4) (3.2.5) O procedimento de Maple map é um exemplo de procedimento que funciona somente com funções e não expressões. O g := x -> x^2; map(g,[1,2,3,4,5,6]); 2 g := x/x 1, 4, 9, 16, 25, 36 (3.2.6) O comando evalf avalia um número em dígitos flutuantes até uma precisão especificada. Vamos então construir a função: O evalf15 := x -> evalf(x,15); evalf15(Pi); evalf15 := x/evalf x, 15 3.14159265358979 (3.2.7) 3.3 proc Outro modo de definir funções é através de procedimentos: O h:=proc(a,b) if a<0 then print(erro) else O plot(sqrt(x)+1,x=a..b) end if; O end; h := proc a, b if a ! 0 then print erro else plot sqrt x C1, x = a ..b end if end proc O h(0,1); (3.3.1) 2 1.8 1.6 1.4 1.2 1 0 0.2 0.4 0.6 0.8 1 x O h(b); Error, (in h) cannot determine if this expression is true or false: b < 0 Podemos também definir funções de várias variáveis: O g:=(x,y)->x*y^2+x-y^2; 2 2 g := x, y /x y Cx Ky ou O F:=proc(x,y) O x*sin(y)+x^2 O end; O F(1,2); F := proc x, y x * sin y Cx^2 end proc (3.3.3) sin 2 C1 (3.3.4) O Ff:=proc(x,y) O evalf(x*sin(y)+x^2) O end; Ff := proc x, y evalf x * sin y Cx^2 end proc O Ff(Pi,Pi); (3.3.2) 9.869604404 O seq(map(Ff, [1,2,3], 1+i),i=1..3); 1.909297427, 5.818594854, 11.72789228 , 1.141120008, 4.282240016, 9.423360024 , 0.2431975047, 2.486395009, 6.729592514 (3.3.5) (3.3.6) (3.3.7) 3.4 Exercícios 2 x3 C3 x2 K1 1 (a) Construa a função f x = 4 x C4 usando a notação seta. (b) Determine f K1 , f 0 e f 1 . (c) Faça o gráfico de f sobre o intervalo de x = K4 a x = 4. x3 C3 x2 K1 (d) Use o procedimento eval para avaliar a expressão para x = K1, x = 0 e x = 1. 4 x C4 2 Construa uma função cuja entrada é uma lista qualquer e cuja saída é uma lista que avalia o seno de cada elemento da lista de entrada. 4. Solução de Equações Algébricas 4.1 solve, fsolve O restart: Vamos agora considerar equações algébricas do tipo O eq1:=a*x^2+b*x+c=0; eq1 := a x2 Cb x Cc = 0 (4.1.1) Podemos resolver esta equação para x: O sol:=solve(eq1,x); b2 K4 a c 1 bC ,K a 2 1 Kb C sol := 2 b2 K4 a c a (4.1.2) O sol[1]; 1 Kb C 2 b2 K4 a c a 1 bC 2 b K4 a c a (4.1.3) O sol[2]; K 2 (4.1.4) Consideremos algumas equações mais específicas, dando valores às constantes a, b e c : O eq2:=subs(a=1,b=3,c=-4/5,eq1); 4 eq2 := x2 C3 x K =0 5 O sol:=solve(eq2,x); sol := K Em pontos flutuantes, O evalf(sol); 3 1 C 2 10 305 , K 3 1 K 2 10 0.246424920, K3.246424920 305 (4.1.5) (4.1.6) (4.1.7) Poderíamos ter escrito desde o início, O evalf(solve(eq2,x)); 0.246424920, K3.246424920 ou O fsolve(eq2,x); (4.1.8) K3.246424920, 0.2464249197 (4.1.9) printlevel := 1 (4.1.10) O printlevel:=1; Estas duas formas não sempre equivalentes, no entanto. Consideremos, por exemplo, O eq3:=x^3-x^2+1; 3 2 eq3 := x Kx C1 (4.1.11) O evalf(solve(eq3)); K0.7548776667, 0.8774388331 K0.7448617670 I, 0.8774388331 C0.7448617670 I (4.1.12) O fsolve(eq3); (4.1.13) K0.7548776662 Para que o comando fsolve possa encontrar também raízes complexas o argumento complex deve ser dado: O fsolve(eq3=0,x,complex); K0.7548776662, 0.8774388331 K0.7448617666 I, 0.8774388331 C0.7448617666 I (4.1.14) Vejamos outro exemplo com uma equação não polinomial: O eq4:=sin(x)+x^(1/2)-3/2; eq4 := sin x C x K O evalf(solve(eq4,x)); O fsolve(eq4); 3 2 (4.1.15) 0.7141134004 (4.1.16) 3.530173727 (4.1.17) Para esclarecer este dilema façamos um gráfico: O plot(eq4,x=0..14); 3 2 1 0 2 4 6 8 10 12 14 x K1 Portanto, ambos comandos dão resultados corretos mas incompletos. O conhecimento do gráfico nos dá uma indicação da localização das raízes e fsolve pode ser utilizado para determinar os seus valores exatos: O r1:=fsolve(eq4,x,0..2); r1 := 0.7141134004 (4.1.18) O r2:=fsolve(eq4,x,2..4); r2 := 3.530173727 (4.1.19) O r3:=fsolve(eq4,x,4..6); r3 := 5.338242169 (4.1.20) 4.2 Exercícios 3 Resolva as equações abaixo e ilustre graficamente 1 1 sin x Csin 2 x Kx C = 0, 2 2 x 3 Kex = 0, 4 3 x5 K3 x4 K7 x3 C4 x2 Kx C3=0. 5. Simplificando Expressões O problema de simplificação de expressões é um problema clássico de computação algébrica, e também é um dos mais difíceis. Embora heuristicamente seja fácil ter uma noção sobre o que é a forma mais simples de uma expressão, quando se trata de traduzir este procedimento em termos de algoritmos, formidáveis dificuldades de programação aparecem. Em Maple há certos comandos destinados a simplificação de expressões. Como veremos nas Seções seguintes, cabe ao usuário decidir qual comando de simplificação utilizar em cada momento. Comando factor Vamos supor que temos a seguinte expressão algébrica: O restart: O q:=(x^2-x-2); q := x2 Kx K2 (5.1.1) O comando factor, como o nome sugere, fatoriza esta expressão: O factor(q); x C1 x K2 (5.1.2) Do mesmo modo, se O p:=(x^2-1); p := x2 K1 temos O factor(p); x C1 (5.1.4) x2 K1 x2 Kx K2 (5.1.5) x K1 Portanto, numa expressão tal como O f:=p/q; f := (5.1.3) O comando factor produz uma simplificação: O factor(f); x K1 x K2 (5.1.6) Consideremos agora a expressão O ex1:=(x^2-2*x+1)^2+(y^2+2*y+1)^2; ex1 := x2 K2 x C1 2 C y2 C2 y C1 2 Aplicando o comando factor obtemos O factor(ex1); x4 K4 x3 C6 x2 K4 x C2 Cy4 C4 y3 C6 y2 C4 y (5.1.7) (5.1.8) o que não simplificou o problema. Notemos agora o seguinte: O op(1,ex1); x2 K2 x C1 O op(2,ex1); y2 C2 y C1 2 2 (5.1.9) (5.1.10) Ou seja, o comando op extrai os operandos da expressão. Portanto, podemos fatorar ex1 eficientemente fazendo O factor(op(1,ex1))+factor(op(2,ex1)); x K1 4 C y C1 4 (5.1.11) Se tivéssemos uma expressão muito longa este método seria trabalhoso. Um modo mais eficiente para resolver este problema é utilizando o comando map : O map(factor,ex1); 4 4 x K1 C y C1 (5.1.12) O comando factor aplicado à expressão definida por O g:=(x^30-1)/(x-1); x30 K1 g := x K1 produz consequências desastrosas: O factor(g); 2 2 x C1 x Cx C1 x Kx C1 7 5 4 3 Kx Cx Kx Cx Kx C1 4 3 (5.1.13) 2 x Cx Cx Cx C1 8 7 5 4 4 3 2 x Kx Cx Kx C1 8 x (5.1.14) 3 x Cx Kx Kx Kx Cx C1 Resolveremos este problema através do comando normal. Comando normal O comando normal é similar ao comando factor. A diferença é que normal, ao encontrar uma razão entre duas expressões, limita-se a procurar fatores comuns entre numerador e denominador. Por exemplo, O q; x2 Kx K2 (5.2.1) O normal(q); O p; O normal(p); Entretanto, O p/q; O normal(p/q); 2 x Kx K2 (5.2.2) x2 K1 (5.2.3) x2 K1 (5.2.4) x2 K1 x2 Kx K2 (5.2.5) x K1 x K2 (5.2.6) produzindo neste caso o mesmo resultado que factor. No entanto, a diferença reaparece se no caso mais geral O g; x30 K1 (5.2.7) x K1 O normal(g); 29 28 27 26 25 24 23 22 21 20 19 18 17 16 1 Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx 15 14 13 12 11 10 9 8 7 2 4 3 6 (5.2.8) 5 Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Cx Ou seja, normal procurou no numerador o fator comum ao denominador e expandiu o fator restante. Em quais casos há vantagem de se usar normal em lugar de factor ? Consideremos o seguinte exemplo: O h:=1/(1-x^20)+1/(1-x^10); 1 1 h := C (5.2.9) 20 10 1 Kx 1 Kx O factor(h); 10 K x C2 x K1 C1 8 6 4 x C1 4 3 2 x Cx Cx Cx C1 4 3 2 x Kx Cx Kx C1 2 x (5.2.10) 2 x Kx Cx Kx C1 O normal(h); K x10 C2 10 K1 Cx 10 x C1 (5.2.11) Como podemos ver, factor obteve o mínimo múltiplo comum entre os denominadores e fatorizou cada expressão em termos de fatores irredutíveis. O comando normal fez o mesmo, mas não tentou fatorizar os termos no denominador, gerando uma expressão mais simples. Comando expand Quando uma expressão é gerada em Maple, por meio de uma entrada do usuário, ou por meio de um cálculo, esta expressão é mantida na sua forma original, até que o usurio determine o contrário. Ou seja, expressões algébricas são mantidas na forma em que foram fornecidas. Por exemplo, uma expressão fatorada é mantida nesta forma até que sua expansão seja ordenada: O f1:=(x-a)^6; f1 := x Ka 6 (5.3.1) O expand(f1); 6 5 4 2 3 3 2 4 5 6 x K6 x a C15 x a K20 x a C15 x a K6 x a Ca O factor(%); a Kx 6 (5.3.2) (5.3.3) O comando factor pode ser usado também para expandir funções trigonométricas, logarítmicas exponenciais, especiais, etc.: O f2:=cos(omega*t+delta); f2 := cos ω t Cδ (5.3.4) O expand(f2); O f3:=ln(x^2*y); O expand(f3); cos ω t cos δ Ksin ω t sin δ (5.3.5) f3 := ln x2 y (5.3.6) ln x2 y (5.3.7) O Psi(4*x); (5.3.8) Ψ 4x O expand(%); 1 1 1 2 ln 2 C Ψ x C Ψ xC 4 4 4 C 1 1 Ψ xC 4 2 C 1 3 Ψ xC 4 4 (5.3.9) onde Ψ x é a função digamma. Em determinados casos desejamos expandir somente parte de uma expressão. Vamos supor que O f4:=(sin(alpha+beta)+x)^2; 2 f4 := sin α Cβ Cx (5.3.10) O expand(f4); sin α 2 2 cos β Ccos α 2 C2 sin α cos β cos α sin β C2 sin α cos β x sin β 2 (5.3.11) C2 cos α sin β x Cx2 Caso não queiramos expandir a função sin, procedemos da seguinte forma: O expand(f4,sin); sin α Cβ 2 C2 sin α Cβ x Cx2 (5.3.12) Vejamos outro exemplo: O f5:=sin(omega*(t-t0)+delta); f5 := sin ω t Kt0 Cδ (5.3.13) O expand(f5); sin ω t cos ω t0 cos δ Csin ω t sin ω t0 sin δ Kcos ω t sin ω t0 cos δ (5.3.14) Ccos ω t cos ω t0 sin δ O expand(f5,t-t0); sin ω t Kt0 cos δ Ccos ω t Kt0 sin δ Consideremos agora a atuação de expand sobre funções racionais: O f6:=(x-y)^2/(x+y)^3; x Ky 2 f6 := x Cy 3 O expand(f6); x2 x Cy 3 K 2xy x Cy 3 C y2 x Cy 3 (5.3.15) (5.3.16) (5.3.17) Ou seja, o denominador não foi expandido. Para fazer isso devemos proceder da seguinte forma: O normal(f6,expanded); x2 K2 x y Cy2 (5.3.18) x3 C3 x2 y C3 x y2 Cy3 Comando combine A operação realizada por expand é baseada num algoritmo simples. Por outro lado, a operação inversa de fatorização é um processo complexo baseado em um longo e complexo procedimento envolvendo técnicas sofisticadas de álgebra. Portanto, embora seja fácil obter a expansão de qualquer função, a fatorização requer maior cuidado e interação do usuário com o sistema. Por exemplo, O g1:=sin(alpha+beta)+cos(omega+delta); g1 := sin α Cβ Ccos ω Cδ (5.4.1) O expand(g1); sin α cos β Ccos α sin β Ccos ω cos δ Ksin ω sin δ (5.4.2) O factor(%); sin α cos β Ccos α sin β Ccos ω cos δ Ksin ω sin δ (5.4.3) Ou seja, factor não foi capaz fazer com que pudéssemos recuperar a expressão original. Para isso é necessário especificar o tipo de fatorização que desejamos. O comando combine é útil neste caso: O combine(%,trig); sin α Cβ Ccos ω Cδ (5.4.4) Vejamos outros exemplos: O g2:=(x+a)^n*(x+a)^s; g2 := x Ca O combine(g2,power); O combine(g3,exp); x Ca s (5.4.6) g3 := e2 x eb (5.4.7) e2 x C b (5.4.8) O g4:=exp(sin(alpha)*cos(beta))*exp(cos(alpha)*sin(beta)); g4 := esin α cos β ecos α sin β O combine(g4,exp); O combine(%,trig); esin α (5.4.5) n Cs x Ca O g3:=exp(2*x)*exp(b); n cos β C cos α sin β esin α C β Podemos executar a simplificação acima, de uma só vez, da seguinte forma: O combine(g4,[trig,exp]); esin α C β (5.4.9) (5.4.10) (5.4.11) (5.4.12) Simplificações envolvendo ln necessitam o parâmetro adicional "simbolic". Por exemplo, O g5:=3*ln(x)+2*ln(y); g5 := 3 ln x C2 ln y (5.4.13) O combine(g5,ln,symbolic); ln x3 y2 (5.4.14) Comando convert Embora o comando convert seja de utilidade mais geral, ele pode ser utilizado em simplificações, como veremos nos próximos exemplos. Sua sintaxe é convert(expressão, forma) onde onde argumento "forma" pode ser um dos seguintes: trig, tan, ln, exp expln, expsincos, rational, parfrac, radians, degree, GAMMA, factorial, etc. Por exemplo, O m1:=(exp(I*theta)+exp(-I*theta))/2; 1 Iθ 1 KI θ m1 := e C e (5.5.1) 2 2 O convert(m1,trig); cos θ O convert(%,exp); O m2:=arcsinh(x); 1 Iθ 1 KI θ e C e 2 2 m2 := arcsinh x (5.5.2) (5.5.3) (5.5.4) O convert(m2,ln); ln x C 2 x C1 (5.5.5) O convert(n!,GAMMA); Γ n C1 (5.5.6) n! (5.5.7) n! (5.5.8) O convert(%,factorial); O expand(%); O convert(binomial(n,k),factorial); n! k! n Kk ! (5.5.9) Comando simplify O comando simplify é um comando geral de simplificação, que busca funções dentro de uma expressão que podem ser simplificadas utilizando propriadades pré-definidas no sistema. Entretanto, podemos usar este comando de forma selecionada, como no exemplo: O n1:=(sin(x)^2+2*cos(x)^2)*exp(y)/exp(y+x); sin x 2 C2 cos x 2 ey n1 := (5.6.1) ex C y O simplify(n1); O simplify(n1,trig); eKx cos x 2 C1 (5.6.2) y e 2 cos x C1 ex C y (5.6.3) Ou seja, somente simplifícações trigonométricas foram efetuadas no último comando. Os argumentos em simplify podem ser trig, hypergeom, radical, power, exp, ln, sqrt, Bessel, BesselJ, BesselK, BesselY, Ei, GAMMA, RootOf, LambertW, dilog, polylog, pg, pochhammer e atsign. O comando simplify pode muito útil na simplificação de expressões envolvendo vínculos. Por exemplo, vamos supor que a expressão O n2:=x^2+2*x*y+y^3; 2 3 n2 := x C2 x y Cy (5.6.4) está sujeita aos vínculos O vinculos:={x+y+z=3, x^2+y=1, x-y+z^2=0}; 2 2 vinculos := x Cy = 1, x Ky Cz = 0, x Cy Cz = 3 (5.6.5) O simplify(n2,vinculos); K35 x2 C23 x C17 x3 K14 (5.6.6) Outra utilidade de simplify é na substituição de produtos em expressões por outras expressões ou múmeros. Por exemplo, suponhamos que O n3:=x^2*y^5*z; 2 5 n3 := x y z (5.6.7) Se queremos examinar o resultado da substituição z = 1 na expressão acima utilizamos o comando subs O subs(z=1,n3); 2 5 x y (5.6.8) 2 4 Entretanto, se quisermos substituir x y = z sin z na expressão n3, o comando subs é inefetivo: O subs(x^2*y^4=sin(z)*z,n3); 2 5 x y z (5.6.9) 2 4 Podemos utilizar simplify onde x y = z sin z é considerado como um vínculo: O simplify(n3,{x^2*y^4=sin(z)*z}); z2 y sin z (5.6.10) Podemos fazer com que o comando simplify assuma as hipóteses feitas utilizando o comando assume. Por exemplo, O p1:=(x^2*y^4)^(1/2); p1 := x2 y4 (5.6.11) O simplify(p1,assume=nonneg); x2 y4 Acima, a opção assume=nonneg fez com que todas as variáveis sejam declaradas temporariamente não-negativas. 6. Cálculo Diferencial e Integral (5.6.12) 6.1 Limites, Somatórios e Produtórios O comando que calcula o limite de uma função quando ela tende a algum valor é feito pelo comando limit. Ele é capaz de realizar o cálculo de limites mesmo quando a direta inserção do valor crítico na função é um resultado indefinido (por exemplo, N N ). Quando o comando é executado com a primeira letra maiúscula (Limit), ele assume a forma inerte e nenhum cálculo é feito. Esta forma é muito usada para visualizar a expressão antes que o cálculo seja realmente feito com a auxílio do value. O Limit((sqrt(1+x)-1)/x,x=0); 1 Cx K1 lim (6.1.1) x/0 x O value(%); 1 2 (6.1.2) O Limit(tan(Pi/4+x)^cot(2*x),x=0)=limit(tan(Pi/4+x)^cot(2*x), x=0); cot 2 x 1 lim tan π Cx =e (6.1.3) x/0 4 O Limit(x!/x^x,x=infinity)=limit(x!/x^x,x=infinity); x! lim =0 x/N x x (6.1.4) O resultado é avaliado simbolicamente sempre que possível, mesmo quando a expressão possui variáveis desconhecidas. O f:=(x^a-x^(-a))/(x-1/x); xa KxKa f := (6.1.5) 1 xK x O limit(f,x=1); (6.1.6) a O limite também pode ser calculado com funções multivariáveis. Para isso o coordenada em que se quer calcular o limite deve ser especificada da forma {x=x0,y=y0,...}. O limit( (x+y)/x + (x+y)/y , {x=0,y=1} ); undefined (6.1.7) Quando queremos calcular o limite da função 1 quando x/0 o Maple não encontra dificuldade x2 1 veja o resultado: x O Limit(1/x^2,x=0)=limit(1/x^2,x=0); de dizer que é N, porém para a função (6.1.8) 1 =N 2 x lim x/0 O Limit(1/x,x=0)=limit(1/x,x=0); 1 lim = undefined x/0 x (6.1.8) (6.1.9) O motivo deste resultado é que o Maple reconhece que o limite desta função para este valor depende da direção de aproximação. O Limit(1/x,x=0,left)=limit(1/x,x=0,left); 1 lim = KN (6.1.10) x/0K x O Limit(1/x,x=0,right)=limit(1/x,x=0,right); 1 lim =N x/0C x (6.1.11) Para representar somatórios usa-se o comando sum: o primeiro parâmetro representa a função e o segundo contém o intervalo da variável do somatório. Assim como no limite este comando também possui a sua forma inerte. O Sum(1/x^n,n=1..5); 5 > x1 (6.1.12) 1 1 1 1 1 C 2 C 3 C 4 C 5 x x x x x (6.1.13) n n=1 O value(%); Se a variável já possui um valor previamente associado então esta variável deve estar entre aspas simples (') e o todo primeiro parâmetro também. O z:=10; z := 10 (6.1.14) O Sum(1/z^3,z=1..5)=sum(1/z^3,z=1..5); Error, (in sum) summation variable previously assigned, second argument evaluates to 10 = 1 .. 5 O Sum('1/z^3','z'=1..5)=sum('1/z^3','z'=1..5); 5 > z1 z= 1 3 256103 216000 = (6.1.15) Quando se desejar fazer um somatório infinito basta especificar no intervalo. O Sum(1/2^n,n=1..infinity)=sum(1/2^n,n=1..infinity); N > 21 n= 1 n =1 (6.1.16) Se você quiser construi somatórios de algumas variáveis pode-se colocar um somatório dentro de outro. O exemplo seguinte mostra como o sum é usado para construir uma fórmula que usa elementos de uma matriz como coeficiente. O Sum(Sum(k[i,j]*y^(i+j),i=1..3),j=1..3); 3 3 > >k i Cj i, j y j=1 i= 1 O value(%); 2 3 4 3 4 5 4 5 6 k1, 1 y Ck2, 1 y Ck3, 1 y Ck1, 2 y Ck2, 2 y Ck3, 2 y Ck1, 3 y Ck2, 3 y Ck3, 3 y (6.1.17) (6.1.18) A mesma sintaxe do sum pode ser usada para o comando product que calcula o produtório especificado no primeiro parâmetro. O Product(x,x=1..5); 5 ?x (6.1.19) 120 (6.1.20) x= 1 O value(%); O Product(1+1/x^2,x=1..10)=product(1+1/x^2,x=1..10); 10 ? 1C x= 1 1 x2 = 2200962205 658409472 O product( 1+1/x^2 , x=1..infinity ); sinh π π O evalf(%); 3.676077910 (6.1.21) (6.1.22) (6.1.23) 6.2 Diferenciação Esta seção trata dos comandos relacionados ao cálculo de derivadas. O comando que calcula a derivada é o diff. Funções definidas por equações também podem ser derivads pelo comando implicitdiff. O operador relacionado com a derivada é a letra d maiúscula (D). Para o comando de derivada deve-se passar a função e a variável de derivação como argumentos tanto para a forma normal como para a forma inerte. O restart; O Diff(x^3+x^2+x,x); O value(%); d dx x3 Cx2 Cx 3 x2 C2 x C1 (6.2.1) (6.2.2) O Diff(x^3+x^2+x,x,x)=diff(x^3+x^2+x,x,x); d2 x3 Cx2 Cx = 6 x C2 2 dx (6.2.3) Para derivadas de ordem superiores a dois convém utilizar o operador dólar ($) responsável pelas repetições. O Diff(x^3+x^2+x,x$3)=diff(x^3+x^2+x,x$3); 3 d 3 2 x Cx Cx = 6 (6.2.4) 3 dx Obviamente o Maple conhece todas as regras de derivação como regra da cadeia, regra do produto e da divisão de derivadas. O Diff(sin(cos(x)),x)=diff(sin(cos(x)),x); d sin cos x = Kcos cos x sin x (6.2.5) dx Para funções não definidas, o operador D é usado no resultado. O Diff(f(g(x)),x)=diff(f(g(x)),x); d d f g x =D f g x g x dx dx É possível derivar em função de qualquer variável da epressão. O Diff((x^2+y^3)^4,x,y)=diff((x^2+y^3)^4,x,y); v2 2 3 4 2 3 2 2 x Cy = 72 x Cy x y vy vx (6.2.6) (6.2.7) Para derivadas de funções definidas implitamente poderia ser feito o seguinte procedimento: O diff(x^2+y(x)^2=1,x); d 2 x C2 y x y x =0 (6.2.8) dx O solve(%,diff(y(x),x)); K x y x Porém o comando implicitdiff já resolve diretamente. O implicitdiff(x^2+y^2=1,y,x); x K y (6.2.9) (6.2.10) Enquanto o diff é usado para funções, o D é usado para calcular a derivada de operadores. O D(sin); cos (6.2.11) O D(sin@cos); Kcos 2 sin Quando a função tem vários parâmetros devemos colocar entre colchetes o número correspondente à várivel sobre a qual se deseja derivar. O f:=(x,y)->sin(x)+cos(y)+sin(x*y); f := x, y /sin x Ccos y Csin y x O D[1](f); O D[2](f); (6.2.12) (6.2.13) x, y /cos x Ccos y x y (6.2.14) x, y /Ksin y Ccos y x x (6.2.15) Podemos, ainda, passar novos valores a serem substituídos na expressão do resultado. O D[2](f)(alpha,beta); Ksin β Ccos β α α (6.2.16) Algumas vezes o formato D é mais desejado, outras o diff se torna mais conveniente. Para mudar de um para outro pode ser usado o comando convert. E o lprint auxilia na visualização da estrutura interna da expressão. Sendo que no Release 5 este comando se torna obsoleto, pois a estrutura interna de uma expressão no format output pode ser obtido no format input posicionando o cursor no próprio resultado e pressionando [Enter]. O restart; O diff(f(x,y,z),x,y,z$2); v4 f x, y, z (6.2.17) vz2 vy vx O convert(%,D); x, y, z (6.2.18) v4 f x, y, z vz2 vy vx (6.2.19) D1, 2, 3, 3 f O lprint(%); (D[1, 2, 3, 3](f))(x, y, z) O convert(%,diff); O lprint(%); diff(diff(diff(diff(f(x, y, z), x), y), z), z) 6.3 Integração Do ponto de vista matemático, a integração simbólica é mais complexa do que a derivação pois não há um método único que resolva todas as integrais. Existem regras de integração capazes de reduzir expressões em formas de integrais conhecidas ou tabeladas. O Maple possui um extenso acervo de solução algébrica de integrais, mas certamente não resolve todas aquelas existentes na matemática. Quando encontrarmos uma dessas é possível encontrar a sua solução numérica. Para fazer uma integração simbólica o comando utilizado é o int sendo que, assim como nos comandos vistos neste capítulo, quando a primeira letra é maiúscula, o comando assume a sua forma inerte. O Int(x^2+x^3,x); x2 Cx3 dx (6.3.1) O value(%); 1 3 1 4 x C x 3 4 (6.3.2) O Int(x^2+x^3,x=a..b)=int(x^2+x^3,x=a..b); b 2 3 x Cx dx = a 1 3 1 3 1 4 1 4 b K a C b K a 3 3 4 4 (6.3.3) Para fazer a integral numérica, od limites devem estar definidos O Int(x^2+x^3,x=2..3)=int(x^2+x^3,x=2..3); 3 x2 Cx3 dx = 2 271 12 (6.3.4) O Maple não encontra dificuldade quando o integrando possui uma descontinuidade no intervalo de integração. O f:=cos(x)/sqrt(1-sin(x)); cos x f := (6.3.5) 1 Ksin x O plot(f,x=0..2*Pi,discont=true,color=black); 1 0.5 0 K0.5 1 2 3 4 5 6 x K1 O Int(f,x=0..2*Pi)=int(f,x=0..2*Pi); (6.3.6) 2π 0 cos x (6.3.6) dx = 0 1 Ksin x O Maple reconhece a função degrau (Heaviside) e a função delta de Dirac (Dirac) durante o processo de integração O Int(g(x)*Heaviside(x-2),x=0..5)=int(g(x)*Heaviside(x-2),x= 0..5); 5 5 g x Heaviside x K2 dx = 0 g x dx (6.3.7) 2 O Diff(Heaviside(x),x)=diff(Heaviside(x),x); d Heaviside x = Dirac x dx (6.3.8) O Int(sin(x)*Dirac(x-Pi/4),x=-infinity..infinity)=int(sin(x)* Dirac(x-Pi/4),x=-infinity..infinity); N sin x Dirac x K KN 1 1 π dx = 4 2 2 (6.3.9) Para representar integrais múltiplas é necessário colocar um comando de integral dentro de outro. O Int(Int(x^2,x=0..2),x=0..3)=int(int(x^2,x=0..2),x=0..3); 3 2 x2 dx dx = 8 (6.3.10) 0 0 Freqüentemente encontramos integrais que não possuem solução algébrica. Quando o Maple não consegue encontrar uma solução algébrica é retornado a integral na forma inerte. Para encontrar a solução numérca utiliza-se o copmando evalf. O int(sin(1/x^3),x=1..2); 2 (6.3.11) 0.3548334332 (6.3.12) 1 O evalf(%); 1 x3 dx sin 6.4 Expansão em Séries O comando que faz a expansão em séries é series. Dependendo da expressão do primeiro parâmetro, este comando pode gerar expansão em Taylor, Laurent ou séries de potência genérica. O segundo parâmetro é o ponto de expansão e o terceiro, a máxima potência da série. Este último é opcional e ser for omitido, o Maple usa o valor da variável global Orderque é inicializado com 6. O series(log(x),x=1); 1 1 2 x K1 K x K1 C x K1 2 3 3 K 1 4 x K1 4 C 1 5 x K1 5 CO x K1 O series(sin(x),x=0,10); 1 3 1 1 1 5 7 9 10 xK x C x K x C x CO x 6 120 5040 362880 6 (6.4.1) (6.4.2) 6 O tipo da saída obtido é series que caracterizado por um truncamento (O x K1 ). Por este motivo, os resultados obtidos pelo comando serires não podem ser processados em seguida. Para converter a expansão para um polinômio usa-se o comando convert. O whattype(%); series (6.4.3) O pol:=convert(%%,polynom); 1 3 1 1 1 pol := x K x C x5 K x7 C x9 6 120 5040 362880 (6.4.4) O gráfico seguinte mostra a função sin x e a sua expansão em séries até potência 9. O plot([pol,sin(x)],x=0..2*Pi,-1..1,color=black); 1 0.5 0 1 2 3 4 5 6 x K0.5 K1 O comando mtaylor calcula a expansão em série de Taylor para funções multi-variáveis, pois o series só efetua o cálculo para apenas uma. As suas sintaxes são iguais, sendo que para a expansão com muitas variáveis o segundo parâmetro deve ser uma lista de pontos sobre os quais se deseja realizar a expansão. Antes de usar o comando é necessário carregá-lo com readlib. O ### WARNING: persistent store makes one-argument readlib obsolete readlib(mtaylor); proc ... end proc (6.4.5) O mtaylor(log(x+y),[x=1,y=Pi],3); y Kπ x K1 1 ln 1 Cπ C C K 2 1 Cπ 1 Cπ 2 x K1 1 Cπ 2 K y Kπ x K1 1 Cπ 2 1 K 2 y Kπ 1 Cπ 2 2 (6.4.6) O pacote powseries contém comandos auxiliares para o processamento de séries. Pode ser usado para manipular series que possuem uma regra geral de expansão realizando adições, subtrações, multiplicações, divisões, derivações e inversões destas séries. Devemos carregar o pacote com o comando with. O with(powseries); compose, evalpow, inverse, multconst, multiply, negative, powadd, powcos, powcreate, (6.4.7) powdiff, powexp, powint, powlog, powpoly, powsin, powsolve, powsqrt, quotient, reversion, subtract, tpsform Suponha que queremos calcular a série cuja fórmula geral é: O p(n)=(1+(-1)^(n+1))/2*(-1)^((n-1)/2)/n!; p n = 1 2 1 C K1 n C1 K1 1 1 nK 2 2 n! (6.4.8) O comando que cria a série é o powcreate que não mostra nenhuma saída mas faz a atribuição a variável p que não pode ter nenhum conteúdo neste momento. O comando tpsform é usado para visualizar a série gerada. O powcreate(%);tpsform(p,x,9); 1 3 1 1 xK x C x5 K x7 CO x9 (6.4.9) 6 120 5040 Veja como executar uma operação matemática ou uma inversão com a série criada e compare o resultado obtido com o comando series. O q:=evalpow(p*p):tpsform(q,x,9); 1 4 2 6 1 x2 K x C x K x8 CO x9 (6.4.10) 3 45 315 O series(sin(x)^2,x,9); 1 4 2 6 1 x2 K x C x K x8 CO x10 3 45 315 (6.4.11) O r:=reversion(p):tpsform(r,x,9); 1 3 3 5 5 xC x C x C x7 CO x9 6 40 112 (6.4.12) O series(arcsin(x),x,9); 1 3 3 5 5 xC x C x C x7 CO x9 6 40 112 (6.4.13) 6.5 O Pacote student: Ferramentas de Cálculo O pacote student possue ferramentas úteis para o aluno iniciante de cálculo pois demonstram conceitos elementares e fundamentais para o seu apredizado. Ele deve ser carregado com o comando with, que seguido de ponto-e-vírgula imprimie todos os seus comandos. O with(student); D, Diff, Doubleint, Int, Limit, Lineint, Product, Sum, Tripleint, changevar, (6.5.1) completesquare, distance, equate, integrand, intercept, intparts, leftbox, leftsum, makeproc, middlebox, middlesum, midpoint, powsubs, rightbox, rightsum, showtangent, simpson, slope, summand, trapezoid O exemplo abaixo soluciona uma integral pelo método de substituição de variável que o Maple não consegue resolver sem esta manipulação. Porém outras integrais podem ser resolvidas com este comando para mostrar o procedimento do método. O A:=Int(tan(1/3*arctan(x)),x=0..1); 1 A := tan 0 O value(%); 1 tan 0 1 arctan x 3 1 arctan x 3 (6.5.2) dx (6.5.3) dx O changevar(1/3*arctan(x)=theta,A,theta); 1 π 12 tan θ 3 C3 tan 3 θ 2 (6.5.4) dθ 0 O value(%); 1 1 2 18 5 sin π 4 sin 12 5 π 12 2 C32 ln 4 sin 5 π 12 5 π 12 2 K24 ln 4 sin K60 sin 2 K3 4 K3 sin 5 π 12 5 π 12 2 K3 sin 5 π 12 4 C69 sin C48 ln sin 5 π 12 K64 ln sin 5 π 12 5 π 12 2 (6.5.5) 2 sin 5 π 12 5 π 12 4 sin K9 Foi visto anteriormente que uma integral dupla pode ser definida pela inserção em cascata do comando int. No pacote student existem os comandos Doubleint e Tripleint para representar integrais duplas e triplas respectivamente. O inter:=-infinity..infinity; (6.5.6) (6.5.6) inter := KN ..N O Doubleint(exp(-x^2-y^2),x=inter,y=inter); N N Kx2 K y2 e (6.5.7) dx dy KN KN O value(%); (6.5.8) π Para mostrar como uma aproximação numérica de integrais opera podemos utilizar os comando leftbox, middlebox ou rightbox. Com eles pode-se visualizar os retângulos representando as áreas que serão somadas na aproximação. O leftbox(sqrt(x),x=1..3,8); 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 0 1 1.5 2 x 2.5 3 O valor da aproximação é calculado com leftsum, middlesum ou rightsum que pode ser expresso por um somátório e por ponto flutuante. Compare o resultado com a integração numérica do Maple. O leftsum(sqrt(x),x=1..3,8)=evalf(leftsum(sqrt(x),x=1..3,8)); 1 4 7 > i=0 1C 1 i = 2.704829825 4 (6.5.9) O 1/4*Sum(sqrt(1+1/4*i),i = 0 .. 7) = 2.704829825827190957978159653324903678488; 1 4 7 > 12 4 Ci = 2.704829825827190957978159653324903678488 (6.5.10) i= 0 O Int(sqrt(x),x=1..3)=int(sqrt(x),x=1..3.0); 3 x dx = 2.797434948 1 (6.5.11) 6.6 Cálculo Vetorial As operações gradiente, divergente, rotacional e laplaciano estão programadas no Maple como as funções grad, diverge, curl e laplacian. Estes comandos devem ter no mínimo dois argumentos, onde o primeiro é uma função, ou melhor, uma expressão que depende de certas variáveis, e o segundo uma lista de variáveis que representam as coordenadas. O sistema de coordenadas default é o sistema cartesiano. Vamos dar uma apelido para a expressão f(x,y,z), e calcular o gradiente, divergente o laplaciano desta função: O restart;with(linalg): O alias(f=f(x,y,z)); f (6.6.1) O v:=[x,y,z]; # lista das coordenadas v := x, y, z (6.6.2) O grad(f,v); O diverge(%,v); O laplacian(f,v); v v v f f f vx vy vz (6.6.3) v2 v2 v2 f C f C f vx2 vy2 vz2 (6.6.4) v2 v2 v2 f C f C f vx2 vy2 vz2 (6.6.5) O rotacional deve ser aplicado a uma função vetorial. Assim, vamos dar apelidos para g(x,y,z) e h (x,y,z): O alias(g=g(x,y,z),h=h(x,y,z)); f, g, h (6.6.6) O curl([f,g,h],v); v v hK g vy vz v fK vz v h vx v gK vx v f vy (6.6.7) Podemos confirmar que o divergente do rotacional é zero: O diverge(%,v); 0 (6.6.8) e, da mesma forma, confirmar que o rotacional do gradiente é o vetor nulo: O curl(grad(f,v), v); 0 0 0 (6.6.9) Todas estas operações podem ser feitas em sistemas de coordenadas não-cartesianos. Vamos ver um exemplo de cálculo de gradiente no sistema de coordenadas esféricas: O f1 := r^2*sin(theta)*cos(phi); f1 := r2 sin θ cos φ (6.6.10) O v:= [r, theta, phi]; (6.6.11) v := r, θ, φ O grad(f1, v, coords=spherical); 2 r sin θ cos φ r cos θ cos φ Kr sin φ (6.6.12) Além de coordenadas cartesianas, esféricas e cilíndricas que são as mais utilizadas, o Maple conhece mais de 40 sistemas de coordenadas em 2 e 3 dimensões. Para ter acesso a lista completa destes sistemas, pedimos ajuda da forma ?coords. 6.7 Exercícios 1. Explique porque os seguintes comandos chegam a zero em vez de 2 x C2 y C2 z O F:=[x^2,y^2,z^2]: O X:=[x,y,z]: O sum('diff(F[i],X[i])',i=1..3); 2 x C2 y C2 z (6.7.1) O for i to 3 do diff(F[i],X[i]); od; 2x 2y (6.7.2) 2z 2. Seja f x = x3 Csin arctan x Ktan arcsin x . (a) Encontre a primeira e a segunda derivadas de menores ordens que possuem um valor não nulo em x = 0 e os seus valores correspondentes. O f:= x^3+sin(arctan(x))-tan(arcsin(x)); x x 3 f := x C K (6.7.3) 2 2 1 Cx 1 Kx O i:=1; (6.7.4) i := 1 O f[0]:=f; f0 := x3 C O g:=0: O while g=0 do O f[i]:=diff(f[i-1],x): O g:=subs(x=0,f[i]): O i:=i+1: x K 2 1 Cx x 2 1 Kx (6.7.5) O od: O 'i'=i-1; O f[i+1]:=diff(f[i],x): O diff('f(x)',x$i)=f[i-1]; 8 4 291060 x6 d 198450 x f x = K C 2 13 /2 2 11 /2 dx8 1 Cx 1 Cx 8 K (6.7.6) i=7 135135 x 2 15 /2 6 K 1 Cx 291060 x 2 13 /2 1 Kx 2 44100 x 2 9/2 1 Cx 4 K 198450 x 2 11 /2 1575 K 1 Cx 2 K 1 Kx (6.7.7) 2 7/2 44100 x 2 9/2 1 Kx K 1575 2 7/2 1 Kx 8 K 135135 x 2 15 /2 1 Kx O O O O O O O O i:=9: g:=0: while g=0 do f[i]:=diff(f[i-1],x): g:=subs(x=0,f[i]): i:=i+1: od: 'i'=i-1; (6.7.8) i=9 (b) Deduza a regra geral para a ordem das derivadas não nulas em x = 0. (c) Plote f x nos intervalo x=-10..10 e x = K0.001 ..0.001. 3. Com o auxílio do Maple resolva as seguintes integrais: (a) 1 1 5 x Kx 1 3 (b) x ln 2 x C dx 1 Cx2 dx O A:=int(x*ln(2*x+sqrt(1+x^2)),x); A := x ln 2 x C 1 Cx2 u := ln 2 x C 1 Cx2 dx (6.7.9) O u:=op(1,A)/x; (6.7.10) O diff(u,x); x 2C 2 1 Cx 2 xC O v:=x^2/2; v := (6.7.11) 2 1 Cx 1 2 x 2 (6.7.12) O A2:=u*v-int(v*diff(u,x),x); 1 1 2 1 1 A2 := ln 2 x C 1 Cx2 x2 K x K ln 3 x2 K1 C arcsinh x 2 4 12 3 8 2 K 3 3 3 1 C arctanh 4 12 9 xC 1 3 9 xK 1 3 xC 1 3 3 2 3 2 8 C 3 3 1 3 K arctanh 12 4 3 K6 3 3 xK xC 1 3 C6 3 3 1 3 3 2 3 xK (6.7.13) 3 C12 3 1 3 3 C12 Outro procedimento utilizando o pacote student: O with(student); D, Diff, Doubleint, Int, Limit, Lineint, Product, Sum, Tripleint, changevar, (6.7.14) completesquare, distance, equate, integrand, intercept, intparts, leftbox, leftsum, makeproc, middlebox, middlesum, midpoint, powsubs, rightbox, rightsum, showtangent, simpson, slope, summand, trapezoid O intparts(Int(x*ln(2*x+sqrt(1+x^2)),x),ln(2*x+sqrt(1+x^2))); x x2 2 C 1 1 1 Cx2 ln 2 x C 1 Cx2 x2 K dx (6.7.15) 2 2 2 2 x C 1 Cx O value(%); 1 ln 2 x C 1 Cx2 2 1 3 C arctanh 12 4 x2 K 1 2 1 1 x K ln 3 x2 K1 C arcsinh x 4 12 3 8 2 K 3 3 9 xC 1 3 3 xC 1 3 3 2 3 K6 3 xC 3 1 3 3 C12 (6.7.16) 8 2 C 3 3 3 1 arctanh 4 12 K 0 (c) 2 xK 1 3 3 2 1 3 9 xK 3 3 C6 3 xK 3 1 3 3 C12 4 x Kx dx K1 4. Use o Maple para decidir se as séries convergem ou divergem: N > ln 1n (a) n=2 O sum(1/ln(n),n = 2 .. infinity); N > ln 1n (6.7.17) n=2 O value(%); N > ln 1n (6.7.18) n=2 N (b) > n=1 n! 2n ! O S:=Sum(n!/(2*n)!,n = 1 .. infinity); N > S := n= 1 O value(S); 1 K 4 N (c) > sin n=1 4 e 1 4 π n! 2n ! K1 Cerfc (6.7.19) 1 2 (6.7.20) 1 n O S:=Sum(sin(1/n),n = 1 .. infinity); N S := 1 n > sin n=1 O value(S); N > sin n=1 1 n (6.7.21) (6.7.22) 3 5. calcule a derivada da função f x = max x , x . O f:=max(x^3,x); f := max x, x3 (6.7.23) O plot(f,x=-2..2); 8 6 4 2 K2 0 K1 1 x K2 2 O diff(f,x); 1 x ! K1 undefined x = K1 2 3x x !0 undefined x=0 1 x !1 undefined x=1 3 x2 1 !x (6.7.24) 6. Seja a função y x definida implicitamente por x C y = 1. Calcule a derivada y' e a segunda derivada y''. O eq:=sqrt(x)+sqrt(y) = 1; eq := x C y = 1 (6.7.25) O implicitdiff(eq,y,x); K y (6.7.26) x 7. Seja a função de duas variáveis z x, y implicitamente definida por h x, y, z = 0, para uma função de três variáveis h. Determine a fórmula para v v2 ze z. Qual é o resultado para vx vy vx h = x C y C z K1? O restart: O d1:=implicitdiff(h(x,y,z),z(x,y),x); D1 h x, y, z d1 := K D3 h x, y, z (6.7.27) O d2:=implicitdiff(h(x,y,z),z(x,y),x,y); 1 2 d2 := KD1, 2 h x, y, z D3 h x, y, z CD1, 3 h 3 D3 h x, y, z y, z D3 h x, y, z CD1 h z D3, 3 h x, y, z D2 h x, y, z D2, 3 h x, y, z D3 h x, y, z D2 h x, y, z KD1 h x, (6.7.28) x, y, x, y, z O h := sqrt(x)+sqrt(y)+sqrt(z)-1: O d1:=implicitdiff(h,z,x); z d1 := K (6.7.29) x O d2:=implicitdiff(h,z,x,y); d2 := 2 1 x (6.7.30) y 8. Calcule as seguintes integrais definidas: 10 (a) 1 4 x4 C4 x3 K2 x2 K10 x C6 dx x5 C7 x4 C16 x3 C10 x2 O Int((4*x^4+4*x^3-2*x^2-10*x+6)/(x^5+7*x^4+16*x^3+10*x^2),x = 1 .. 10); 10 1 4 x4 C4 x3 K2 x2 K10 x C6 dx x5 C7 x4 C16 x3 C10 x2 O value(%); 27 308 159 308 19 14 C arctan 4 K ln 2 K arctan 13 K ln 5 C ln 11 50 25 50 25 50 5 O evalf(%); 2.366004897 (6.7.31) (6.7.32) (6.7.33) π 2 4 (b) x sin x cos x dx 0 1 5 1 (c) 1 7 K1 (d) K2 dx 2 5 x K6 x C1 x 1 dx x 9. Calcule as seguintes integrais definidas: 1 1 (a) 1 Kx 0 (b) dx 2 N eKa x cos b x 2 dx, para um número real positivo a. 0 O Int(exp(-a*x)*cos(b*x)^2,x = 0 .. infinity); N Ka x e cos b x 2 dx (6.7.34) 0 O assume(a>0): O value(%); (c) a~2 C2 b2 a~2 C4 b2 a~ (6.7.35) N eKx ln x dx 0 O int(exp(-x)*ln(x),x = 0 .. infinity); Kγ O evalf(%); K0.5772156649 (6.7.36) (6.7.37) O restart: N eK (d) 0 t 1 4 t 1 KeK dt t O int(exp(-sqrt(t))/(t^(1/4)*sqrt(1-exp(-sqrt(t)))),t = 0 .. infinity); (6.7.38) N K t e 1/4 0 N (e) 1 1 t dt (6.7.38) K t 1 Ke dx 4 x K1 O int(1/sqrt(x^4-1),x = 1 .. infinity); 1 1 2 EllipticK 2 2 2 (6.7.39) π 2 (f) tan x dx 0 O int(sqrt(tan(x)),x = 0 .. Pi/2); 1 π 2 2 N (g) 0 1 cosh a x N 10. Calcule 0 (6.7.40) dx, para um número real positivo a. ln x x Ca x K1 dx, para a positivo. O int(ln(x)/((x+a)*(x-1)),x = 0 .. infinity); a !0 undefined 1 π Cln a 1 2 1 Ca 2 2 ln x2 C1 dx. x2 C1 O A:=Int(ln(x^2+1)/(x^2+1),x); ln x2 C1 A := x2 C1 (6.7.41) otherwise 11. Calcule dx (6.7.42) O with(student): O intparts(A,ln(x^2+1),x); (6.7.43) 2 ln x C1 arctan x K 2 x arctan x 2 x C1 dx 12. Calcule o produto dos primeiros 32 números primos. O nextprime(2); 3 O restart: O product(ithprime(i),i=1..32); 525896479052627740771371797072411912900610967452630 13. Calcule os seguintes limites: sin x (a) lim x/0 x O limit(sin(x)/x,x = 0); (b) lim sin x 1 (6.7.43) (6.7.44) (6.7.45) (6.7.46) 1 x x/0 O limit(sin(x)^(1/x),x = 0); undefined 1 Kcos x x/0 x O limit((1-cos(x))/x,x = 0); (6.7.47) (c) lim 0 (6.7.48) x π (d) x/ limN 1 C x O limit((1+Pi/x)^x,x = infinity); eπ (6.7.49) sin x (e) lim x x/0 O limit(x^sin(x),x = 0); (f) x/ limN 2x C3 1 x x 14. Calcule os seguintes limites: ln x (a) x/ limN x ln x (b) x/ limN ex x2 Csin x (c) x/ limN 2 x2 Ccos 4 x 1 (6.7.50) (d) lim x/0 1 K 1 x 1 Ce O limit(1/(1+exp(-1/x)),x = 0); undefined (e) x/ limN sinh tanh x (6.7.51) Ktanh sinh x O limit(sinh(tanh(x))-tanh(sinh(x)),x = infinity); 1 1 K1 eK e K1 2 2 (6.7.52) 7. Álgebra linear 7.1 Introdução Os comandos de Álgebra Linear formam um pacote chamado linalg, que deve ser carregado com o comando with: O restart; O with(linalg): Normalmente, terminarmos o comando de carregar pacotes com dois pontos para que as funções do pacote não sejam mostradas. Somente as mensagens de aviso de redefinição de comandos serão mostradas. Isto é o que acontece com os comandos norm e trace, que servem primeiramente para calcular norma de polinômios e para correção de procedimentos, respectivamente. Após o pacote linalg ser carregado, eles passam a calcular norma de vetores e traço de matrizes. No presente contexto, queremos saber quais são estas funções: O with(linalg); BlockDiagonal, GramSchmidt, JordanBlock, LUdecomp, QRdecomp, Wronskian, (7.1.1) addcol, addrow, adj, adjoint, angle, augment, backsub, band, basis, bezout, blockmatrix, charmat, charpoly, cholesky, col, coldim, colspace, colspan, companion, concat, cond, copyinto, crossprod, curl, definite, delcols, delrows, det, diag, diverge, dotprod, eigenvals, eigenvalues, eigenvectors, eigenvects, entermatrix, equal, exponential, extend, ffgausselim, fibonacci, forwardsub, frobenius, gausselim, gaussjord, geneqns, genmatrix, grad, hadamard, hermite, hessian, hilbert, htranspose, ihermite, indexfunc, innerprod, intbasis, inverse, ismith, issimilar, iszero, jacobian, jordan, kernel, laplacian, leastsqrs, linsolve, matadd, matrix, minor, minpoly, mulcol, mulrow, multiply, norm, normalize, nullspace, orthog, permanent, pivot, potential, randmatrix, randvector, rank, ratform, row, rowdim, rowspace, rowspan, rref, scalarmul, singularvals, smith, stackmatrix, submatrix, subvector, sumbasis, swapcol, swaprow, sylvester, toeplitz, trace, transpose, vandermonde, vecpotent, vectdim, vector, wronskian 7.2 Definindo matrizes Os comandos do pacote linalg para definir matrizes são: matrix, entermatrix, genmatrix, randmatrix, band e diag. A título de exemplo, vamos definir duas matrizes e gravá-las nas variáveis A e B: O A := matrix( [ [1,2,3], [4,5,6] ] ); A := 1 2 3 4 5 6 (7.2.1) O B := matrix(3, 2, [a,1,1,d,e,1] ); a 1 B := 1 d (7.2.2) e 1 Na primeira matriz, entramos os elementos fornecendo cada linha na forma de uma lista. Neste caso, não é necessário especificar as dimensões da matriz. Na segunda, primeiro estipulamos as dimensões da matriz como sendo 3x2, depois fornecemos todos os elementos numa única lista. O próprio Maple separa as linhas de acordo com as dimensões da matriz. Podemos declarar C como matriz e depois definir as componentes: O C:=matrix(2,2); C := array 1 ..2, 1 ..2, (7.2.3) O C[1,1]:=1;C[1,2]:=3;C[2,2]:=4;C[2,1]:=-2; C1, 1 := 1 C1, 2 := 3 C2, 2 := 4 C2, 1 := K2 (7.2.4) Após a matriz ter sido definida, é possível trocar um elemento. Temos que atribuir o novo valor ao elemento correspondente. Por exemplo, vamos trocar 1/6 por 1/7 na posição <2,2> da matriz C: O C[2,2] := 1/7; 1 C2, 2 := (7.2.5) 7 Vamos verificar que a mudança foi feita com sucesso. Para ver os elementos de uma matriz temos que usar algum comando de avaliação, por exemplo evalm: O evalm(C); 1 3 K2 1 7 (7.2.6) As operações de soma e potenciação de matrizes são feitas com os operadores ``+'' e ``^'' usuais de soma e potenciação de números. A multiplicação de matrizes, não sendo comutativa, é feita pelo operador ``&*'' (ampersand vezes). As expressões matriciais devem ser envolvidas pelo comando evalm, acrônimo de evaluate in matrix context. Por exemplo: O evalm((A&*B + C)^(-1)); 71 C35 d K , (7.2.7) 125 a C21 a d K66 K63 d C81 e K21 e d 7 7 C2 d , 125 a C21 a d K66 K63 d C81 e K21 e d 7 4 a C3 C6 e , 125 a C21 a d K66 K63 d C81 e K21 e d K 7 a C3 C3 e 125 a C21 a d K66 K63 d C81 e K21 e d A potenciação por um número negativo, quer dizer a inversão da matriz, e subseqüente potenciação pelo módulo do número. A inversa também pode ser encontrada através do comando inverse: O inverse(matrix([[a,b],[c,d]])); d a d Kb c K c K a d Kb c b a d Kb c a a d Kb c (7.2.8) Quando uma matriz tem uma regra de formação, é possível repassar esta regra como terceiro argumento do comando matrix. Os dois primeiros argumentos devem ser as dimensões da matriz. Suponha que queiramos definir uma matriz de dimensão 3x4, onde o elemento <i,j> é dado por i : j O matrix(3, 4, (i,j) -> i/j); 1 1 1 1 2 3 4 2 1 2 3 1 2 3 3 2 1 3 4 (7.2.9) Existem várias matrizes especiais que são usadas com frequência em Álgebra Linear. Muitas delas têm comandos específicos para gerá-las. Por exemplo, as matrizes diagonais quadradas podem ser geradas através do comando diag. Neste caso, é bem mais econômico entrar os elementos através deste comando do que com o comando matrix, pois neste último, teríamos que fornecer os zeros fora da diagoanal. Vejamos alguns exemplos: O diag(1,2,3,4); 1 0 0 0 0 2 0 0 (7.2.10) 0 0 3 0 0 0 0 4 O diag(a$3); a 0 0 (7.2.11) 0 a 0 0 0 a O comando a$3 gera uma sequência de três elementos a, de forma que o último comando dado acima é equivalente a diag(a,a,a). Podemos também criar matrizes diagonais em bloco. Vamos usar a matriz C, definida acima com o comando entermatrix, para criar a seguinte matriz: O diag(C,C); 1 3 0 0 K2 1 7 0 0 0 0 1 3 0 0 K2 1 7 (7.2.12) Um caso particular de matriz diagonal é a matriz identidade. Ela pode ser criada com o comando diag, da seguinte forma: diag(1$n), onde n é a dimensão da matriz identidade. Existem outras formas não equivalentes de definir a matriz identidade. Podemos definí-la com o comando array com a função de indexação identity. Por exemplo: O ID := array(identity, 1..3, 1..3); ID := array identity, 1 ..3, 1 ..3, (7.2.13) O evalm(ID); 1 0 0 0 1 0 (7.2.14) 0 0 1 Existe uma forma mais abstrata da matriz identidade no Maple que é ``&*( )''. Esta forma assume a repesentação usual dependendo do contexto. Por exemplo: O evalm(C - &*()*lambda); (7.2.15) 1 Kλ 3 K2 1 Kλ 7 (7.2.15) Neste exemplo, a matriz ``&*( )'' assumiu a dimensão 2 porque ela está somada a matriz C que tem dimensão 2. Na maioria dos casos, não é necessário usar a matriz identidade, pois o Maple assume que, quando um número está somando a uma matriz, este número está multiplicado pela matriz identidade de dimensão conveniente. De forma que o comando acima é equivalente ao comando evalm(C-lambda). Vamos ver outras matrizes especiais. Se a matriz for uma faixa em torno da diagonal, podemos usar o comando band: O band([-1,1,2],4); 1 2 0 0 K1 1 2 0 0 K1 1 2 0 (7.2.16) 0 K1 1 O último argumento é a dimensão da matriz. O primeiro argumento é a lista dos elementos da faixa. A matriz de Toeplitz é gerada pelo comando toeplitz: O toeplitz([alpha,1,beta,2]); α 1 β 2 1 α 1 β (7.2.17) β 1 α 1 2 β 1 α A matriz Jacobiana é criada pelo comando jacobian. O exemplo a seguir mostra claramente como os elementos são calculados. O comando alias foi usado para expressar a dependência das funções f, g e h em relação às variáveis x, y e z. O alias(f=f(x,y,z),g=g(x,y,z),h=h(x,y,z)); f, g, h (7.2.18) O jacobian([f,g,h],[x,y,z]); v v f f vx vy v v g g vx vy v v h h vx vy v f vz v g vz v h vz (7.2.19) Para criar matrizes com valores randômicos o comando randmatrix é usado. Como parâmetro adicional pode ser usado sparse, symmetric, unimodular e entries. No exemplo abaixo limitamos o intervalo de escolha aleatória dos números de 0 a 10, quando esta opção é omitida os valores podem estar entre -99 e 99. O randmatrix(2,2,entries=rand(0..10)); 6 9 (7.2.20) 5 1 O comando hilbert cria a matriz de Hilbert. O comando sylvester cria a matriz de Sylvester a partir de dois polinômios, e o comando frobenius cria a matriz na forma canônica racional de outra matriz. Podemos citar ainda os comandos como hessian, hermite e smith entre outros. 7.3 Manipulação de matrizes Os principais comandos para manipulação estrutural com matrizes são: addcol, addrow, augment, col, row, coldim, rowdim, concat, copyinto, delcols, delrows, extend, mulrow, mulcol, stack, submatrix, swapcol e swaprow. A maioria dos nomes dos comandos falam por si só. As terminações ou prefixos row e col se referem a linha e coluna, respectivamente. O comando coldim, por exemplo, fornece o número de colunas da matriz. O comando swaprow troca duas linha de uma matriz. Vejamos alguns exemplos. Primeiro, vamos criar duas matrizes genéricas A e B: O A := matrix(2,3, (i,j) -> A.i.j); Error, recursive assignment O B := matrix(2,3, (i,j) -> beta.i.j); 2β 3β β B := 2β 4β 6β (7.3.1) Podemos juntar as matrizes A e B lateralmente com o comando augment, e verticalmente com o comando stackmatrix: O augment(A,B); 1 2 3 β 2β 3β 4 5 6 2β 4β 6β (7.3.2) O stackmatrix(A,B); 1 2 3 4 5 6 β 2β 3β (7.3.3) 2β 4β 6β Podemos extrair uma sub-matriz de uma matriz com o comando submatrix: O submatrix(%,2..3,1..2); (7.3.4) 4 5 β 2β (7.3.4) Podemos multiplicar uma determinada coluna de uma matriz por um escalar: O mulcol(A,1,alpha); 2 3 α 4α 5 6 (7.3.5) Usando o último resultado, podemos apagar uma ou mais linha com o comando delrows: O delrows(%,2..2); α 2 3 (7.3.6) A manipulação aritméticas de matrizes, além dos comandos de soma e ponteciação vistos, abrange os comandos transpose, det, trace, rank e map entre outros. O A:=matrix([[1,2,3],[4,-5,6],[9,8,7]]); 1 2 3 A := 4 K5 6 9 O comando transpose calcula a transposta. O transpose(A); 1 8 7 4 9 2 K5 8 3 O determinante é calculado pelo det. O det(A); O trace retorna o traço da matriz. O trace(A); (7.3.7) (7.3.8) 6 7 200 (7.3.9) 3 (7.3.10) A matriz inversa de A pode ser obtida da seguinte forma: O evalm(A^(-1)); (7.3.11) K 83 200 13 100 77 200 1 20 K 27 200 1 10 1 20 3 100 K (7.3.11) 13 200 O rank mostra o número de linhas ou de colunas linearmente indepententes existentes na matriz (posto): O rank(A); 3 (7.3.12) O rank([[1,2],[3,6]]); 1 (7.3.13) O map será visto em maiores detalhes na parte de programação mas por enquanto nos serve para realizar a mesma operação para todos os elementos da matriz. O map(x->x^2,A); 1 4 9 16 25 36 (7.3.14) 81 64 49 O maple também é capaz de resolver um sistemas de equação em forma de matriz. O comando é o linsolve que encontra o vetor solução x do sistema A*x = b. O b:=vector([14,12,46]); b := 14 12 46 (7.3.15) O linsolve(A,b); 1 2 3 (7.3.16) 8. Programação básica A linguagem de programação do Maple e a linguagem que o usuário emprega quando está fazendo um cálculo para resolver um certo problema, são as mesmas. Os comandos para resolver um problema específico poderão ser usados no momento da elaboração de um programa. E vice-versa, qualquer comando de programação pode ser usado no modo interativo. Existem alguns comandos que são frequentemente utilizados em programas e que raramente são utilizados de modo interativo. Por exemplo, o comando for do od para gerar iterações, em geral, só é empregado em programação. O Maple é uma linguagem interativa, porque ele permite que cada comando venha imediatamente acompanhado de sua resposta. Isso não quer dizer que não seja possível agrupar uma série de comandos, cuja resposta é dada por bloco. Na verdade, é isso que faz um programa. Estamos chamando de ``uso interativo'', o modo comando-resposta que geralmente é empregado para resolver problemas específicos. A título de exemplo, vamos resolver dois problemas simples usando o modo interativo. A partir da solução particular, vamos transformá-la em um programa, que é capaz de resolver o problema proposto e qualquer outro do mesmo tipo. Um programa de Maple é essencialmente um grupo de comandos pré-definidos que o Maple sempre executa em conjunto. O modo mais simples para criar um programa de Maple (ou procedimento) é encapsular a sequência de comandos que seriam usados de modo interativo. Vamos inicialmente ver os procedimentos iterativos. Iterações (Renato Portugal) Existem duas formas de executar iterações através do comando for: for contador from valor_inicial by intervalo to valor_final while expressão_booleana do comando_1; comando_2; comando_3; ... od; e for variável in expressão while expressão_booleana do comando_1; comando_2; comando_3; ... od; Vejamos um exemplo da primeira forma. Os números pares podem ser gerados da seguinte forma. O restart: O for i to 5 do 2*i; od; 2 4 6 8 10 (8.1.1) Na ausência do comando from, o valor inicial do contador é 1. Um forma quase equivalente do mesmo comando é O for i from 2 by 2 to 10 do i; od; 2 4 6 8 10 (8.1.2) Segue um exemplo da segunda forma de executar iterações. Seja L uma lista de funções. O L:=[exp(x^2),x^3,ln(x)]; 2 L := ex , x3, ln x Queremos calcular uma aproximação para integral definida de 1 a 2 dessas funções. O for i in L do Int(i,x=1..2)=evalf(int(i,x=1..2)); od; 2 2 ex dx = 14.98997601 1 (8.1.3) 2 3 x dx = 3.750000000 1 2 ln x dx = 0.386294361 (8.1.4) 1 Note que o contador i no comando acima recebe funções como valor. Vejamos o valor final de i. O i; ln x (8.1.5) Considere o seguinte problema. Suponha que temos uma lista de funções na variável x. O L := [ x^2, g(x), sin(x), a*exp(x^2)]; x2 2 L := x , g x , sin x , a e (8.1.6) Queremos construir a lista das derivadas. O próximo comando não resolve o problema. O for i in L do diff(i,x); od; 2x d g x dx cos x 2 2 a x ex (8.1.7) A solução através do uso do comando de iteração requer primeiramente a inicialização de uma lista nula. O derivadas := [ ]; derivadas := (8.1.8) Agora vem a iteração. O for i in L do O derivadas := [ op(derivadas), diff(i, x) ]; O od: Note que terminamos o comando for do od com dois pontos para que nada seja mostrado na tela. Os comandos dentro da iteração podem terminar com dois pontos ou ponto e vírgula. Isso não tem efeito algum em termos de mostrar resultados na tela. Vejamos o resultado. O derivadas; 2 d 2 x, g x , cos x , 2 a x ex (8.1.9) dx O valor que o contador assume no final da iteração pode ser importante, como é o caso no seguinte problema. Qual é o maior número primo menor que 808? O for i from 808 by -1 while not isprime(i) do od; O valor do contador contém a informação que desejamos: O i; 797 (8.1.10) Exceto o do od, todos os outras partes são opcionais. Vejamos um exemplo do comando while. Suponha que N tem o valor 68. O N := 68; (8.1.11) N := 68 (8.1.11) Queremos dividir N por 2 enquanto N for par. O while type(N,even) do N := N/2 od; N := 34 N := 17 (8.1.12) Existem dois nomes especiais para serem usados dentro de iterações que são break e next. A variável break faz com que a iteração seja imediatamente interrompida. Por exemplo, no comando seguinte conseguimos interromper a iteração sem que o contador tenha um valor final. O i:=0; i := 0 (8.1.13) O do O i:=i+1; if i=2 then break fi; O O od; i := 1 i := 2 (8.1.14) A variável next por sua vez não interrompe a iteração, mas quando avaliada faz com que uma volta seja pulada. Vamos imprimir os números ímpares da seguinte forma. O for i to 10 do if type(i,odd) then next fi; O O print(i); O od; 2 4 6 8 10 (8.1.15) Existem três formas particulares do comando for que são seq, add e mul. A sintaxe desses comandos são iguais, de forma que vamos apenas descrever o comando add que executa um somatório. A sua sintaxe é uma das seguintes formas add f, i = a ..b add f, i = L onde f é uma expressão que geralmente depende do índice i. Na primeira forma, o índice i assume valores inteiros de a até b, onde a e b tem que ser numéricos. Na segunda forma o índice assume valores da expressão ou estrutura de dados L. Por exemplo O add( a[i]*x^i, i=0..5 ); a0 Ca1 x Ca2 x2 Ca3 x3 Ca4 x4 Ca5 x5 (8.1.16) O add( sin(i), i=[theta,omega,tau]); sin θ Csin ω Csin τ (8.1.17) Procedimentos Já vimos procedimentos que definem funções. Vamos examinar agora como dar um nome e encapsular de forma eficiente uma sequência de comandos. Vamos construir um procedimento, chamado plotdif que plota uma expressão f(x), junto com sua derivada f '(x), no intervalo a, b . Interativamente podemos computar a derivada da função utilizando diff e plotar as duas funções utilizando plot . Por exemplo: O y:=x^3-4*x^2-3*x-4; 3 2 y := x K4 x K3 x K4 (8.2.1) O dy:=diff(y,x); 2 (8.2.2) dy := 3 x K8 x K3 O plot([y,dy],x=-2..7,color=[red,blue]); 120 100 80 60 40 20 K2 0 K1 1 2 3 4 x K20 O seguinte procedimento combina a sequência de passos 1. Gráficos simultâneos O plotdiff:=proc(y,x,a,b) O local dy; O dy:=diff(y,x); 5 6 7 O plot([y,dy],x=a..b,color=[blue,black]); O end; plotdiff := proc y, x, a, b (8.2.3) local dy; dy := diff y, x ; plot y, dy , x = a ..b, color = blue, black end proc O plotdiff(x*sin(x),x,-2,2); 1.5 1 0.5 K2 0 K1 1 x 2 K0.5 K1 Este procedimento pode agora ser utilizado em outras rotinas. A declaração local assegura que dy é uma variável local, ou seja, este nome não terá qualquer atribuição fora do procedimento. Vários dos comando iterativos apresentados na seção anterior podem ser reescritos na forma de procedimentos. Consideremos no próximo exemplo um procedimento que devolve o valor absoluto de um número, que vamos chamar de ABS (para distinguir de abs, que já está definido pelo Maple) 2.Valor absoluto de um número O ABS:=proc(x) O if x<0 then O -x; O else O x; O fi; O end; ABS := proc x if x ! 0 then Kx else x end if end proc O ABS(-4.3); O ABS(3); (8.2.4) 4.3 (8.2.5) 3 (8.2.6) O procedimento ABS não pode lidar com uma entrada não-numérica: O ABS(a); Error, (in ABS) cannot determine if this expression is true or false: a < 0 Como o sistema não sabe nada sobre a, não sabe o que fazer com ele. Em tais casos o procedimento deveria ser capaz de retornar a entrada não avaliada. Para obter isso notemos o seguinte exemplo: O 'ABS'(A); ABS A (8.2.7) Estas aspas simples fazem com que a avaliação de ABS seja retardada. Portanto, podemos modificar o procedimento ABS para a seguinte forma; O ABS:=proc(x) O if type(x,numeric) then O if x<0 then -x else x fi; O else O 'ABS'(x); O fi O end; ABS := proc x (8.2.8) if type x, numeric then if x ! 0 then Kx else x end if else 'ABS' x end if end proc O ABS(a); ABS a 3. Raízes de um polinômio Vamos construir um procedimento que plota raízes reais e complexas de um polinômio O raizplot:=proc(p::polynom(constant,x)) O local R, points; O R:=[fsolve(p,x,complex)]; O points:=map(z->[Re(z),Im(z)],R); O plot(points,style=point,symbol=circle); O end; (8.2.9) (8.2.10) raizplot := proc p:: polynom constant, x (8.2.10) local R, points; R := fsolve p, x, complex ; points := map z/ Re z , Im z , R ; plot points, style = point, symbol = circle end proc O y:=x^8-3*x^4+4*x^3-x^2+x-5; 8 4 3 2 y := x K3 x C4 x Kx Cx K5 (8.2.11) O raizplot(y); 1 0.5 K1.5 K1 0 K0.5 0.5 1 K0.5 K1 O comando randpoly gera um polinômio randômico: O y:=randpoly(x,degree=120); y := 87 x115 K56 x76 K62 x25 C97 x10 K73 x2 O raizplot(y); (8.2.12) 1 0.5 K1 K0.5 0 0.5 1 K0.5 K1 9. Apêndice: Referências Básicas Worksheets Nos microcomputadores com o Maple instalado, a worksheet é disparada clicando-se no ícone do programa. Em outros sistemas, ela é disparada pelo comando xmaple (ou maple) dado no sinal de pronto do sistema operacional. Ela é o principal meio para gravar e ler os trabalhos desenvolvidos no Maple. A worksheet utiliza os recursos de janelas para facilitar interação do usuário com o Maple. Por exemplo, um comando batido errado pode ser facilmente corrigido voltando-se o cursor para a posição do erro e substituindo os caracteres errados. Não há necessidade de digitar todo o comando novamente. Na worksheet, um usuário pode desenvolver a solução de um problema usando o Maple, tecer comentários, colar gráficos e gravar todo o conjunto em um arquivo para ser lido e eventualmente modificado posteriormente. A worksheet pode ser impressa selecionando-se a opção print ou pode ser automaticamente convertida em um arquivo Latex. Um exemplo de uso das worksheets é esse curso. Ele foi apresentado e as notas impressas a partir de worksheets. A worksheet é um caderno virtual de anotações de cálculos. A vantagem do caderno virtual é que qualquer coisa já escrita pode ser modificada sem necessidade de fazer outras alterações. O resto do trabalho se ajusta automaticamente às mudanças. Essa idéia é a mesma dos processadores de textos que vêm gradativamente substituindo as máquinas de escrever. A worksheet não é um processador de textos. Ela funciona de maneira satisfatória como um editor de textos, e a parte referente ao processamento de textos pode ser feita no Latex, pois a worksheet tem interface com este processador. No desenvolvimento de um trabalho usando a worksheet, é importante que ele seja feito em ordem e que todo rascunho seja apagado assim que cumprido seu objetivo. O comando restart pode encabeçar o trabalho. Depois de gravar a worksheet, o usuário pode sair do Maple. No momento em que a worksheet é lida novamente, os resultados que aparecem na tela não estão na memória ativa do Maple. É necessário processar os comandos novamente para ativar os resultados. A worksheet tem quatro tipos de linhas que são: as linhas de entrada de comando, geralmente precedidas pelo sinal de pronto ``>'', as linhas de saída dos comandos, as linhas de texto e as linhas de gráfico. Algumas dessas linhas podem ser convertidas umas nas outras. Em geral, as linhas de entrada, de saída e de texto podem ser convertidas entre si. As versões de worksheet para estações de trabalho e para microcomputadores não são iguais entre si, porém na grande maioria dos casos, tudo o que um usuário faz na worksheet de uma estação de trabalho pode ser feita na worksheet de um micro e vice-versa. As linhas de saída usam os recursos gráficos das janelas para escrever as letras, os símbolos e desenhar os gráficos. O sinal de integral aparece na tela como int, o somatório como sum e as letras gregas como alpha, beta, gamma, ... . Existe uma opção que faz com que as linhas de saídas usem os mesmos caracteres do teclado. Essa opção é útil para gravar resultados em um arquivo ASCII (acrônimo de American Standard Code for Information Interchange). A worksheet pode ser gravada com a terminação .mws, sendo ela própria é um arquivo ASCII. Isso significa que ela pode ser enviada por correio eletrônico. É claro que a pessoa que recebe tem que editá-la e retirar o cabeçalho do correio para que ela seja lida corretamente pelo Maple. Se a worksheet for salva com o a terminação .m , ela é salva no formato interno do Maple. A versão V Release 4 e 5 e a versão 6 possuem diversos recursos para escrever textos. É possível criar seções e sub-seções. As letras podem ter diversos tamanhos e estilos, podem ser em itálico ou em negrito. É possível criar hiperlinks que conectam diversas worksheets. A partir desses hiperlinks pode-se navegar através das worksheets. Na próxima seção faremos uma breve exposição sobre a manipulação de worksheets. Noções básicas sobre a manipulação de worksheets O ambiente de worksheet do Maple consiste em um conjunto de construtos de documentação: grupos de execução, spreadsheets (planilhas), parágrafos, seções e hyperlinks. Grupos de execução e spreadsheets ajudam o usuário a interagir com a máquina computacional do Maple. Eles fornecem os meios primários pelos quais o Maple é requisitado para executar tarefas específicas e mostrar os resultados. Parágrafos, seções e hyperlinks existem para ajudar o usuário a documentar e organizar os resultados. Interagindo com Maple Grupos de execução Sequencias de comandos de Maple, chamadas grupos de execução, servem para dar uma descrição algorítmica de como um particular problema matemático é resolvido. Os grupos de execução dão os elementos fundamentais de computação da worksheet. Seu objetivo primário é combinar um ou mais comandos de Maple e seus resultados em uma única unidade reexecutável. Ele é fácilmente reconhecível pelo grande colchete imediatamente à esquerda do prompt de comando. Um grupo de execução é criado através do menu insert . Exemplo1. Quando o cursor é colocado em qualquer ponto do grupo de execução, e o comando enter é dado, as as operações evidentes na expressão de entrada abaixo são realizadas em sequencia e o resultado é apresentado no final : O restart: O y:=expand((x+4*a)^2-(x+4*a)^3+x^3); y := x2 C8 x a C16 a2 K12 x2 a K48 x a2 K64 a3 (9.2.1.1.1) O cursor é levado automaticamente para uma nova linha de comando em outro grupo de execução. Note que para modificar os polinômios envolvidos na expressão acima, basta levar o cursor novamente à linha de comando no grupo de execução, fazer as modificações e dar enter. Exercício1. Modifique o lado direito da expressão anterior. Exemplo2. Um grupo de execução pode conter vários comandos, na mesma ou em diferentes linhas de comando: O y:=diff(sin(x)^x,x); z:=int(sin(x)^2,x); O plot(y+z,x=1..3); x cos x y := sin x x ln sin x C sin x z := K 1 1 sin x cos x C x 2 2 1.4 1.2 1.0 0.8 0.6 0.4 0.2 1 1.5 2 x 2.5 3 Exercício2. (a) Volte ao Exemplo1 e faça um gráfico y(x), para algum valor específico de do parâmetro a, utilizando o prompt em aberto. Não esqueça de definir y novamente no grupo de execução anterior, casa contrário a expressão para y será aquela definida no Exemplo 2. (b) Coloque estes dois comandos em um mesmo grupo de execução utilizando a opção join execution groups (ou F4) no menu Edit. Spreadsheets Spreadsheets ou planilhas similares às do Excell são disponíveis nas versões W98, NT e Macintosh do Maple. Uma planilha simbólica pode ser criada através do menu insert. Ela vai aparecer dentro de um grupo de execução. Como exemplo vamos construir uma tabela x para integrais envolvendo e . Exercício 3. Reconstrua a planilha acima. As fórmulas nas células podem ser transportadas para linhas de comando da worksheet através de copy/paste e vice versa. Construindo e executando comandos Há três modos básicos para criar comandos e resultados em Maple Comandos digitados e paletas Linhas de comando vazias podem ser criadas inserindo um grupo de execução (utilizando o menu insert ou o símbolo [> no menu de ferramentas). Os comandos são executados escrevendo-os no prompt do Maple e pressionando enter. Algumas operações e símbolos, assim como matrizes, podem ser introduzidos através de três paletas. Elas podem ser ativadas a partir do menu View/Palletes. Exercício 4. Utilize o comando inverse(A) do Maple para inverter a matriz 4 5 0 K1 3 5 . 9 6 6 Nota: Para que esta operação seja possível é necessário carregar antes o pacote de álgebra linear linalg, o que pode ser feito com o comando with(linalg) . Utilizando menus de contexto Resultados de Maple já existentes podem ser utilizados para sugerir e construir novas ações. Para obter na tela uma lista de ações sugeridas, marque e pressione o botão direito do mouse sobre o objeto (um resultado). A lista de ações resultante é chamada um menu de contexto, e está customizada para refletir as propriedades do objeto selecionado. Exercício 5. Reproduza em uma worksheet separada o procedimento abaixo. No caso selecionamos a segunda solução e, escolhendo a opção copy transformamos-la para o formato de entrada (paste). O nome s1 foi adicionado manualmente. O solve(a*x^2-3*x+a,x); 1 3C 2 9 K4 a2 1 K3 C 9 K4 a2 ,K a 2 a (9.2.1.3.2.1) O s1:=1/2*(2-2*sqrt(1-a^2))/a; s1 := 1 2 K2 1 Ka2 2 a (9.2.1.3.2.2) Exercício 6. (a) Considere resultado do primeiro grupo de execução do Exercício 5. Utilize o menu de contexto para determinar a integral das duas soluções com relação a a. Faça com elas tenham respectivamente os nomes int1 e int2. (b) Considere o resultado do segundo grupo de execução acima. Utilize o menu de contexto para converter a igualdade para o formato LaTex (neste caso, em que a expressão aparece sozinha, não é necessário marcar a expressão). Exercício 7. Utilize o menu de contexto para obter o gráfico da função y = sin x z . Dragging e Dropping O restart: Fórmulas podem ser transportadas entre linhas de comando de qualquer worksheet diretamente por seleção e arraste. Uma expressão no formato de saída pode ser convertida para o formato de entrada simplesmente selecionando a expressão e arrastando-a para uma linha de comando vazia. .Gráficos simultâneos podem ser construídos arrastando-se a expressão no formato de se saída do Maple até o ambiente gráfico existente, anteriormente criado via smartplots. Exercício 8. Selecione o lado esquerdo da expressão que define s1, no formato de saída, no Exercício 5 e arraste-o até uma linha de comando vazia. Repita o mesmo procedimento selecionando agora a expressão inteira. Qual a diferença ? v cos x2 Cz . Exercício 9a. Utilize o menu de contexto para gerar o gráfico de y := vx (Arraste a expressão acima para uma worksheet e depois a recupere com undo). Em seguida arraste o gráfico para uma linha vazia sem o prompt. Modifique a expressão e arraste de volta a expressão para o ambiente gráfico. Este procedimento só funciona para smartplots 3D. Exercício 9b. Gere gráficos simultâneos em 2D utilizando arraste .Este procedimento só funciona com smartplots. Organizando documentos Documentos consistem de uma sequencia de parágrafos descritivos, grupos de execução, spreadsheets e gráficos. Estes componentes podem ser reorganizados em uma estrutura hierárquica baseada em seções de subseções. Marcadores de referências, chamados bookmarks, podem ser colocados ao longo do documento e hyperlinks podem ser usados para saltar de um lugar a outro dentro de um documento. Trataremos esses tópicos com detalhe a seguir 3.2.1 Parágrafos e texto Um parágrafo em uma worksheet é análogo ao parágrafo encontrado em um típico processador de textos. Parágrafos podem conter texto com estilos particulares, modo matemático e gráficos, incluindo cópias de saídas de Maple. Um parágrafo pode estar contido em um grupo de execução . Parágrafos podem ser criados clicando Insert na barra de menus. O estilo dos parágrafos pode ser personalizado escolhendo Styles, do menu Format. Estilos em trechos selecionados podem escolhidos na barra de contexto. Dentro das áreas de texto é possível inserir equações formatadas e gráficos. Exemplo 2. É possível escrever: β 2 ex dx em Maple, digite: Para calcular a integral definida simbólica 0 > int(exp(x^2),x = 0 .. beta); O modo matemático pode ser acionado escolhendo-se Maple input (Crtl+M) no menu Insert. Temos aqui algumas diferenças importantes nas duas últimas versões de Maple. Maple V: Note que a equação é digitada de acordo com a sintaxe do Maple, em um campo dentro da barra de contexto. A expressão formatada aparecerá depois de enter . Para voltar ao modo texto escolhe-se Text input (Crtl+T). Caso o usuário preferir, é possível digitar a expressão desejada numa linha de comando, convertê-la para o modo matemático escolhendo x na barra de contexto. A expressão pode então ser selecionada e arrastada ou copiada para o local desejado do texto. É possivel também arrastar a expressão diretamente no formato de entrada do Maple para um local onde o modo matemático já esteja acionado dentro do texto (Crt-M). Maple 6: Note no menu Insert, que para reproduzir os resultados descritos no parágrafo anterior, deveríamos selecionar Standard Math ou Crt-R, para criar uma entrada em modo matemático dentro do texto. No entanto, o procedimento mais simples neste caso para digitar uma equação é utilizar Maple Input ou Crt-M, que faz com que a equação apareça no formato de entrada do Maple no próprio texto, em vermelho. Em seguida a expressão pode ser convertida para o formato matemático clicando em x à esquerda na barra de contexto. Como no caso do Maple V, os modos de entrada ou saída podem ser alternados clicando-se no maple verde. Ou seja, os caracteres em vermelho são de entrada, não importando o formato (Maple input ou Standard Math input), são executáveis clicando-se em ! na barra de contexto. Exercício 10. Reproduza o Exemplo 2. 3.2.2 Seções O que você acabou de expandir agora é uma seção (section). No menu Insert, a escolha de Section abre outra seção. Subsection abre uma subseção dentro desta. Para transformar uma seção num parágrafo simples, no menu Format escolha Outdent. Use Indent para inserir um dado parágrafo dentro da seção Exercício 11. Reproduza os cabeçalhos desta worksheet. Inclua subseções. Exercício 12. Expanda e colapse todas as seções desta worksheet através do menu View. 3.2.3 Hyperlinks Um hyperlink é uma pedaço de texto que faz uma conexão, quando você dá um clic sobre ele, para uma outra parte da mesma worksheet, de outra worksheet ou de uma página de ajuda, sendo portanto uma ferramenta de navegação. Por default, Maple mostra os hyperlinks como um texto sublinhado na cor cyan. Por exemplo, clicando aqui o cursor é levado para seção 2.1.2 sobre spreadsheets. Selecionando um nome de bookmark leva o cursor a um ponto especificado da worksheet. Um pré-requisito para hyperlinks são bookmarks. Um bookmark é um nome que identifica uma particular localização na worksheet. Podemos acessar uma lista de bookmarks da worksheet corrente selecionando Bookmarks no menu View. A seleção de um nome de bookmark move o cursor a uma posição especificada da worksheet. Um hyperlink deve estar associado a um nome de bookmark. Por exemplo, vamos supor que queremos fazer um hyperlink para a seção 2.2.1. O primeiro passo é definir o bookmark. Para isso devemos levar o cursor para a linha da seção 2.2.1 desta worksheet, selecion Bookmarks no menu View e selecionar Edit Bookmark. Um nome adequado deve então ser digitado. Em seguida devemos inserir o texto que deve aparecer no hyperlink. No menu Insert selecionamos Hyperlink, digitamos o texto e escolhemos da lista o nome adequado entre todos os bookmarks. Exercício 13. Faça um hyperlink para alguma seção desta worksheet. Regras de sobrevivência Esta seção oferece dicas sobre como evitar alguns enganos aos quais inciantes estão sujeitos a cometer. Mesmo para aqueles que já utilizaram o Maple mais de uma vez, ler este seção será de alguma utilidade. Ela poderá parecer um pouco redundante mas, por outro lado, vai poupar esforços na tentativa de encontrar erros de sintaxe futuramente. Os problemas aqui descritos serão vistos nos capítulos seguintes, porém estarão inseridos em contextos diferentes que vão supor que o leitor já os conheça. Os comandos do Maple normalmente terminam com um ponto-e-vírgula (;) seguido da tecla [Enter]. Com isso o Maple avalia a entrada, faz o cálculo e imprime o resultado na tela. Ao invés de usar o ponto-e-vírgula, pode ser usado os dois pontos (:) no final do comando. Neste caso, o cálculo é feito como anteriormente, mas o resultado não é colocado na tela. Seu uso previne que comandos executados como passos intermediários de um estudo não ocupem muitas páginas com fórmulas de pouco interesse em relação ao resultado final. Pode-se colocar alguns comandos na mesma linha. Estes comandos podem ser separados tanto por ponto-e-vírgula (;) como dois-pontos (:). É possível separar os cálculos com vírgulas (,) sem que se faça associações à variável. O Maple executa os cálculos um após o outro e coloca os resultados lado a lado. Para resultados curtos, este método possue a vantagem de economizar espaço na tela e permite a comparação de resultados numa mesma linha. Por exemplo: O 2+3; O a:=3; b:=5; O a*b, a+b, a^b; O a*b; a+b; a^b; 5 (9.3.1) a := 3 b := 5 (9.3.2) 15, 8, 243 (9.3.3) 15 8 243 (9.3.4) O resultado de até três cálculos anteriores podem ser acessados pelos comandos %, %% e %%%. Se após o um cálculo, você mover o cursor para uma posição diferente na worksheet, o símbolo de percentagem não irá se refrir ao comando exatamente acima e sim ao último cálculo executado. O (c+d)^3: % = expand (%); c Cd 3 = c3 C3 c2 d C3 c d2 Cd3 (9.3.5) A expressão anterior mostra uma expansão do cubo da soma de duas variáveis. O primeiro comando apenas formula a expressão a ser expandida e não imprime o resultado na tela. No segundo comando o resultado é acessado duas vezes, primeiro sem expandir e depois expandindo. É preciso tomar cuidado ao usar os símbolos de percentagem. Para pessoas poucou familiarizadas com estes operadores é aconselhável associar o resultado obtido à uma variável. Desta forma a variável pode ser acessada posteriormente quantas vezes quiser e não apenas três. No exemplo a seguir é mostrado duas formas de ser fazer a associação das soluções de uma equação do segundo grau a uma variável: O solve(x^2+x-1,x); K 1 1 C 2 2 O solucoes1:=%; 5,K 1 1 K 2 2 (9.3.6) 5 1 1 C 2 2 5,K 1 1 K 2 2 5 (9.3.7) O solucoes2:=solve(x^2+x-1,x); 1 1 solucoes2 := K C 2 2 5,K 1 1 K 2 2 5 (9.3.8) solucoes1 := K A manipulação de uma parte do resultado fica mais fácil ao associá-lo a uma variável. Esta necessidade ocorre frequentemente em comandos como o solve que retorna mais de uma solucao. Um meio de acessar os elementos do resultado é colocando o índice da solução desejada entre colchetes ([]). O x1:=solucoes1[1]; 1 1 x1 := K C 5 (9.3.9) 2 2 A princípio esta é uma forma aparentemente boa, porém pode dar problemas depois: a ordem das soluções retornadas pelo comando solve não é fixa. Portanto executando o comando novamente, pode ser que a ordem venha trocada. Neste caso se tivermos interesse, por exemplo, na solução de menor valor, poderíamos usar o comando min. Para isto todas as variáveis da expressão deverão estar definidas. O x1:=min(solucoes1); 1 1 x1 := K K 5 (9.3.10) 2 2 O Maple VR5 e 6 distingue as aspas duplas (") das aspas simples (') do plique (`) - ou acento grave. O primeiro serve para representar strings de caracteres. O segundo é usado para retardar uma avaliação matemática e o terceiro também representa strings porém de utilidade diversificada em relação ao primeiro. O Maple avalia expressões matemáticas automaticamente: O x:=Pi; x := π (9.3.11) O sin(x/2); 1 (9.3.12) Neste exemplo, a variável x foi imediatamente substituída pelo seu valor. Algumas vezes não é desejado que isto aconteça. As aspas simples servem para impedir que esta avaliação se efetue. E neste caso pode ser feito de duas formas: retardando a avaliação de x ou de toda a expressão sin (x): O expr1:=sin('x'/2);expr2:='sin(x/2)'; 1 expr1 := sin x 2 (9.3.13) expr2 := sin 1 x 2 (9.3.13) Nos cálculos subsequentes a avaliação será efetuada e o valor da variável será subtituído. O expr1; expr2; 1 1 (9.3.14) Pode-se colocar quantos níveis de retardo se desejar porém não é comum utilizar mais de um. Seria mais simples limpar o conteúdo da variável x em vez de colocar várias aspas simples juntas. O ''x''; 'x' (9.3.15) O %; x (9.3.16) π (9.3.17) O %; À primeira vista, a função do plique pode parecer igual às aspas simples. O 'x+1'; x C1 O `x+1`; xC1 Porém só quando forçamos uma avaliação é que percebemos a diferença. O eval('x+1'); π C1 O eval(`x+1`); xC1 (9.3.18) (9.3.19) (9.3.20) (9.3.21) Os caracteres contidos entre pliques não são interpretados como expressões matemáticas, mas como um conjunto de caracteres. A avaliação não só não é retardada, como se torna impossível. Os pliques são normalmente usados para criar nomes de variáveis que usem caracteres especiais. O `x/aux`:=3; x/aux := 3 (9.3.22) As aspas duplas, enfim, determinam um conjunto de caracteres associados a um texto tal como o título de um gráfico, uma mensagem a ser impressa na tela ou o nome de um arquivo no qual se deseja gravar algum resultado. O print(`Mensagem na tela!`); Mensagem na tela! (9.3.23) Alguns problemas frequentemente ocorrem por causa de variáveis que foram inicializadas e foram usadas em expressões posteriormente. Ao tentarmos resolver uma equação em x ocorre o seguinte problema. O solve(x^2-2*x,x); Error, (in solve) a constant is invalid as a variable, Pi Se olharmos algumas páginas antes vamos perceber que a variável x recebeu o valor π. Em nenhum momento esta variável teve o seu conteúdo apagado e, consequentemente, ele se mantém. Uma forma de limpar o conteúdo de uma variável é associar esta variável a ela mesma com um nível de retardo. Se preferir apagar o conteúdo de todas as variáveis usadas até o momento, o comanto restart executa esta tarefa. O x:='x'; x := x (9.3.24) Ou equivalentemente: O unassign('x'); Agora podemos resolver a equação em x. O solve(x^2-2*x,x); 0, 2 (9.3.25) O Cartão de referência de comandos denom( ) display( ) evalf(expr) evalf(expr,n) expand(expr) factor(expr) fsolve(eqn) Selects the denominator of a fraction Combines graphs of functions and points (require with( plots) ) Numercially evaluates the given expression to the default number of digits (10). Numercially evaluates the given expression to n digits Expands the given expression Factors the given expression Finds numerical (approximate) solutions to equations. fsolve(x^2=cos(x)+4,x=0..5) ifactor(n) Gives prime integer factorization for a given integer lhs(eqn ) Selects the left hand side of an equation implicitplot( ) Plots implicitly defined functions implicitplot(x^2/25 +y^2/9=1 , x=-5 . . 5,y=-5 . . 5,scaling=constrained); numer( ) Selects the numerator of a fraction plot( ) Plots functions defined by an algebraic expression: plot(3*x^2-8 , x=-5 . . 5 , y = -20 . . 40 ); Plots more than one function at a time: plot( [ 3*x^2-8 , sin(x) , cos(x) ] ,x=-5 . . 5 , y=-20 .. 40 ); Plots points: plot 2, 3 , K2, 5 , 1, K4 , x = K7 ..7, y = K7 ..7, style = point Plots parametric equations : plot( [cos(t), sin(t), t=0 . . 2*Pi] , x=-2..2, y=-2..2); rationalize(expr) Rationalizes the denominator of a given expression restart Clears Maple's memory of all definitions rhs(eqn ) Selects the right hand side of an equation simplify(expr) Simplifies the given expression solve(eqn) Finds exact solutions to equations, including literal equations and linear systems. subs(x= v,expr) Substitutes the value v for x in the expression subs(x=4,3*x^2+8); with( ) Brings in additional libraries of functions. The standard constants are: Pi π Caution: Do not use "pi", capital "P" is required exp(1) e I K1 The names of the standard functions are: sqrt(x) x abs(x) x exp(x) ex ln(x) natural log log(x) common log (base 10) sin(x), cos(x), tan(x), cot(x), sec(x), csc(x) arcsin(x), arccos(x), arctan(x) sine of x, etc. the inverse trig functions