Rodrigo S. Portugal portugal@ige.unicamp.br Departmento de Geologia e Recursos Naturais Instituto de Geoci encias UNICAMP
Voc e pode estar estranhando o t tulo, mas a verdade e que este texto se destina ` as pessoas que s ao obrigadas a aprender Matlab ou pela imposi c ao de um orientador ou para alguma disciplina, ou por qualquer outro motivo. Eu acho que num primeiro momento estas pessoas n ao est ao t ao interessadas assim em aprender, mas, sim, apenas tentando cumprir uma tarefa. Outro p ublico s ao aqueles que se interessam timidamente, mas sempre t em receio em se envolver com m aquinas, algoritmos e programas. Percebi que para todo este p ublico faltava algo ainda mais introdut orio que os tutoriais que circulam pela internet. Voc e ainda pode pensar que este texto e uma solu c ao muito paternalista para estes desamparados. Se este for o seu caso, ent ao n ao leia, voc e n ao est a entre este p ublico. Por outro lado, se voc e sente que h a um pingo de verdade no que disse, est a desesperado ou n ao sabe por onde come car, v a em frente, leia o texto. Seja bem-vindo ao mundo do Matlab!
Introdu c ao
O Matlab (do ingl es, Matrix Laboratory) e um programa interativo que se destina a c alculos num ericos e gr acos cient cos. Seu ponto forte est a na manipula c ao e c alculos matriciais, como por exemplo, resolu c ao de sistema lineares, c alculo de autovalores e autovetores, fatora c ao de matrizes, entre outros. Al em disso, muitas fun c oes especializadas j a est ao internamente implementadas, de modo que em muitos casos n ao h a a necessidade de se construir muitas coisas. Outros dois pontos fortes do Matlab s ao a cria c ao e manipula c ao de gr acos cient cos e a possibilidade de extens ao por meios de pacotes comerciais ou escritos pelo pr oprio usu ario. Em geral o usu ario e a funcionalidade do Matlab crescem juntos, pois com o tempo, ele come ca a escrever suas pr oprias fun c oes, agregando capacidades espec cas. Isto faz com que, aos poucos, o Matlab comece a mimetizar, ou at e mesmo suplantar, softwares cient cos espec cos de diversas areas. Uma caracter stica interessante e que o Matlab e muito mais f acil de aprender do que as linguagens cient cas convencionais, tais como C e Fortran. Entretanto, quanto maiores e mais complexas as rotinas e fun c oes da biblioteca, pior ca a sua performance quando comparada ` a sua equivalente em C e/ou Fortran. Este documento se destina ao usu ario iniciante, para quebrar o gelo entre ele e o Matlab, na promessa de uma parceria duradoura. Em nenhum momento este texto servir a de manual, uma vez que outros bem mais completos est ao dispon veis nas bibliotecas, livrarias e na internet tamb em. Finalmente cabe dizer que os exemplos aqui apresentados foram testados na vers ao 6.5 do programa, sendo assim, apesar de uma quase certeza, n ao h a garantias de que ir ao funcionar em vers oes diferentes.
Nesta se c ao s ao apresentados os comandos mais b asicos para inser c ao e manipula c ao de dados, bem como comandos para se criar os mais simples gr acos. Al em disso s ao abordados as representa c oes de n umeros, vetores e matrizes ` a luz do paradigma do Matlab. De fato, esta se c ao e cr tica, pois e nela que vamos realmente quebrar o gelo.
2.1
Modo interativo
Logo que o Matlab inicia, h a uma tela de para entrada de comandos. Esta tela est a no modo interativo (parecido com MS-DOS, lembra?), onde o computador ca
esperando um instru c ao no lugar marcado pelos s mbolos >> (em ingl es chamado de prompt). Assim que o usu ario digita o seu comando, ele deve naliz a-lo apertando a tecla <enter>, como se tivesse mandando o Matlab efetuar a instru c ao da linha. Eis alguns exemplos para o leitor praticar, n ao se esquecendo de digitar a tecla <enter> ao nal da linha:
>> x = 1 x = 1 >> y = 2 y = 2 >> z = x + y z = 3 >> w = x * y w = 2
A mensagem de sa da logo ap os a entrada da instru c ao e` as vezes u til, mas pode car aborrecendo em muitas outras ocasi oes. Para suprim -la, basta inserir um pontoe-v rgula (;) ao nal da instru c ao, do mesmo modo que nos exemplos abaixo
>> >> >> >> x y z w = = = = 1; 2; x + y; x * y;
No modo interativo, e extremamente recomend avel que o usu ario iniciante guarde os comandos (e os resultados) que foram inseridos em uma sess ao. Aos inv es de escrever tudo em uma folha de papel (o que pode ser muito u til tamb em), o usu ario pode requisitar ao Matlab que guarde tudo em um arquivo. Basta entrar com o comando 3
diary <nome_do_arquivo.txt>
que ir a guardar todos os comandos subseq uentes at e o nal da sess ao. Finalmente, para sair do Matlab usando o modo interativo, basta digitar exit.
2.2
Pedindo ajuda
Certamente o comando mais b asico que todo usu ario deve conhecer e o help. Este comando e o companheiro nas horas mais ingratas, quando tudo d a errado. Muitas vezes achamos que sabemos usar um comando (ou programa) at e o momento em que as coisas d ao errado mesmo. Muito depois de quebrar a cabe ca, usando o famoso m etodo da tentativa e erro, lembramos de usar o help e aprendemos a maneira realmente correta de usar o tal comando problem atico. Sendo assim para aprender como se usa um comando em Matlab, basta digitar na linha de comando
>> help <nome_do_comando>
ou ainda consultar o manual. Por exemplo, como j a vimos alguns comandos, voc e pode tentar fazer
>> help help >> help diary >> help exit
e ver o que acontece. Outra maneira de pedir ajuda, que, por incr vel que pare ca, funciona melhor, e pedir dicas ao colega sentado ao lado. Depois de um tempo, prepare-se pois vai acabar tirando a d uvida de algu em :) .
2.3
O paradigma do Matlab e que tudo s ao matrizes. Um n umero e uma matriz de um por um, um vetor de n n umeros e uma matriz de n por um e strings (cadeias de caracteres) s ao matrizes caracteres. Existem outros exemplos mais complexos que n ao valem a pena serem citados neste momento, por em, para quem ainda n ao xou a id eia, exite um velho ditado que diz
>> x = 1; >> y = 2; >> z = x + y; >> w = x * y; >> whos Name Size w x y z 1x1 1x1 1x1 1x1
Bytes 8 8 8 8
Sem entrar em detalhes, observe que a sa da do comando whos e exibir um sum ario das v ariaves que est ao guardadas na mem oria, descrevendo quais s ao as suas dimens oes, quantos bytes gastam e de qual tipo pertencem. Do exemplo acima podemos concluir que todas as vari aveis s ao escalares (ou matrizes 1x1, no entedimento do Matlab), gastam 8 bytes cada uma e s ao reais (double). Para aprender mais sobre o comando whos digite
>> help whos
2.4
Exemplos
Para xar os conceitos apresentados at e aqui, acho que vale a pena o leitor testar os seguintes exemplos 1. Criando uma matriz 4 3 (4 linhas e 3 colunas). Cada linha e separada por um ponto-e-v rgula e cada entrada e separada por uma v rgula
>> A = [1, 2, 3; 1, 4, 7; 2, 6, 1; 4, 5, 0]
>> E = eye(3)
Uma vez que os exemplos acima foram testados, os comandos abaixos podem ser inseridos (observe que o texto ap os o caracter % n ao precisa ser digitado)
>> >> >> >> >> >> >> >> C D F G T M P a = = = = = = = = 2*A [3, 4, 5; 1, 6, 3; 2, 2, 9; -1, 0, 17] A + D A - D G F * T inv(M) det(P) % % % % % % % % multiplicacao por escalar inserindo uma nova matriz adi c~ ao de matrizes subtra c~ ao de matrizes transposta de matriz multiplica c~ ao de matrizes inversa de matriz determinante de matriz
2.5
Existem duas maneiras de gracar uma fun c ao. A mais simples e usar o comando fplot. Basicamente, voc e deve fornecer como primeiro argumento a fun c ao que pretende usar entre ap ostrofes e como segundo o intervalo sobre o qual a fun c ao ser a gracada. Para xar a id eia, seguem alguns exemplos:
>> fplot(sin(x),[ -pi, pi]) >> fplot(x^2+3, [ -1, 2]) >> fplot(sin(x),[ -0, pi]) % % %
Existem outras op c oes que podem ser vericadas com help fplot. A outra maneira, mais dif cil, por em mais ex vel, usa o paradigma de que tudo em Matlab s ao matrizes. Neste caso, considera-se somente uma vers ao discretizada da fun c ao. Mas anal, o que e uma discretiza c ao de uma fun c ao? Para responder a essa pergunta temos que dar uma paradinha e explicar esse conceito. 2.5.1 Discretiza c ao de fun c oes
Basicamente uma discretiza c ao de uma fun c ao qualquer f (x) e quando uma seq u encia de n umeros e gerados a partir de outra seq u encia de n umeros usando a pr opria fun c ao como a regra para a gera c ao. A seq u encia ` a qual ser a aplicada a fun c ao e chamada de dom nio discretizado e a outra seq u encia de imagem discretizada. Para que tudo corra bem, no entanto, h a a condi c ao de que todos os n umeros do dom nio discretizado sejam distintos. Se existir repeti c ao, ainda vai funcionar para todos os efeitos, mas n ao e mais uma fun c ao, e outra coisa que est a fora do escopo desta introdu c ao.
Por exemplo se a fun c ao e f (x) = x2 , podemos considerar a seq u encia de n umeros xn = [2, 1, 0, 1, 2, 3, 4] e quando aplicamos a fun c ao f a cada um dos n umeros de xn geramos outra seq u encia de n umeros a saber: yn = [4, 1, 0, 1, 4, 9, 16]. Se n os juntarmos as duas seq u encias em pares, ent ao obtemos uma discretiza c ao da fun c ao [(2, 4), (1, 1), (0, 0), (1, 1), (2, 4), (3, 9), (4, 16)] Resumindo, discretiza c ao e quando uma fun c ao e aproximadamente descrita por v arios pares ordenados (xn , yn ), onde os xn s ao todos distintos e, de prefer encia, mas n ao necessariamente, ordenados de forma crescente. Pode-se notar, portanto, que um vetor (geralmente muito grande) pode representar uma discretiza c ao de uma fun c ao, quando o dom nio, isto e, a seq u encia de n umeros a ` qual ser a aplicada a fun c ao, e o conjunto de n umeros naturais. De outra forma, uma fun c ao discretizada deve ser representada por dois vetores com a mesma dimens ao (geralmente grande), onde um representa o dom nio discretizado e o outro a imagem discretizada. Uma vez que o leitor j a entendeu o que e uma discretiza c ao, falta ainda a explica c ao de uma capacidade espec ca que o Matlab possui em realizar opera c oes com vetores, as chamadas opera c oes elemento-a-elemento (elementwise), vistas a seguir. 2.5.2 Opera c oes elemento-a-elemento (eae)
Para multiplicar duas matrizes, e necess ario que as as dimens oes sejam compat veis, como no exemplo A(35) B(51) = C(31) . O leitor pode conferir que o n umero de colunas da matriz ` a esquerda (A) e igual ao n umero de linhas da matriz ` a direita (B ), satisfazendo a condi c ao para a multiplica c ao entre matrizes. Por outro lado, n ao e possivel realizar a multiplica c ao de duas matrizes com mesma dimens ao m n, com m = n, como por exemplo (m = 5 e n = 3) A(53) B(53) = ?? Imposs vel !
Outra coisa imposs vel de se fazer e a divis ao de uma matriz por outra, n ao importando quais sejam as dimens oes A(mn) = ?? B(pq) Imposs vel !
Esta opera c ao causa graves problemas de sa ude em professores quando alunos insistem em realiz a-la. Contudo, para matrizes que possuam as mesmas dimens oes, digamos m n, e poss vel denir o que se chama de opera c ao elemento-a-elemento (eae), incluindo a multiplica c ao-eae e divis ao-eae. Para que isso funcione, no Matlab, basta voc e fazer o seguinte: use o sinal de ponto do lado esquerdo da opera c ao desejada (sem espa co entre os s mbolos). Multiplica c ao-eae
>> A = B .* C
Divis ao-eae
>> A = B ./ C
Potencia c ao-eae
>> A = B .^ C
Para xar a id eia das opera c oes eae, vale a pena testar os comandos abaixos
>> >> >> >> >> A D F G T = = = = = [3, 4, 5; 1, 6, 3; 2, 2, 2; -1, 1, 2] [2, 0, 4; 0, 1, 6; 4, 1, 0; -1, 0, 7] A .* D D ./ A G .^ A % % % % % inserindo uma nova matriz inserindo uma nova matriz multiplica c~ ao eae divis~ ao eae potencia c~ ao eae
2.5.3
Dado essa grande quantidade de ferramentas eae e os conceitos de discretiza c ao, e poss vel unir esses dois mundos para criar fun c oes (discretizadas) bem complexas no Matlab. Por exemplo, suponha que desejamos criar uma fun c ao polinomial do quinto grau f (x) = 0.1x5 + 40x3 2000x 5 para examinarmos o seu gr aco. Como devemos proceder? Em primeiro lugar devemos denir o dom nio discretizado como o comando linspace 8
que quer dizer o seguinte: o vetor x ter a 100 elementos, onde o primeiro e 20 e o u ltimo e 20, e os intermedi arios est ao igualmente espa cados. Depois deve-se criar o vetor que vai representar a imagem da fun c ao discretizada
>> y = -0.1*(x.^5) + 40*(x.^3) - 2000*(x) - 5;
2.6
Rigorosamente falando, e imposs vel somar uma constante (que e uma matriz um por um, lembra?) a uma matriz qualquer de dimens oes maiores do que um, anal de contas as dimens oes n ao batem. No entanto o Matlab permite este abuso entendendo que se deseja somar a constante a todas as entradas da matriz. Isto funciona para todas as outras opera c oes, tais como subtra c ao, multiplica c ao e divis ao, entre outras. Entretanto, o leitor deve tomar cuidado, pois isso n ao funciona com a potencia c ao. Para vericar esta propriedade, teste os seguintes exemplos
>> >> >> >> A B C D = = = = [1, 5 + 2 * 0.5 2, 1; 0, 1, 2; 1; 3; 0] A A - A
3
3.1
Comandos abordados: help(), linspace(), plot(), sin(), cos() A forma param etrica de uma curva plana pode ser descrita atrav es do seguinte par de fun c oes x = f (t) : (1) y = g (t) onde t e um par ametro real que assume valores em um intervalo [a, b] e f (t) e g (t) s ao fun c oes quaisquer. Quando t = a, o ponto (xa , ya ) = (f (a), g (a)) e o in cio da curva e quando t = b, o ponto (xb , yb ) = (f (b), g (b)) e o nal da curva. Para xar a id eia, examine os seguintes exemplos: 1) 2)
x = t + sin(2t) 1 : y = t + 2 cos(5t) x = cos(t) cos(80t) sin(t)
2 : y = 2 sin(t) sin(80t);
Finalmente, para exibir as curvas acima, s ao necess arios os seguintes comandos abaixo (observe que o coment ario ap os o % n ao necessita ser digitado) Curva 1
>> >> >> >> >> t = linspace(0,10*pi,1001); x = t + 3*sin(2*t); y = t + 5*cos(5*t); figure(1) plot(x,y) % % % % % gera o dom nio discretizado coordenadas x da curva discretizada coordenadas y da curva discretizada aciona uma janela gr afica desenha a curva
Curva 2
>> >> >> >> >> t = linspace(0,5*pi,5001); x = cos(t) - cos(80*t).*sin(t); y = 2*sin(t) - sin(80*t); figure(2) plot(x,y)
O leitor mais corajoso certamente vai mexer nos par ametros das curvas acima para ver o que acontece. Os gr acos resultantes destes comandos podem ser conferidos na Figura 3.1.
10
3.2
O comando b asico para gera c ao de n umeros aleat orios e o rand. Basicamente ele gera uma matriz com n umeros com distribui c ao uniforme [0, 1] (fa ca >> help rand para saber mais). Seguem abaixo alguns exemplos de sua utiliza c ao
>> >> >> >> >> x y A B z = = = = = rand(100,1); rand(1,100); rand(100); rand(50,30); 2*rand(100,1) - 1; % % % % % vetor coluna com 100 numeros aleatorios vetor linha com 100 numeros aleatorios matriz de 100x100 numeros aleatorios matriz de 50x30 numeros aleatorios vetor 100x1 com distr. unif. [-1,1]
` vezes pode ser u As til que o vetor aleat orio gerado seja sempre o mesmo. Para conseguir isso voc e deve xar a semente do gerador de n umeros aleat orios. Primeiramente guarde a semente atual com o comando
>> seed = rand(state); % guarda a semente do gerador
onde seed e uma vari avel qualquer, que pode ter outro nome da sua escolha. Em seguida, xe a semente no gerador com o comando
>> rand(state, seed); % fixa a semente no gerador
para se assegurar que ele vai repetir a mesma seq u encia de n umeros aleat orios. Observe o exemplo abaixo, em que a semente n ao e xada
>> x = rand(100,1); >> y = rand(100,1); >> isequal(x,y) ans = 0 % gera um vetor aleat orio % gera outro vetor aleat orio % verifica se x e y s~ ao iguais
11
Aqui a fun c ao isequal retorna 0 indicando que os vetores x e y s ao diferentes. Por outro, lado verique, atrav es do exemplo abaixo, quando a semente e xada
>> >> >> >> >> seed = rand(state); x = rand(100,1); rand(state,seed); y = rand(100,1); isequal(x,y) % % % % guarda a semente do gerador gera um vetor aleat orio fixa a semente previamente guardada gera outro vetor aleat orio
ans = 1
Aqui a fun c ao isequal retorna 1 indicando que os vetores x e y s ao iguais. Como j a foi dito, isso que signica que sempre que o comando rand(state,seed); for usado, a gera c ao dos n umeros alet orios vai se repetir.
3.3
Vetoriza c ao
3.4
Estat sticas
1. Fun c oes que preservam a dimens ao do argumento; 2. Fun c oes que trazem uma sa da com dimes oes diferentes (em geral menores) em rela ao ao seu argumento; Fun c ao fun1 Argumento escalar vetor matriz (m n) escalar vetor matriz (m n) Resultado escalar vetor matriz (m n) escalar escalar vetor linha (1 n)
fun2
Descri c ao Cosseno de um angulo (em radianos) Seno de um angulo (em radianos) Tangente de um angulo (em radianos) Exponecial na base e Logaritmo natural Raiz quadrada
13